2011-07-24 4 views
2

J'ai deux applications qui dépendent l'une de l'autre et je veux maintenant mettre en œuvre un test pour savoir si toutes les intentions requises sont disponibles.PackageManager queryIntentActivities renvoie la liste vide malgré la correspondance

J'ai utilisé la mise en œuvre générale du blog Développeurs Android:

http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html

public static boolean isIntentAvailable(Context context, String action) { 
    final PackageManager packageManager = context.getPackageManager(); 
    final Intent intent = new Intent(action); 
    intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); // ADDED BY ME 
    List<ResolveInfo> list = 
      packageManager.queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY); 

    return list.size() > 0; 
} 

le manifeste pour la deuxième application (que je vérifie pour) contient l'activité suivante:

<activity android:name="MyPackageMyAction" android:exported="true" android:enabled="true"> 
     <intent-filter android:label="License"> 
     <action android:name="com.mypackage.action.myaction"/> 
     <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

et je le vérifie avec

booléen disponible = isIntentAvailable (this, "com.mypackage.action.myaction");

La sortie du journal contient ceci:

VERBOSE/IntentResolver(59): Resolving type null scheme null of intent Intent { act=com.mypackage.action.myaction flg=0x8 } 
VERBOSE/IntentResolver(59): Action list: [ActivityIntentInfo{440482c0 com.mypackage.action.myaction}] 
VERBOSE/IntentResolver(59): Matching against filter ActivityIntentInfo{440482c0 com.mypackage.action.myaction} 
VERBOSE/IntentResolver(59): Filter matched! match=0x108000 
VERBOSE/IntentResolver(59): Final result list: 

, je suppose normalement qui retourne isIntentAvailable vrai si la seconde application est installée. Toutefois, la liste renvoyée par queryIntentActivities est toujours vide.

Qu'est-ce que je fais mal?

+0

Est-ce votre seule activité dans l'application? –

+0

Oui, c'est la seule activité. – alibi

Répondre

0

Si vous dites que c'est la seule activité only de sorte que la catégorie doit être LAUNCHER

<activity android:name="MyPackageMyAction" android:exported="true" android:enabled="true"> 
     <intent-filter android:label="License"> 
     <action android:name="com.mypackage.action.myaction"/> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Ici aussi, vous pouvez trouver plus sur Intent http://developer.android.com/reference/android/content/Intent.html#CATEGORY_LAUNCHER

+0

Ok, mais si je ne veux pas qu'il apparaisse dans le Launcher? Je ne peux pas l'avoir en arrière-plan comme une sorte d'application de bibliothèque? – alibi

+0

Le vous devriez faire fonctionner votre application en tant que 'Service' http://developer.android.com/guide/topics/fundamentals/services.html –

+0

Ok, j'ai essayé et j'ai toujours une liste vide. Le filtre correspond à – alibi

1

Ok, je me sens très stupide maintenant. Après avoir joué avec ce problème pendant environ un jour, j'ai trouvé le problème.

Tout a été enregistré correctement et aurait dû fonctionner parfaitement, si je n'étais pas si stupide :-). L'application qui reçoit l'intention est une clé de licence et est censée être cachée du lanceur. Par conséquent j'ai eu cette ligne dans mon application:

pkgMgr.setApplicationEnabledSetting(PACKAGE_NAME, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

Après l'avoir enlevé, tout a fonctionné immédiatement. Merci de votre soutien!

+1

Veuillez marquer votre réponse comme correcte. –

Questions connexes