Clinton Dsouza
Clinton Dsouza

Reputation: 328

Keep getting this java.lang.ClassCastException

I am developing this application which is supposed to give me information on installed applications on an android Device.when ever i try to run the application i get this error in the logcat.

java.lang.ClassCastException: android.app.Application cannot be cast to com.clinton.p3.AppData

AppData.java

Here is the code :

public class AppData extends Application {
PackageInfo packageInfo;
public PackageInfo getPackageInfo() {
    return packageInfo;
}
public void setPackageInfo(PackageInfo packageInfo) {
    this.packageInfo = packageInfo;
}
}



ApkInfo.java

 public class ApkInfo extends Activity {

TextView appLabel, packageName, version, features;
TextView permissions, andVersion, installed, lastModify, path;
PackageInfo packageInfo;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.apkinfo);

    findViewsById();

    AppData appData = (AppData) getApplicationContext();
    packageInfo = appData.getPackageInfo();

    setValues();

}

private void findViewsById() {
    appLabel = (TextView) findViewById(R.id.applabel);
    packageName = (TextView) findViewById(R.id.package_name);
    version = (TextView) findViewById(R.id.version_name);
    features = (TextView) findViewById(R.id.req_feature);
    permissions = (TextView) findViewById(R.id.req_permission);
    andVersion = (TextView) findViewById(R.id.andversion);
    path = (TextView) findViewById(R.id.path);
    installed = (TextView) findViewById(R.id.insdate);
    lastModify = (TextView) findViewById(R.id.last_modify);
}

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
private void setValues() {
    // APP name
    appLabel.setText(getPackageManager().getApplicationLabel(
            packageInfo.applicationInfo));

    // package name
    packageName.setText(packageInfo.packageName);

    // version name
    version.setText(packageInfo.versionName);

    // target version
    andVersion.setText(Integer
            .toString(packageInfo.applicationInfo.targetSdkVersion));

    // path
    path.setText(packageInfo.applicationInfo.sourceDir);

    // first installation
    installed.setText(setDateFormat(packageInfo.firstInstallTime));

    // last modified
    lastModify.setText(setDateFormat(packageInfo.lastUpdateTime));

    // features
    if (packageInfo.reqFeatures != null)
        features.setText(getFeatures(packageInfo.reqFeatures));
    else
        features.setText("-");

    // uses-permission
    if (packageInfo.requestedPermissions != null)
        permissions
                .setText(getPermissions(packageInfo.requestedPermissions));
    else
        permissions.setText("-");
}

@SuppressLint("SimpleDateFormat")
private String setDateFormat(long time) {
    Date date = new Date(time);
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    String strDate = formatter.format(date);
    return strDate;
}

// Convert string array to comma separated string
private String getPermissions(String[] requestedPermissions) {
    String permission = "";
    for (int i = 0; i < requestedPermissions.length; i++) {
        permission = permission + requestedPermissions[i] + ",\n";
    }
    return permission;
}

// Convert string array to comma separated string
private String getFeatures(FeatureInfo[] reqFeatures) {
    String features = "";
    for (int i = 0; i < reqFeatures.length; i++) {
        features = features + reqFeatures[i] + ",\n";
    }
    return features;
}
}



ApkAdapter.java

public class ApkAdapter extends BaseAdapter {

List<PackageInfo> packageList;
Activity context;
PackageManager packageManager;

public ApkAdapter(Activity context, List<PackageInfo> packageList,
        PackageManager packageManager) {
    super();
    this.context = context;
    this.packageList = packageList;
    this.packageManager = packageManager;
}

private class ViewHolder {
    TextView apkName;
}

public int getCount() {
    return packageList.size();
}

public Object getItem(int position) {
    return packageList.get(position);
}

public long getItemId(int position) {
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    LayoutInflater inflater = context.getLayoutInflater();

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.apklist_item, null);
        holder = new ViewHolder();

        holder.apkName = (TextView) convertView.findViewById(R.id.appname);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    PackageInfo packageInfo = (PackageInfo) getItem(position);
    Drawable appIcon = packageManager
            .getApplicationIcon(packageInfo.applicationInfo);
    String appName = packageManager.getApplicationLabel(
            packageInfo.applicationInfo).toString();
    appIcon.setBounds(0, 0, 40, 40);
    holder.apkName.setCompoundDrawables(appIcon, null, null, null);
    holder.apkName.setCompoundDrawablePadding(15);
    holder.apkName.setText(appName);

    return convertView;
}
}



Apklist.java

public class ApkList extends Activity implements OnItemClickListener {

PackageManager packageManager;
ListView apkList;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.app_list);

    packageManager = getPackageManager();
    List<PackageInfo> packageList = packageManager
            .getInstalledPackages(PackageManager.GET_PERMISSIONS);

    List<PackageInfo> packageList1 = new ArrayList<PackageInfo>();

    /* To filter out System apps */
    for (PackageInfo pi : packageList) {
        boolean b = isSystemPackage(pi);
        if (!b) {
            packageList1.add(pi);
        }
    }
    apkList = (ListView) findViewById(R.id.applist);
    apkList.setAdapter(new ApkAdapter(this, packageList1, packageManager));

    apkList.setOnItemClickListener(this);
}

/**
 * Return whether the given PackgeInfo represents a system package or not.
 * User-installed packages (Market or otherwise) should not be denoted as
 * system packages.
 * 
 * @param pkgInfo
 * @return boolean
 */
private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true
            : false;
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long row) {
    PackageInfo packageInfo = (PackageInfo) parent
            .getItemAtPosition(position);
    AppData appData = (AppData) getApplicationContext();
    appData.setPackageInfo(packageInfo);

    Intent appInfo = new Intent(getApplicationContext(), ApkInfo.class);
    startActivity(appInfo);
}

}   



My manifest

 <activity
        android:name="com.clinton.p3.ApkList"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.clinton.p3.ApkAdapter"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.clinton.p3.ApkInfo"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.clinton.p3.AppData"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>



My logcat

   04-04 11:43:46.933: E/AndroidRuntime(9955): FATAL EXCEPTION: main
04-04 11:43:46.933: E/AndroidRuntime(9955): Process: com.clinton.p3, PID: 9955
04-04 11:43:46.933: E/AndroidRuntime(9955): java.lang.ClassCastException: android.app.Application cannot be cast to com.clinton.p3.AppData
04-04 11:43:46.933: E/AndroidRuntime(9955):     at com.clinton.p3.ApkList.onItemClick(ApkList.java:64)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.widget.AbsListView$3.run(AbsListView.java:3638)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.os.Handler.handleCallback(Handler.java:733)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.os.Looper.loop(Looper.java:136)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at android.app.ActivityThread.main(ActivityThread.java:5081)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at java.lang.reflect.Method.invokeNative(Native Method)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at java.lang.reflect.Method.invoke(Method.java:515)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
04-04 11:43:46.933: E/AndroidRuntime(9955):     at dalvik.system.NativeStart.main(Native Method)

Upvotes: 0

Views: 198

Answers (2)

Raghunandan
Raghunandan

Reputation: 133570

Quoting docs

Application class

Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml's <application> tag, which will cause that class to be instantiated for you when the process for your application/package is created.

Instead of this

<activity
    android:name="com.clinton.p3.AppData"

Move the attribute

<application
android:name="com.clinton.p3.AppData"

to the application element in the manifest coz you have

public class AppData extends Application {

<activity> is meant to declare Activities

Upvotes: 1

Rethinavel
Rethinavel

Reputation: 3952

Your AppData class extending application. It should be defined in the application attribute in the manifest file. Not as activity.

Class AppData extends Application

Try this,

 <application
    android:name="com.clinton.p3.AppData"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
    <activity
        android:name="com.clinton.p3.ApkList"
        android:label="@string/title_activity_main"
        android:screenOrientation="landscape"
      >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
    android:name="com.clinton.p3.ApkAdapter"
    android:label="@string/app_name"
    android:screenOrientation="portrait" >
</activity>
<activity
    android:name="com.clinton.p3.ApkInfo"
    android:label="@string/app_name"
    android:screenOrientation="portrait" >
</activity>

Upvotes: 1

Related Questions