如何确定用户使用默认的startActivity(intent)选择器选择的应用程序?

时间:2015-12-16 19:31:30

标签: android android-intent start-activity startactivityforresult

我正在尝试确定用户在点击我的应用中的路线按钮时选择的应用。我想要" Always"和#34;只是一次"默认选择器的选项,但我需要知道用户被发送到哪个应用程序,这就是我发现自己创建自定义选择器的原因。我已对SO进行了研究,并发现了以下帖子:

自定义选择器,让我知道用户选择的应用:https://stackoverflow.com/a/23494967/3957979

ActionProvider(在我的情况下不起作用,因为它不是MenuItem): https://stackoverflow.com/a/23495696/3957979

任何人都知道如何做到这一点?如果有办法使用默认选择器并仍然确定用户选择的应用程序,请告诉我。否则,请告诉我是否有办法整合" Always"和#34;只是一次"选项到自定义选择器。

以下是我正在实施的代码:

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

1 个答案:

答案 0 :(得分:2)

  

如果有办法使用默认选择器并仍然确定用户选择的应用程序,请告诉我。

minSdkVersion设置为22,然后使用the three-parameter flavor of createChooser()。请注意,这不允许您更改有关用户选择的任何内容(例如,替换其他Intent);它只是让你有机会找到选择。

或者,如果您不想将minSdkVersion设置为22,请在API Level 22以上设备上使用createChooser()的三参数风格,并对旧版设备执行其他操作(自定义选择器) ,没有选择信息等等。)。

  

否则,如果有办法将“Always”和“Just Once”选项集成到自定义选择器中,请告诉我。

不,这是不可能的。