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

Я пытаюсь определить, какое приложение выбирает пользователь, нажимая кнопку направления в моем приложении. Мне нужны параметры «Всегда» и «Только один раз» для выбора по умолчанию, но мне нужно знать, в какое приложение отправляется пользователь, поэтому я создаю собственный выбор. Я провел исследование SO и наткнулся на следующие сообщения:

Пользовательский селектор, позволяющий мне узнать, какое приложение выбирает пользователь: https://stackoverflow.com/a/23494967/3957979

ActionProvider (в моем случае не работает, так как это не MenuItem): https://stackoverflow.com/a/23495696/3957979

Кто-нибудь знает, как это сделать? Пожалуйста, дайте мне знать, есть ли способ использовать средство выбора по умолчанию и по-прежнему определять приложение, которое выбирает пользователь. В противном случае сообщите мне, есть ли способ интегрировать параметры «Всегда» и «Только один раз» в пользовательское средство выбора.

Ниже приведен код, который я реализую:

public View onCreateView(...) {
    ...
    shiftActionButtonDirections.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = directions(mLatitude, mLongitude, location.getFullAddress());
            // Check if any apps can handle geo intent
            if (intent.resolveActivity(getAppContext().getPackageManager()) != null) {
                showChooser(intent, "Get Directions with...");
            } else {
                Toast.makeText(getAppContext(), R.string.error_maps, Toast.LENGTH_LONG).show();
            }
        }
    });
    ...
}

public Intent directions(String latitude, String longitude, String address) {
    String uri = String.format("geo:%s,%s?q=%s", latitude, longitude, Uri.encode(address));
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    return i;
}

private void showChooser(@NonNull final Intent intent, String title) {
    final List<ResolveInfo> activities = getAppContext().getPackageManager().queryIntentActivities(intent, 0);

    List<String> appNames = new ArrayList<String>();
    for (ResolveInfo info : activities) {
        appNames.add(info.loadLabel(getAppContext().getPackageManager()).toString());
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(TextUtils.isEmpty(title) ? "With..." : title);
    builder.setItems(appNames.toArray(new CharSequence[appNames.size()]), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
            Map<String, Object> properties = new HashMap<>();
            ResolveInfo info = activities.get(item);

            if (info.activityInfo.packageName.contains("google")) {
                // Google Maps was chosen
            } else {
                // Another app was chosen
            }

            // start the selected activity
            intent.setPackage(info.activityInfo.packageName);
            startActivity(intent);
        }
    });

    AlertDialog alert = builder.create();
    alert.show();
}

person Travis Yim    schedule 16.12.2015    source источник


Ответы (1)


Пожалуйста, дайте мне знать, есть ли способ использовать средство выбора по умолчанию и по-прежнему определять приложение, которое выбирает пользователь.

Установите для minSdkVersion значение 22, затем используйте вариант с тремя параметрами createChooser(). Обратите внимание, что это не позволяет вам что-либо изменить в выборе пользователя (например, заменить другой Intent); это просто дает вам шанс узнать выбор.

Или, если вы не хотите устанавливать для minSdkVersion значение 22, используйте трехпараметрический вариант createChooser() на устройствах уровня API 22+ и сделайте что-нибудь еще на более старых устройствах (пользовательский выбор, жить без информации о выборе и т. д.).

В противном случае сообщите мне, есть ли способ интегрировать параметры «Всегда» и «Только один раз» в пользовательское средство выбора.

Нет, это невозможно.

person CommonsWare    schedule 16.12.2015
comment
Спасибо за информацию! - person Travis Yim; 31.12.2015