9

特定ののデフォルト/優先アプリケーションを取得しようとしていますIntent。たとえば、ユーザーが2番目のWebブラウザーをインストールしてから、URLを開こうとすると、次のようなダイアログが表示されます。

デフォルトのブラウザセレクタ

次に、ユーザーが[このアクションにデフォルトで使用する]オプションを選択すると、URLが押されたときにダイアログボックスが開かなくなります。

このデフォルトまたは優先アプリ/アクションが何であるかを認識している必要があるアプリケーションに取り組んでいます。どうすればよいですか?現在、以下のコードを使用していますが、getPreferredPackage何も返されません。

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

私は何が間違っているのですか?これも正しいアプローチですか?

4

3 に答える 3

11

まあ、解決策は私が作ったよりもはるかに単純であることがわかりました(これは非常に不十分に文書化されていますが)。次のコードは私の解決策です:

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();
于 2011-12-24T20:28:17.593 に答える
6

以下のメソッドlaunchUrlInDefaultBrowserは、ユーザーの選択クエリを表示せずにURLを起動します。まず、ユーザーのデフォルトのブラウザアプリを見つけて、それを使用してURLを起動しようとします。次に、デフォルトのアプリがなかった場合は、URLを起動するためのすべての有効なアクティビティが一覧表示され、最初のアクティビティが取得されます。アクティビティが起動された場合、メソッドはtrueを返します。それ以外の場合はfalse。

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

OEMが独自のResolverActivity実装を持っている場合があることに注意してください。たとえば、Huaweiにはcom.huawei.android.internal.app.HwResolverActivityがあります。

于 2014-05-23T03:38:59.677 に答える
0

Kitkat AOSPでは、getPreferredPackages()は常に空のリストを返します。以下のソースコード

public List<PackageInfo> getPreferredPackages(int flags) {
    return new ArrayList<PackageInfo>();
}
于 2014-08-27T21:55:46.597 に答える