2011-02-01 9 views
5

Sto usando resolveActivityInfo per determinare se la mia applicazione è stata impostata come un lanciatore di casa:problema con la risoluzione di attività per un intento - 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(); 

funziona benissimo su emulatore e tre i dispositivi Android che hanno sulle mani .

Recentemente ho iniziato a ricevere segnalazioni di errore dai miei utenti e il registro degli errori mostra che resolveActivityInfo ha esito negativo. Questo succede solo su alcuni telefoni che funzionano su Android 2.1 Update 1, come posso vedere. Ho ricevuto già molti commenti positivi sulla mia app e alcuni negativi a causa di questo problema.

Qualche consiglio che cosa potrebbe essere sbagliato?

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 particolare eccezione sei encounteri ng non sembra provenire dal tuo codice. Forse è una ROM modded buggy che alcune persone stanno usando. – CommonsWare

+2

grazie per la risposta! Ora ho più rapporti, un po 'più di 30 negli ultimi due giorni, tutti provenienti da telefoni Samsung di diversi gestori e tutti in esecuzione su Android 2.1-update1. Ma ho anche 5 stelle dagli utenti che usano gli stessi modelli di telefono e funzionano con 2.1 ... vai a capire ... – mishkin

risposta

1

ha fatto qualche ricerca con la fonte di Android e tendo a concordare ora con Commonsware che il mio codice è giusto. Io in realtà riprogettai 3 settimane fa da usare al posto di 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); 
    } 

Non ha aiutato in modo ancora ricevendo questi errori di tanto in tanto ...

Sulla base del codice sorgente,

ComponentName Intent.resolveActivity (PackageManager pm)

o

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

chiamata lo stesso metodo definito nella classe android.app.ContextImpl:

ResolveInfo info = pm.resolveActivity (questo, PackageManager.MATCH_DEFAULT_ONLY)

ed è definita come:

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

quindi a questo punto sono arrivato a conclusione che non posso fare nulla di questo :(

+0

Sto vedendo lo stesso problema e ho raggiunto la stessa conclusione. Hai segnalato a Google? –

+0

Non penso che dovremmo incolpare google - questo codice funziona bene in emulatore e ho provato tutte le versioni di API. quindi deve essere qualcosa con firmware produttore. – mishkin

+0

Questo problema si verifica anche su Nexus7: 'PackageManager manager = context.getPackageManager(); Elenco attività = manager.queryIntentActivities (intent, 0); ' –

4

Kevin Bobina di Tesla Software qui. Scusa per il ritardo nel rimettermi in contatto con te. Questo è quello che sto usando per ottenere il componente di casa nel mio apps:

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 non restituire null, come sembra di tornare all'attività resolver se non v'è nessun valore di default. Ma su alcuni telefoni o qualcosa potrebbe restituire null solo per mantenere le cose interessanti. Forse resolveActivityInfo chiama resolveActivity ma non gestisce correttamente la null case.

+0

grazie Kevin! intent.resolveActivity è praticamente uguale all'intento.resolveActivityInfo e l'errore si verifica all'interno di questi metodi, quindi non posso controllare il risultato su null, poiché fallisce prima. Ora sto usando per 3 settimane pm.resolveActivity (homeintent, PackageManager.MATCH_DEFAULT_ONLY), ma ho comunque ricevuto alcuni errori del genere ogni giorno dai telefoni che girano su 2.1. Immagino sia un bug in un firmware non mio – mishkin

Problemi correlati