gpt4 book ai didi

android - 自定义选择器 Activity : SecurityException UID n does not have permission to content://uri

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:50 25 4
gpt4 key购买 nike

我正在构建一个替代原生 Android 共享对话框的选择器应用程序。它工作正常,除非我尝试通过长按图像 > 共享图像从 Chrome 共享图像。

我发现 Google+ 没有捕捉到异常(它崩溃了),所以我可以通过 Logcat 查看它:

  • 在 Google 上搜索图片。
  • 选择一张图片(这应该显示预览)
  • 长按图片
  • 选择“分享图片”
  • 弹出我的选择器 Activity
  • 选择 Google+
  • Google+ 因以下错误而崩溃:

java.lang.SecurityException: UID 10130 does not have permission to content://com.android.chrome.FileProvider/images/screenshot/15307295588677864462883877407218.jpg [user 0]

我的代码(简化版):

@Override
public void onCreate() {
handleIntent();
}

private void handleIntent() {

// Get intent and payload
mIntent = getIntent();
mPayloadIntent = (Intent) mIntent.getParcelableExtra(Intent.EXTRA_INTENT);

// Nullify some things for queryIntentActivities (or no results will be found)
mPayloadIntent.setComponent(null);
mPayloadIntent.setPackage(null);

// Retrieve a list of targets we can send mPayloadIntent to..
List<ResolveInfo> targets = context.getPackageManager().queryIntentActivities(mPayloadIntent, 0);
// etc...

}

private void onClickTarget(ResolveInfo target) {

// Prepare..
ComponentName compName = new ComponentName(
target.activityInfo.applicationInfo.packageName,
target.activityInfo.name);

// Build a 'new' shareIntent
Intent shareIntent = new Intent(mPayloadIntent);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
shareIntent.setComponent(compName);

// Start the targeted activity with the shareIntent
startActivity(shareIntent);
finish();

}

AndroidManifest.xml:

<activity
android:name=".ActShareReplace"
android:label="Sharedr"
android:theme="@style/AppTheme.TransparentActivity"
>
<intent-filter>
<action android:name="android.intent.action.CHOOSER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

如果我查看 Intent.ACTION_CHOOSER 的文档它说:

If you need to grant URI permissions through a chooser, you must specify the permissions to be granted on the ACTION_CHOOSER Intent in addition to the EXTRA_INTENT inside. This means using setClipData(ClipData) to specify the URIs to be granted as well as FLAG_GRANT_READ_URI_PERMISSION and/or FLAG_GRANT_WRITE_URI_PERMISSION as appropriate.

我不完全确定这是我的应用程序必须执行的操作,还是调用选择器 Activity 的应用程序的责任 - 但我认为是后者。我的应用无法为其接收的 Intent 设置 URI 权限,对吗?

无论如何,如果我检查 mIntentmPayloadIntent 上的附加项和标志,我会得到:

mIntent 只有额外的东西,没有标志(据我所知):

android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER IntentSender{4fa3901: android.os.BinderProxy@3aec3a6} (android.content.IntentSender)

android.intent.extra.INTENT Intent { act=android.intent.action.SEND typ=image/jpeg flg=0x80001 clip={image/jpeg U:content://com.android.chrome.FileProvider/images/screenshot/15307316967108618905323381238187.jpg} (has extras) } (android.content.Intent)

android.intent.extra.TITLE Share via (java.lang.String)

mPayloadIntent:

android.intent.extra.STREAM content://com.android.chrome.FileProvider/images/screenshot/1530731945132897653908815339041.jpg (android.net.Uri$HierarchicalUri)

  • FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
  • FLAG_ACTIVITY_NEW_DOCUMENT
  • FLAG_GRANT_READ_URI_PERMISSION

所以 mPayloadIntent 确实FLAG_GRANT_READ_URI_PERMISSION 但 mIntent 没有。根据文档,它应该。

我读到我的应用可能使用了 URI 权限,所以 I tried caching the file myself但是当我尝试通过 ContentResolver 访问 URI 时,我得到了一个 - 你猜对了 - 权限错误。

然后我意识到我可能不必将文件缓存为 Android 的 native Chooser Activity似乎也没有这样做。这就是我现在所处的位置。回到第一点。

这是 Chrome 的错误吗?安卓漏洞?还是我做错了什么?

我很乐意责怪 Chrome 并提交错误报告,但从事类似项目(并遇到相同问题)的人告诉我 Whatsapp 也有类似问题。它也通过 content://uri 共享图像。

为了完整起见,我在装有 Android 8.1 的 Pixel 2016 上对此进行了测试。我不知道另一个人(在 WA 上遇到了同样的问题)正在使用什么。

最佳答案

Is this a Chrome bug? An Android bug? Or am I doing something wrong?

我的猜测是这是一个客户端错误,来自于人们直接创建 ACTION_CHOOSER Intent 对象而不是通过 Intent.createChooser()Intent.createChooser() 看起来它正在从您所谓的 mPayloadIntent 中获取标志,并将它们添加到 mIntent

您应该可以自己测试一下。创建一个剪贴板应用,它创建一个 ACTION_SEND Intent,其中 EXTRA_STREAM 指向一些内容(例如,由 FileProvider 提供) >).然后,尝试通过三种方式调用您的选择器:

  1. 通过Intent.createChooser()

    包装Intent
  2. 通过 ACTION_CHOOSER Intent 包装 Intent,您可以按照文档所说的进行操作,并将标志放在 上>Intent 对象

  3. 通过 ACTION_CHOOSER Intent 包装 Intent,您可以跳过 ACTION_CHOOSER 上的标志 Intent

如果我是正确的,#1 和#2 将起作用,而#3 将失败并出现与您所看到的相同的基本故障模式。

如果到目前为止我的理论成立,请尝试再次运行这三个应用程序,但这次使用系统选择器。我的猜测是,系统选择器确实从成为核心操作系统的一部分中获得了一些特殊的好处,并且所有三个都可以工作。否则,Chrome 和 WhatsApp 的开发人员会在他们的测试中遇到这个问题并会修复它。

而且,如果所有这些理论都站得住脚……你就有点搞砸了。我假设更多的人使用 Intent.createChooser() 而不是直接使用 ACTION_CHOOSER,因为 Intent.createChooser() 更简单。而且,部分使用 ACTION_CHOOSER 的人实际上可能会遵循文档...

hahahahahahahahahaha...gasp ...hahahahahahahahahaha!

...对于那些,你没问题。而且,某些使用 ACTION_CHOOSER 的人可能在 EXTRA_STREAM 中有一个世界可读的 Uri(这不是一个好主意,但它可以工作在这里对你有利)。它仅适用于手动创建 ACTION_CHOOSER、未能正确设置 Intent 标志但确实正确保护其内容的有问题的客户端,您将无法正确处理 Intent

关于android - 自定义选择器 Activity : SecurityException UID n does not have permission to content://uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51179904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com