背景
我希望展示本机意图选择器,同时能够对其进行一些自定义。
为此,我找到了下一个 StackOverflow 线程:
问题
问题是,当我在 Android 5.x 及更低版本上使用建议的代码时,一切似乎都很好,但是当我在 Android 6.0.1 上使用它时(在 Nexus 5 和模拟器上测试,当有多个应用程序共享内容时) ,我得到空单元格,有时甚至是空的应用程序名称,例如:
使用非自定义意图选择器时不会出现这种情况:
startActivity(Intent.createChooser(intent, "default chooser"));
编码
看到解决方案,我创建了下一个代码:
private void test(Intent shareIntent) {
List<Intent> targetedShareIntents = new ArrayList<>();
final List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo resolveInfo : resInfo) {
Intent targetedShareIntent = new Intent(shareIntent);
targetedShareIntent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
targetedShareIntents.add(targetedShareIntent);
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(targetedShareIntents.size() - 1), "Select app to share");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()]));
startActivity(chooserIntent);
}
}
private void prepareIntentToShare(Intent intent) {
intent.setAction(android.content.Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, mUri);
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "title");
intent.putExtra(android.content.Intent.EXTRA_TEXT, "body");
}
以及测试它的方法:
Intent intent = new Intent();
prepareIntentToShare(intent);
test(intent);
我试过的
我试图改变意图中的各种东西,但没有任何运气。我还试图找出意图的顺序应该是什么(因为它可能很重要),但我没有找到。
最后,我决定将它发布到 Google,假设这是一个错误:
https://code.google.com/p/android/issues/detail?id=202693
问题
为什么会发生?我可以以某种方式修复它,同时仍然使用本机意图选择器吗?为什么它只发生在 Android 6 及更高版本上?
例如,我如何将每个项目的正确名称放在那里,例如,我两次看到“twitter”,而其他应用程序确实显示了正确的名称(例如 qr-code-scanner 的名称)?
是否可以保持应用程序排序的本机行为,如使用显示意图选择器的简单方式所示?也许以应该订购的方式获取应用程序列表?