Android 如何确定用户使用默认startActivity(intent)选择器选择哪个应用程序?
我试图确定用户在单击我的应用程序中的“方向”按钮时选择的应用程序。我想要默认选择器的“始终”和“仅一次”选项,但我需要知道用户被发送到哪个应用程序,这就是我创建自定义选择器的原因。我对SO进行了研究,并发现了以下帖子: 自定义选择器,允许我了解用户选择的应用程序: ActionProvider(在我的情况下不起作用,因为这不是菜单项): 有人知道怎么做吗?请让我知道是否有办法使用默认选择器并仍然确定用户选择的应用程序。否则,请告诉我是否有办法将“始终”和“仅一次”选项集成到自定义选择器中 以下是我正在实施的代码:Android 如何确定用户使用默认startActivity(intent)选择器选择哪个应用程序?,android,android-intent,start-activity,startactivityforresult,Android,Android Intent,Start Activity,Startactivityforresult,我试图确定用户在单击我的应用程序中的“方向”按钮时选择的应用程序。我想要默认选择器的“始终”和“仅一次”选项,但我需要知道用户被发送到哪个应用程序,这就是我创建自定义选择器的原因。我对SO进行了研究,并发现了以下帖子: 自定义选择器,允许我了解用户选择的应用程序: ActionProvider(在我的情况下不起作用,因为这不是菜单项): 有人知道怎么做吗?请让我知道是否有办法使用默认选择器并仍然确定用户选择的应用程序。否则,请告诉我是否有办法将“始终”和“仅一次”选项集成到自定义选择器中 以下
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();
}
创建视图(…)上的公共视图{
...
shiftActionButtonDirections.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向=方向(mLatitude、mLongitude、location.getFullAddress());
//检查是否有任何应用程序可以处理地理意图
if(intent.resolveActivity(getAppContext().getPackageManager())!=null){
showChooser(意图,“使用…获取方向”);
}否则{
Toast.makeText(getAppContext(),R.string.error_映射,Toast.LENGTH_LONG.show();
}
}
});
...
}
公共意图方向(字符串纬度、字符串经度、字符串地址){
字符串uri=String.format(“地理位置:%s,%s?q=%s”,纬度,经度,uri.encode(地址));
Intent i=新的Intent(Intent.ACTION_视图,Uri.parse(Uri));
i、 设置标志(意图、标志、活动、新任务);
返回i;
}
私有void showChooser(@NonNull最终意图,字符串标题){
最终列表活动=getAppContext().getPackageManager().QueryInputActivities(意图,0);
List appNames=new ArrayList();
用于(ResolveInfo:activities){
add(info.loadLabel(getAppContext().getPackageManager()).toString());
}
AlertDialog.Builder=新建AlertDialog.Builder(getActivity());
builder.setTitle(TextUtils.isEmpty(title)?“带…”:title);
setItems(appNames.toArray(新的字符序列[appNames.size()]),新的DialogInterface.OnClickListener(){
公共void onClick(对话框接口对话框,int项){
映射属性=新的HashMap();
ResolveInfo=activities.get(项目);
if(info.activityInfo.packageName.contains(“谷歌”)){
//谷歌地图被选中
}否则{
//选择了另一个应用程序
}
//启动所选活动
intent.setPackage(info.activityInfo.packageName);
星触觉(意向);
}
});
AlertDialog alert=builder.create();
alert.show();
}
请让我知道是否有办法使用默认选择器并仍然确定用户选择的应用程序
将minSdkVersion
设置为22,然后使用。请注意,这不允许您更改有关用户选择的任何内容(例如,替换不同的意图
);它只是给你一个机会去发现选择
或者,如果您不想将minSdkVersion
设置为22,请在API Level 22+设备上使用createChooser()
的三参数风格,并在旧设备上执行其他操作(自定义选择器、无选择信息的live等)
否则,请告诉我是否有办法将“始终”和“仅一次”选项集成到自定义选择器中
不,这是不可能的。谢谢你提供的信息!