0

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)
1
  • Can you try cleaning the project and run once again? Commented Apr 4, 2014 at 6:45

2 Answers 2

1

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>

Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.