Как исключить мою собственную активность из средства выбора Activity.startActivity (Intent)? - PullRequest
11 голосов
/ 18 октября 2010

Мое приложение работает с картинками. Он может принимать несколько изображений в качестве входных данных, обрабатывать их и отправлять снова в другое приложение.

Как следствие, мой основной Activity объявил фильтр намерений на ACTION_SEND_MULTIPLE для image/* mimetypes и может привести к выдаче нового Intent с тем же действием и типом данных, используя Activity.startActivity(Intent).

Есть ли способ исключить мою собственную активность из списка приложений, который отображается пользователю после вызова startActivity()?

Ответы [ 2 ]

7 голосов
/ 18 октября 2010

Не напрямую, AFAIK.Однако вы можете создать свой собственный выбор, используя PackageManager и queryIntentActivityOptions(), что позволяет отфильтровывать себя (или другие вещи).

0 голосов
/ 09 ноября 2018

Что вам нужно сделать, это:

Запрос доступных приложений для обработки намерения.

  • Если есть действие по умолчанию для его обработки, которое не принадлежит вашему приложению, откройте его напрямую (используя startActivity()).
  • В противном случае отобразите средство выбора намерений, исключая пакет вашего собственного приложения. Поэтому, даже если ваше приложение установлено в качестве приложения по умолчанию для обработки таких намерений, программа выбора все равно будет отображаться, что вам и нужно.

Вот сообщение в блоге , объясняющее его более подробно.

Или скопируйте и вставьте код напрямую:


/**
 * Attempts to start an activity to handle the given intent, excluding activities of this app.
 * <ul>
 *     <li>If the user has set a default activity (which does not belong in this app's package), it is opened without prompt.</li>
 *     <li>Otherwise, an intent chooser is displayed that excludes activities of this app's package.</li>
 * </ul>
 *
 * @param context context
 * @param intent intent to open
 * @param chooserTitle the title that will be displayed for the intent chooser in case one needs to be displayed.
 */
static void startActivityExcludingOwnApp(@NonNull Context context, @NonNull Intent intent, @NonNull String chooserTitle) {

    PackageManager packageManager = context.getPackageManager();
    List<Intent> possibleIntents = new ArrayList<>();

    Set<String> possiblePackageNames = new HashSet<>();
    for (ResolveInfo resolveInfo : packageManager.queryIntentActivities(intent, 0)) {

        String packageName = resolveInfo.activityInfo.packageName;
        if (!packageName.equals(context.getPackageName())) {

            Intent possibleIntent = new Intent(intent);
            possibleIntent.setPackage(resolveInfo.activityInfo.packageName);
            possiblePackageNames.add(resolveInfo.activityInfo.packageName);

            possibleIntents.add(possibleIntent);
        }
    }

    @Nullable ResolveInfo defaultResolveInfo = packageManager.resolveActivity(intent, 0);

    if (defaultResolveInfo == null || possiblePackageNames.isEmpty()) {
        throw new ActivityNotFoundException();
    }

    // If there is a default app to handle the intent (which is not this app), use it.
    if (possiblePackageNames.contains(defaultResolveInfo.activityInfo.packageName)) {
        context.startActivity(intent);
    }
    else { // Otherwise, let the user choose.
        Intent intentChooser = Intent.createChooser(possibleIntents.remove(0), chooserTitle);
        intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, possibleIntents.toArray(new Parcelable[]{}));
        context.startActivity(intentChooser);
    }
}
...