这是日志,我在运行 Oreo O'S 的三星中收到崩溃信息:
Fatal Exception: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.SEND typ=text/plain flg=0x80001 pkg=com.google.android.apps.maps cmp=com.google.android.apps.maps/com.google.android.apps.gmm.sharing.SendTextToClipboardActivity clip={text/plain T:"XYZ"
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
share.putExtra(Intent.EXTRA_TEXT, shareMessage);
share.setPackage(packageName);
请提出建议。
谢谢
最佳答案
这里有几个选择。您可以通过专门过滤掉 Google map 最近添加为 Intent 处理程序的 SendTextToClipboardActivity
来避免此崩溃。 (它看起来完全就像真正的Android“复制到剪贴板”共享目标,并且很可能是Google map 部分错误的结果。)或者您可以过滤掉任何 ResolveInfo
,其中对应的Activity
未导出;但是,这可能会导致也过滤掉您自己的应用程序中您确实想要向用户显示的共享目标,在这种情况下,您需要允许非从您自己的应用程序包导出 Activity 。
例如,假设您有类似的方法来获取您的 ACTION_SEND
Intent 的提供者列表:
PackageManager packageManager = mActivity.getPackageManager();
List<ResolveInfo> providers = packageManager.queryIntentActivities(sendIntent, 0);
然后,您可以过滤掉已知会导致问题的提供程序和/或 Activity 未标记为导出的提供程序。例如,您可以使用如下检查来构建您自己的要向用户显示的提供商列表:
for (ResolveInfo provider : providers) {
if ("com.google.android.apps.maps".equalsIgnoreCase(provider.activityInfo.packageName)
&& "com.google.android.apps.gmm.sharing.SendTextToClipboardActivity".equalsIgnoreCase(provider.activityInfo.name)) {
continue; // Skip specific Activity you don't want to show
}
if (!BuildConfig.APPLICATION_ID.equalsIgnoreCase(provider.activityInfo.packageName) && !provider.activityInfo.exported) {
continue; // Skip providers where the Activity is not marked with exported=true, unless they're from our own app
}
acceptableProviders.add(provider);
}
如何将 acceptableProviders
显示为共享选项,留给读者作为练习。关键是过滤掉已知的不良提供商。
同时,您还可以联系 Google 提示这个新 Intent 处理程序的不良行为,该处理程序本质上是伪装成用于“复制到剪贴板”的可信 Android text/plain
处理程序分享目标。
关于android - 对 SEND 操作 Intent 的权限拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57662388/