Получить приложение Preferred / Default на Android - PullRequest
9 голосов
/ 24 декабря 2011

Я пытаюсь получить приложение по умолчанию / предпочитаемое для данного Intent. Например, когда пользователь устанавливает второй веб-браузер, а затем пытается открыть URL, он или она получит диалоговое окно, подобное этому:

default browser selector

Если пользователь затем выбирает для этого действия Использовать по умолчанию , то диалоговое окно больше не открывается при нажатии 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();
        }
    }
}

Что я делаю не так? Это даже правильный подход?

Ответы [ 3 ]

11 голосов
/ 25 декабря 2011

Ну, решение оказалось намного проще, чем я его сделал (хотя это очень плохо документировано). Следующий код является моим решением:

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();
6 голосов
/ 23 мая 2014

Приведенный ниже метод 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.

0 голосов
/ 28 августа 2014

В Kitkat AOSP getPreferredPackages () всегда возвращает пустой список. Исходный код, как показано ниже

public List<PackageInfo> getPreferredPackages(int flags) {
    return new ArrayList<PackageInfo>();
}
...