2016-12-19 2 views
0

現在、私は電話から画像を見ることができるすべての有能なアプリケーションをロードするコードを書いています。Android:正しいアプリケーション名を取得するには?

public static List<String> getAllCapableForFileViewing (Context context, String mimeType) { 
    List<String> packages = new ArrayList<>(); 
    PackageManager pm = context.getPackageManager(); 
    Intent sendIntent = new Intent(); 
    sendIntent.setAction(Intent.ACTION_VIEW); 
    sendIntent.setType(mimeType); 
    List<ResolveInfo> resolveInfoList = context.getPackageManager() 
      .queryIntentActivities(sendIntent, 0); 

    for (ResolveInfo resolveInfo : resolveInfoList) { 
     packages.add(resolveInfo.activityInfo.packageName); 

     System.out.println(resolveInfo.activityInfo.packageName); 
     System.out.println(resolveInfo.activityInfo.applicationInfo.className); 
     System.out.println(resolveInfo.activityInfo.name); 
     System.out.println(""); 
    } 

    return packages; 
} 

すべてのアプリケーションを一覧表示しようとすると、そのうちの1つに2つのセットがリストされています。 WeChat、WeChatモーメント。明らかに、画像を表示するための2つのアクティビティがあります。問題は2つの名前が同じ "WeChat"です。

さらに、たとえそれが渡されたコンテンツを消費することができるが、実際には画像を見るためのアプリケーションではない。ギャラリーアプリケーション。それらを認識する方法はありますか?私はそれが不可能かもしれないことを知っている。

答えて

1

問題は2つの名前が同じ "WeChat"です。

まあ、結局のところ、それはそのアプリの開発者次第です。しかし、ResolveInfolabelResを参照してください。これは、使用する方が優れたラベルである可能性があります(たとえば、<intent-filter>から取得)。

これは偽陰性(ユーザーがそうでない現れることを期待する、すなわち、アプリケーション)につながるかもしれませんがあなたは、using CATEGORY_APP_GALLERYを試して歓迎され、彼らに

を認識するが方法です。

+0

loadLabelメソッドとlabelResの違いは何ですか? – LittleFunny

+0

@LittleFunny:[この 'loadLabel()'](https://developer.android.com/reference/android/content/pm/ResolveInfo.html# loadLabel(android.content.pm.PackageManager))、 'ResolveInfo'で' labelRes'を使うべきです。しかし、 'ResolveInfo'の' loadLabel() 'は、' ActivityInfo'や 'ApplicationInfo'の' loadLabel() 'よりも集中した結果を与えるかもしれません。 – CommonsWare

+0

さて、私はResolveInfoでloadLabelをテストしました。これはlabelResと同じ結果を返しました。最後の質問は、ResolveInfoとActivityInfoとApplicationInfoとの関係です。 ActivityInfo =アクティビティレベル、ApplicationInfo =アプリケーションレベル。 – LittleFunny

関連する問題