2011-02-01 10 views
5

estoy usando resolveActivityInfo para determinar si mi aplicación se establece como un lanzador de casa:problema con la resolución de la actividad de una intención - 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(); 

funciona muy bien en el emulador y tres dispositivos android tengo en las manos .

Recientemente comencé a recibir informes de errores de mis usuarios y el registro de errores muestra que resolveActivityInfo está fallando. Esto sucede solo en algunos teléfonos que se ejecutan en la actualización 1 de Android 2.1, como puedo ver. Ya recibí muchos comentarios positivos en mi aplicación y algunos negativos debido a este problema.

¿Algún consejo que podría estar mal?

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) 

O

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

La excepción en particular que son encounteri ng no parece ser de su código. Tal vez es una ROM modificada con errores que algunas personas están usando. – CommonsWare

+2

gracias por la respuesta! Tengo más informes ahora, un poco más de 30 en los últimos dos días, todos provienen de teléfonos Samsung de diferentes proveedores y todos se ejecutan en Android 2.1-update1. Pero también tengo una tarifa de 5 estrellas de usuarios que usan los mismos modelos de teléfono y también funcionan con 2.1 ... vaya figura ... – mishkin

Respuesta

1

investigamos un poco con la fuente de Android y ahora estoy de acuerdo con Commonsware en que mi código es correcto. De hecho, me rediseñé Hace 3 semanas de usar packagemanager.resolveActivity en lugar de 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); 
    } 

no ayudó por lo que sigue recibiendo estos errores de vez en cuando ...

Basado en el código fuente,

ComponentName Intent.resolveActivity (PackageManager pm)

o

ActivityInfo Intent.resolveActivityI NFO (pm PackageManager, int flags)

llamada el mismo método definido en la clase android.app.ContextImpl:

información ResolveInfo = pm.resolveActivity (esto, PackageManager.MATCH_DEFAULT_ONLY)

y se define como:

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

lo que en este punto que llegué a la conclusión de que no puedo hacer nada al respecto :(

+0

Estoy viendo el mismo problema y he llegado a la misma conclusión. ¿Reportó a Google? –

+0

No creo que debamos culpar a Google: este código funciona bien en el emulador y probé todas las versiones de API. por lo que debe ser algo con firmware de fabricantes. – mishkin

+0

Este problema también ocurre en Nexus7: 'PackageManager manager = context.getPackageManager(); List activities = manager.queryIntentActivities (intento, 0); ' –

4

Kevin de TeslaCoil Software aquí. Perdón por la tardanza en contactarte. Esto es lo que estoy usando para obtener el componente principal en mis aplicaciones:

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 normalmente no devolverá un valor nulo, ya que parece que vuelve la actividad de resolución si no hay un conjunto predeterminado. Pero en algunos teléfonos o algo puede volverse nulo solo para mantener las cosas interesantes. Quizás resolveActivityInfo llama a resolveActivity pero no maneja el caso nulo correctamente.

+0

gracias Kevin! intent.resolveActivity es prácticamente igual a la intención.resolveActivityInfo y el error ocurre dentro de estos métodos, por lo que no puedo verificar el resultado en nulo, ya que falla antes de eso. Ahora estoy usando durante 3 semanas pm.resolveActivity (homeintent, PackageManager.MATCH_DEFAULT_ONLY) en su lugar, pero todavía recibo algunos errores como ese todos los días en teléfonos con 2.1. Supongo que es un error en un firmware no mío – mishkin

Cuestiones relacionadas