Obtenez une application préférée / par défaut sur Android

J'essaie d'obtenir la demande par défaut / préférée pour une Intent donnée. Par exemple, lorsque l'utilisateur installe un deuxième navigateur Web, alors tente d'ouvrir une URL, il ou elle obtiendra un dialogue comme celui-ci:

Sélecteur de navigateur par défaut

  • Android WebView à l'intérieur des problèmes d'événement ListView onclick
  • GetActionBar () renvoie null dans PreferenceActivity (AppCompat-v7 21)
  • Erreur java.lang.ClassNotFoundException: com.google.android.gms.maps.MapFragment dans Google Map V2
  • Android Gradle Comment créer pour Android Google API 4.2.2 pas pour Android 4.2.2
  • Changer la structure du fichier de projet après la migration de Eclipse vers Android Studio gradle structure
  • Android 7 Native Crash: libc.so tgkill
  • Si l'utilisateur sélectionne l' option Utiliser par défaut pour cette action , la boîte de dialogue ne s'ouvre plus lorsqu'une URL est pressée.

    Je travaille sur une application qui devrait être au courant de ce que cette application ou action par défaut est préférée . Comment puis-je faire cela? J'utilise actuellement le code ci-dessous, mais getPreferredPackage ne renvoie rien:

     Intent i = (new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com")); PackageManager pm = context.getPackageManager(); final List<ResolveInfo> list = pm.queryIntentActivities(i, 0); IntentFilter ifilter = new IntentFilter(i.getAction()); if (i.getCategories() != null) { for(String category : i.getCategories()) { ifilter.addCategory(category); } } List<IntentFilter> filters = new ArrayList<IntentFilter>(); filters.add(ifilter); List<ComponentName> preferredActivities = new ArrayList<ComponentName>(); pm.getPreferredActivities(filters, preferredActivities, null); for (ComponentName activity : preferredActivities) { for (ResolveInfo rinfo : list) { if (rinfo.activityInfo.applicationInfo.packageName.equals(activity.getPackageName())) { try { final PackageInfo pi = pm.getPackageInfo(activity.getPackageName(), 0); Toast.makeText(context, pm.getApplicationLabel(pi.applicationInfo), Toast.LENGTH_SHORT).show(); } } catch (NameNotFoundException e) { e.printStackTrace(); } } } 

    Qu'est-ce que je fais mal? Est-ce même la bonne approche?

  • Android Studio affiche des erreurs (traduction manquante) après la mise à jour
  • Type Mime pour les fichiers .txt?
  • Android.process.acore s'est arrêté de façon inattendue
  • OnViewCreated - un endroit incorrect pour remplacer le fragment?
  • Le tiroir de navigation semi-transparent sur la barre d'état ne fonctionne pas
  • Comment éviter DEX 64K LIMIT en important la bonne bibliothèque
  • 3 Solutions collect form web for “Obtenez une application préférée / par défaut sur Android”

    Eh bien, la solution s'est révélée beaucoup plus simple que je l'ai fait (bien que cela soit très peu documenté). Le code suivant est ma solution:

     Intent i = (new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com")); PackageManager pm = context.getPackageManager(); final ResolveInfo mInfo = pm.resolveActivity(i, 0); Toast.makeText(context, pm.getApplicationLabel(mInfo.activityInfo.applicationInfo), Toast.LENGTH_LONG).show(); 

    La méthode launchUrlInDefaultBrowser ci-dessous lance une URL sans afficher de requête de sélection pour l'utilisateur. Tout d'abord, il tente de trouver l'application de navigation par défaut de l'utilisateur et lance l'URL avec elle. Deuxièmement, s'il n'y avait pas d'application par défaut, il répertorie toutes les activités capables de lancer l'URL et reprend le premier. Dans le cas où une activité a été lancée, la méthode renvoie true; Sinon, faux.

     boolean launchUrlInDefaultBrowser(Context context, String url) { final Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); browserIntent.setData(Uri.parse(url)); // 1: Try to find the default browser and launch the URL with it final ResolveInfo defaultResolution = context.getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY); if (defaultResolution != null) { final ActivityInfo activity = defaultResolution.activityInfo; if (!activity.name.equals("com.android.internal.app.ResolverActivity")) { browserIntent.setClassName(activity.applicationInfo.packageName, activity.name); context.startActivity(launchIntent); return true; } } // 2: Try to find anything that we can launch the URL with. Pick up the first one that can. final List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(browserIntent, PackageManager.MATCH_DEFAULT_ONLY); if (!resolveInfoList.isEmpty()) { browserIntent.setClassName(resolveInfoList.get(0).activityInfo.packageName, resolveInfoList.get(0).activityInfo.name); context.startActivity(browserIntent); return true; } return false; } 

    Attention, les OEM peuvent avoir leur propre implémentation ResolverActivity. Par exemple, Huawei a com.huawei.android.internal.app.HwResolverActivity.

    Dans Kitkat AOSP, getPreferredPackages () renvoie toujours la liste vide. Code source comme ci-dessous

     public List<PackageInfo> getPreferredPackages(int flags) { return new ArrayList<PackageInfo>(); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.