在我的应用程序中,我有一个共享按钮,该按钮允许用户通过Messenger等其他应用程序共享一些文本。我使用CreateChooser让用户选择他们要使用的应用程序。棘手的部分是,在他们选择了该应用程序之后,我不想立即启动选定的应用程序,但是我需要先与服务器进行一些通信(要获得确切的文本(为了在此阶段提示屏幕上的一些消息,然后我可以启动所选应用程序的共享意图。换句话说,选择器只是选择的接口,我不希望它实际启动意图。我将稍后手动开始。
我试图以这样的方式修改收集到Chooser的意图,使它们只是将其重定向回到我自己的应用程序。但是,我在保留他们的图标和标签方面存在问题。无论我做什么,某些选择总是将其图标和标签更改为我自己的应用程序的标签。
这大约是我当前的代码的样子:
PackageManager pm = activity.getPackageManager();
Intent sendIntent = new Intent()
.setAction(Intent.ACTION_SEND)
.putExtra(Intent.EXTRA_TEXT, text)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.setType("text/plain");
List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, PackageManager.MATCH_DEFAULT_ONLY);
List<LabeledIntent> intentList = new ArrayList<>();
for (ResolveInfo ri : resInfo) {
String packageName = ri.activityInfo.packageName;
String name = ri.activityInfo.name;
if (name.contains("facebook.messenger")
|| name.contains("naver.line")
|| name.contains("android.mms")
|| name.contains("clipboard")
) {
ComponentName cn = new ComponentName(packageName, name);
Intent intent = new Intent(sendIntent)
.setPackage(packageName)
.setComponent(cn); // I tried to do somthing here but it doesn't work
intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
// loadLabel and icon doesn't always get the correct thing
}
}
Intent first = intentList.remove(0);
Intent[] extra = intentList.toArray(new Intent[0]);
Intent receiver = new Intent(activity, ShareReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT);
Intent chooser = Intent.createChooser(first, title, pendingIntent.getIntentSender());
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extra);
activity.startActivity(chooser);
"但是我需要先与服务器进行一些通信"
- 较早的通信,在需要时存储并使用它?
"选择器只是选择的接口,我不想要它 实际启动意图;我会手动启动一点 后来。"
- 您是否听说过
ModalBottomSheet
参考以根据需要为您自己实现自定义选择器。
"我试图修改收集到Chooser的意图 他们只是将其重定向到我自己的应用程序。"
- 在这种情况下使用
startActivityForIntent
;当您意图应用程序时,关闭并返回您的应用程序,将其处理onActivityResult
无论您想做什么。
"但是,我在保留其图标和标签时遇到问题。"
- 您是否在"选择器"对话框中指的是其他应用程序的图标和标签?