android - 对 SEND 操作 Intent 的权限拒绝

标签 android android-intent android-8.0-oreo

这是日志,我在运行 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/

相关文章:

android - 更改 ListActivity 中的顺序

android - 将橙色样式应用于我的搜索 View

android - 使用 AChartEngine 增加条形图的宽度并在两个条形图之间留出空间

java - 从 Intent 获取额外内容时出现空指针异常?

android - 启用 Android 零售演示

Android 8 - 如何通过 ADB 设置模拟器语言环境?

android - 如何使用 Facebook SDK Xamarin Android 登录?

android - Bluetooth Intent 的 Bluetooth startActivity 方法

android - 如何通过 Activity 将额外数据从一个 fragment 传输到另一个 fragment

c# - Android Oreo 中无法访问 Google Smart Lock 保存对话框