【问题标题】:Permission Denial on SEND action intent拒绝发送操作意图的权限
【发布时间】:2019-12-30 21:49:47
【问题描述】:

这是日志,我在运行 Oero 操作系统的三星崩溃时收到:

致命异常:java.lang.SecurityException:权限被拒绝: 开始意图 { 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);

请提出建议。

谢谢

【问题讨论】:

  • 您能否提供触发此崩溃的代码?
  • 请检查添加了我的代码
  • 不幸的是,queryIntentActivities() 和类似的PackageManager 方法不会过滤掉您没有启动权限的方法。显然,com.google.android.apps.maps/com.google.android.apps.gmm.sharing.SendTextToClipboardActivity 支持 ACTION_SEND,但不是来自您的应用程序。
  • 那么解决这个问题的方法是什么
  • 没有,除了不要尝试将ACTION_SEND与任意ComponentName一起使用。

标签: android android-intent android-8.0-oreo


【解决方案1】:

这里有几个选项。您可以通过专门过滤掉 Google 地图最近添加为意图处理程序的 SendTextToClipboardActivity 来避免此崩溃。 (它看起来完全像真正的 Android“复制到剪贴板”共享目标,并且很可能是谷歌地图的一个错误的结果。)或者你可以过滤掉任何ResolveInfo其中不导出对应的Activity;但是,这可能会导致在您自己的应用程序中过滤掉您确实想向用户显示的共享目标,在这种情况下,您需要允许非从您自己的应用程序包中导出活动。

例如,假设你有这样的东西来获取你的ACTION_SEND意图的提供者列表:

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 投诉这个新的意图处理程序的不良行为,它本质上伪装成用于“复制到剪贴板”共享目标的受信任的 Android text/plain 处理程序。

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多