2011-02-01 67 views
5

我使用resolveActivityInfo,以确定是否我的应用程序被设置为家启动:问题与解决活动的意图 - resolveActivityInfo()

PackageManager pm = getPackageManager(); 

    Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_HOME); 

    userHomePackage = intent.resolveActivityInfo(pm, 0).packageName; 
    userHomeActivityClass = intent.resolveActivityInfo(pm, 0).name;  
currentHomeLauncherName = intent.resolveActivityInfo(pm, 0).loadLabel(pm).toString(); 

它在模拟器的伟大工程和三个Android设备我有手。

最近我开始从我的用户获取错误报告,错误日志显示resolveActivityInfo失败。我只能看到在Android 2.1 update 1上运行的几部手机。我收到了很多对我的应用程序的正面评论,并且因为这个问题而收到了一些负面评论。

有什么建议可能是错的?

java.lang.NullPointerException 
    at android.os.Parcel.readException(Parcel.java:1224) 
    at android.os.Parcel.readException(Parcel.java:1206) 
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418) 
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046) 
    at android.content.Intent.resolveActivityInfo(Intent.java:3790) 
    at com.myapp.myappname.Launcher.setAsHomeApplicationBeforeFroyo(Launcher.java:336) 

OR

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myappname/com.myapp.myappname.Launcher}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2497) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2513) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1864) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4370) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.os.Parcel.readException(Parcel.java:1224) 
    at android.os.Parcel.readException(Parcel.java:1206) 
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418) 
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046) 
    at android.content.Intent.resolveActivityInfo(Intent.java:3790) 
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141) 
    at com.myapp.myappname.Launcher.showNextActivity(Launcher.java:122) 
    at com.myapp.myappname.Launcher.onCreate(Launcher.java:59) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460) 
    ... 11 more 
java.lang.NullPointerException 
    at android.os.Parcel.readException(Parcel.java:1224) 
    at android.os.Parcel.readException(Parcel.java:1206) 
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418) 
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046) 
    at android.content.Intent.resolveActivityInfo(Intent.java:3790) 
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141) 
+2

的特定异常你encounteri ng似乎不是来自您的代码。也许这是一些人正在使用的一种有问题的ROM。 – CommonsWare 2011-02-02 18:02:32

+2

感谢您的回应!我现在有更多的报道 - 过去两天有30多个 - 它们都来自不同运营商的三星手机,并且都运行在android 2.1-update1上。但我也有使用相同的手机型号和运行在2.1的用户5星级的速度...去图... – mishkin 2011-02-03 23:19:35

回答

1

做了一些与android源的研究,我倾向于同意Commonsware,我的代码是正确的。其实我重新设计了它3个星期前使用packagemanager.resolveActivity代替intent.resolveactivity:

this.pm = context.getPackageManager(); 

    try { 
     Intent homeintent = new Intent(Intent.ACTION_MAIN); 
     homeintent.addCategory(Intent.CATEGORY_HOME); 
     homeintent.addCategory(Intent.CATEGORY_DEFAULT);// seems not needed here since This is a synonym for 
           // including 
     // the CATEGORY_DEFAULT in your supplied Intent per doc 

     this.resolveInfo = pm.resolveActivity(homeintent, PackageManager.MATCH_DEFAULT_ONLY); 

     ActivityInfo activityInfo = resolveInfo.activityInfo; 

     userHomeLauncherPackage = activityInfo.packageName; 
     userHomeLauncherClass = activityInfo.name; 

     userHomeLauncherName = activityInfo.loadLabel(pm).toString(); 

     if (userHomeLauncherClass.contains("ResolverActivity")) 
     userHomeLauncherName = ""; 

    } catch (Exception e) { 
     throw new Exception(e); 
    } 

它并没有帮助,以便仍然得到这些错误偶尔...

基于源代码,

组件名Intent.resolveActivity(PackageManager PM)

ActivityInfo Intent.resolveActivityI NFO(PackageManager时,INT标志)

呼叫android.app.ContextImpl类中定义的同样的方法:

ResolveInfo信息= pm.resolveActivity(此,PackageManager.MATCH_DEFAULT_ONLY)

并且它被定义像:

 @Override 
    public ResolveInfo resolveActivity(Intent intent, int flags) { 
     try { 
      return mPM.resolveIntent(
       intent, 
       intent.resolveTypeIfNeeded(mContext.getContentResolver()), 
       flags); 
     } catch (RemoteException e) { 
      throw new RuntimeException("Package manager has died", e); 
     } 
    } 

所以在这一点上,我来到了结论,我不能做这个东西:(

4

凯文从特斯拉线圈软件在这里。对不起,迟到回到你身边。这是我用什么来获取家庭成分在我的应用程序:

public static ComponentName getHomeComponent(PackageManager PM) { 
    Intent home_intent = new Intent("android.intent.action.MAIN"); 
    home_intent.addCategory("android.intent.category.HOME"); 
    home_intent.addCategory("android.intent.category.DEFAULT"); 

    ComponentName cn = home_intent.resolveActivity(PM); 
    if (cn == null) 
     Log.v(TAG, "[Default] package:null"); 
    else 
     Log.v(TAG, "[Default] package:" + cn.getPackageName() + " class:" + cn.getClassName()); 

    return cn; 
} 

resolveActivity无法正常返回null,因为它似乎返回解析器活动如果没有默认设置。但是在某些手机或某些情况下,它可能会返回null以保持有趣。也许resolveActivityInfo调用resolveActivity,但不能正确处理空格。

+0

谢谢凯文! intent.resolveActivity与intent完全相同。resolveActivityInfo和错误发生在这些方法内部,所以我无法检查null上的结果,因为它在此之前失败。我现在使用了3周的pm.resolveActivity(homeintent,PackageManager.MATCH_DEFAULT_ONLY),但仍然每天都会从2.1版本的手机中获得类似的错误。我想这是一个固件不是我的错误 – mishkin 2011-02-19 17:56:08