如何确定用户使用默认的 startActivity(intent) 选择器选择了哪个应用程序?
How to determine which app the user selects with the default startActivity(intent) chooser?
我试图确定用户在我的应用程序中单击路线按钮时选择的应用程序。我想要默认选择器的 "Always" 和 "Just Once" 选项,但我需要知道用户被发送到哪个应用程序,这就是我发现自己创建自定义选择器的原因。我已经对 SO 进行了研究并且遇到了以下帖子:
自定义选择器让我知道用户选择了什么应用程序:
ActionProvider(在我的情况下不起作用,因为这不是 MenuItem):
有人知道如何做到这一点吗?如果有办法使用默认选择器并仍然确定用户选择的应用程序,请告诉我。否则,如果有办法将 "Always" 和 "Just Once" 选项集成到自定义选择器中,请告诉我。
下面是我正在执行的代码:
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();
}
Please let me know if there is a way to use the default chooser and still determine the app the user selects.
将 minSdkVersion
设置为 22,然后使用 the three-parameter flavor of createChooser()
。请注意,这不允许您更改有关用户选择的任何内容(例如,替换为不同的 Intent
);它只是让您有机会找出选择。
或者,如果您不想将 minSdkVersion
设置为 22,请在 API 级别 22+ 设备上使用 createChooser()
的三参数风格,然后执行其他操作在旧的(自定义选择器,没有选择信息的情况下生活等)。
Otherwise, please let me know if there is a way to integrate the "Always" and "Just Once" options into a custom chooser.
不,那不可能。
我试图确定用户在我的应用程序中单击路线按钮时选择的应用程序。我想要默认选择器的 "Always" 和 "Just Once" 选项,但我需要知道用户被发送到哪个应用程序,这就是我发现自己创建自定义选择器的原因。我已经对 SO 进行了研究并且遇到了以下帖子:
自定义选择器让我知道用户选择了什么应用程序:
ActionProvider(在我的情况下不起作用,因为这不是 MenuItem):
有人知道如何做到这一点吗?如果有办法使用默认选择器并仍然确定用户选择的应用程序,请告诉我。否则,如果有办法将 "Always" 和 "Just Once" 选项集成到自定义选择器中,请告诉我。
下面是我正在执行的代码:
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();
}
Please let me know if there is a way to use the default chooser and still determine the app the user selects.
将 minSdkVersion
设置为 22,然后使用 the three-parameter flavor of createChooser()
。请注意,这不允许您更改有关用户选择的任何内容(例如,替换为不同的 Intent
);它只是让您有机会找出选择。
或者,如果您不想将 minSdkVersion
设置为 22,请在 API 级别 22+ 设备上使用 createChooser()
的三参数风格,然后执行其他操作在旧的(自定义选择器,没有选择信息的情况下生活等)。
Otherwise, please let me know if there is a way to integrate the "Always" and "Just Once" options into a custom chooser.
不,那不可能。