2013-04-02 50 views
3

我想让一个应用程序给出已安装的应用程序的列表,当一个项目被点击时,启动另一个活动,说明安装的应用程序所需的权限。我得到了安装的应用程序列表,但是当我点击任何应用程序而不是开始新的活动时,应用程序关闭。已安装的应用程序的列表强制关闭:java.lang.ClassCastException

MainActivity

package com.example.appslist; 

import java.util.List; 
import com.example.appslist.adapter.ApkAdapter; 
import com.example.appslist.app.AppData; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 


public class ApkListActivity extends Activity implements OnItemClickListener { 

    PackageManager packageManager; 


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

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

     ListView mylistview= (ListView) findViewById(android.R.id.list); 
     mylistview.setAdapter(new ApkAdapter(this, packageList, packageManager)); 



     mylistview.setOnItemClickListener(this); 
    } 

    @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); 
    } 
} 

logcat的

04-02 11:16:04.536: E/asset(2777): MAS: getAppPckgAndVerCode package: com.example.appslist === version 1 
04-02 11:16:04.559: D/dalvikvm(2777): Trying to load lib lib_glossary.so 0x0 
04-02 11:16:04.559: I/dalvikvm(2777): Unable to dlopen(lib_glossary.so): Cannot load library: load_library[1083]: Library 'lib_glossary.so' not found 
04-02 11:16:04.567: E/MBGlossaryManager(2777): lib_glossary.so can't be loaded 
04-02 11:16:04.700: E/asset(2777): MAS: getAppPckgAndVerCode package: com.google.android.location === version 8 
04-02 11:16:04.708: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.launcher === version 8 
04-02 11:16:04.708: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.defcontainer === version 8 
04-02 11:16:04.708: E/asset(2777): MAS: getAppPckgAndVerCode package: com.navngo.igo.javaclient === version 148360 
04-02 11:16:04.715: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.contacts === version 8 
04-02 11:16:04.723: E/asset(2777): MAS: getAppPckgAndVerCode package: com.arcsoft.photoworkshop === version 5 
04-02 11:16:04.778: D/dalvikvm(2777): GC_EXTERNAL_ALLOC freed 822 objects/60704 bytes in 56ms 
04-02 11:16:04.786: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.phone === version 8 
04-02 11:16:04.794: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.calculator2 === version 8 
04-02 11:16:04.794: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.htmlviewer === version 8 
04-02 11:16:04.801: E/asset(2777): MAS: getAppPckgAndVerCode package: com.example.myfirstapp === version 1 
04-02 11:16:04.801: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.providers.calendar === version 8 
04-02 11:16:04.809: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.bluetooth === version 8 
04-02 11:16:04.809: E/asset(2777): MAS: getAppPckgAndVerCode package: com.example.sessionmanagement === version 1 
04-02 11:16:04.817: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.calendar === version 8 
04-02 11:16:04.817: E/asset(2777): MAS: getAppPckgAndVerCode package: com.google.android.location === version 8 
04-02 11:16:04.817: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.launcher === version 8 
04-02 11:16:04.825: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.defcontainer === version 8 
04-02 11:16:04.825: E/asset(2777): MAS: getAppPckgAndVerCode package: com.navngo.igo.javaclient === version 148360 
04-02 11:16:04.872: E/asset(2777): MAS: getAppPckgAndVerCode package: com.android.contacts === version 8 
04-02 11:16:06.536: D/AndroidRuntime(2777): Shutting down VM 
04-02 11:16:06.536: W/dalvikvm(2777): threadid=1: thread exiting with uncaught exception (group=0x400207e0) 
04-02 11:16:06.551: E/AndroidRuntime(2777): FATAL EXCEPTION: main 
04-02 11:16:06.551: E/AndroidRuntime(2777): java.lang.ClassCastException: android.app.Application 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at com.example.appslist.ApkListActivity.onItemClick(ApkListActivity.java:44) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at android.widget.ListView.performItemClick(ListView.java:3444) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at android.os.Handler.handleCallback(Handler.java:587) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at android.os.Looper.loop(Looper.java:143) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at android.app.ActivityThread.main(ActivityThread.java:4717) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
04-02 11:16:06.551: E/AndroidRuntime(2777):  at dalvik.system.NativeStart.main(Native Method) 
04-02 11:16:08.137: I/Process(2777): Sending signal. PID: 2777 SIG: 9 

我不能理解为强制关闭的原因。请帮助

AppData.java

package com.example.appslist.app; 

import android.app.Application; 
import android.content.pm.PackageInfo; 

public class AppData extends Application { 

    PackageInfo packageInfo; 

    public PackageInfo getPackageInfo() { 
     return packageInfo; 
    } 

    public void setPackageInfo(PackageInfo packageInfo) { 
     this.packageInfo = packageInfo; 
    } 
} 

ApkAdapter.java

package com.example.appslist.adapter; 

import java.util.List; 
import com.example.appslist.R; 
import android.app.Activity; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

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; 
    } 

} 

清单文件

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.appslist" 
    android:versionCode="1" 
    android:versionName="1.0" > 
<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    > 

    <activity 
     android:name="com.example.appslist.ApkListActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".ApkInfo" 
     android:label="@string/title_activity_apk_info" > 
    </activity> 
</application> 

+0

什么是应用程序数据类? –

+0

@ankita gahoi:我已经添加了两个类在主.check – Prax

+0

@Prax检查我的回答 – Pragnani

回答

1

编辑:

看来你还没有注册应用程序数据的清单

尝试在该清单中的应用程序标记添加

android:name=".AppData" 

即此

<application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     android:name=".AppData" 
     > 

错误是在这一行

AppData appData = (AppData) getApplicationContext(); 

改变,要

AppData appData = (AppData) getApplication(); 
+0

雅我改变了,仍然在列表收盘项点击力:( – Prax

+0

@Prax但你不会得到同样的错误,这将解决您的本期 – Pragnani

+0

@Prax可能会有新的问题让我知道 – Pragnani

0

这导致了问题:

PackageInfo packageInfo = (PackageInfo) parent.getItemAtPosition(position);

你想投出不同对象PackageInfo支票返回PackageInfo为返回类型,以避免这种不同的方法。

编辑:

尝试,

PackageInfo packageInfo = (PackageInfo) parent.getItemAtPosition(position).getClass().getPackage();

,而不是,我只是检查它的视图对象。

+0

谢谢,我会试试。 – Prax

+0

它说:“不能从包到PackageInfo投” – Prax

+0

然后你必须寻找一些getter的'packageInfo' – Prateek

0

问题是与你的清单应用程序文件。

android:name="com.ibc.android.demo.appslist.app.AppData" 

取代你的下面一行以下行

android:name="com.ibc.android.demo.appslist.activity.AppData" 

希望这会帮助你。

1

你定义了一个名为AppData的新类,那么你怎么能投)通过getApplicationContext(返回一个对象,它是不是应用程序数据来AppData的一个实例?

例如,

class A{} 

class B extends from A{} 

class C extends from A{} 

A foo(){ 
    return new C(); 
} 

B b = (B)foo(); 

这肯定会导致ClassCastException异常,因为C型的对象不是B的一个实例

我想你只需要一些信息发送到ApkInfo.class ,那你为什么不使用捆绑包?

Bundle bundle = new Bundle(); 
bundle.putString("key", "data"); 
bundle.putString("key2", "data2"); 
intent.setClass(...) 
intent.putExtras(bundle); 
startActivity(intent); 

更新:

然后你就可以让你存储在目标活动的信息:

@Override 
public void onCreate(...){ 
    Bundle bundle = getIntent().getExtras(); 
    bundle.getString("key"); 
} 
+0

你能详细解释我应该怎么做,在这种情况下?我是Android新手。谢谢 – Prax

+0

我已经更新了答案,现在清楚了吗? @Prax – StarPinkER

+0

我试过这个,但是显示错误,我仍然卡住了这个:( – Prax