android-自定义选择器活动:SecurityException UID n没有对content: uri的许可

android-自定义选择器活动:SecurityException UID n没有对content: uri的许可,第1张

概述我正在构建一个Chooser应用程序,该应用程序将替换本地的AndroidShare对话框.效果很好,除非我尝试通过长按图像>从Chrome共享图像.分享图像.我发现Google没有捕获到异常(崩溃),因此我可以通过Logcat进行查看:>在Google上进行图片搜索.>选择图像(这应该显示预览)>长按图像>选择“

我正在构建一个Chooser应用程序,该应用程序将替换本地的Android Share对话框.效果很好,除非我尝试通过长按图像>从Chrome共享图像.分享图像.

我发现Google没有捕获到异常(崩溃),因此我可以通过Logcat进行查看:

>在Google上进行图片搜索.
>选择图像(这应该显示预览)
>长按图像
>选择“共享图像”
>我的选择器活动d出
>选择Google
> Google因以下错误而崩溃:

java.lang.SecurityException: UID 10130 does not have permission to content://com.androID.Chrome.fileProvIDer/images/screenshot/15307295588677864462883877407218.jpg [user 0]

我的代码(简体):

@OverrIDepublic 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.

我不确定这是否是我的应用程序必须执行的 *** 作,还是调用选择程序活动的应用程序的责任-但我认为是后者.我的应用无法为其接收的意图设置URI权限,可以吗?

无论如何,如果我检查mIntent和mPayloadIntent上的多余标记和标志,则会得到:

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原生的Chooser Activity似乎也没有这样做.这就是我现在所在的位置.回到原点.

这是Chrome错误吗?一个AndroID错误?还是我做错了什么?

我会很乐意归咎于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提供).然后,尝试通过三种方式调用选择器:

>通过Intent.createChooser()包装Intent
>通过ACTION_CHOOSER Intent包装Intent,您可以按照文档所说的在两个Intent对象上放置标志
>通过ACTION_CHOOSER意图包装该意图,您可以在ACTION_CHOOSER意图上跳过标志

如果我是正确的,则#1和#2可以工作,而#3将以与您看到的相同的基本故障模式失败.

如果到目前为止我的理论仍然有效,请尝试再次运行这三个应用程序,但这一次使用系统选择器.我的猜测是,作为核心 *** 作系统的一部分,系统选择器确实会获得一些特殊的好处,并且所有这三种都可以使用.否则,Chrome和WhatsApp的开发人员可能会在测试中遇到此问题并予以解决.

而且,如果所有这些理论都成立了……您就会有些困惑.我认为更多的人使用Intent.createChooser()而不是直接使用ACTION_CHOOSER,因为Intent.createChooser()更简单.而且,使用ACTION_CHOOSER的人员中的某些人可能实际上遵循了文档…

哈哈哈哈哈哈哈哈哈哈哈…哈哈哈哈哈哈哈哈哈哈哈!

…对于这些,您还可以.而且,某些使用ACTION_CHOOSER的人可能在EXTRA_STREAM中拥有一个Uri,该Uri可以被世界读取(这不是一个好主意,但在这里对您有用).仅适用于手动创建ACTION_CHOOSER,无法正确设置Intent标志,但是确实保护其内容的错误客户端,因此您将无法正确处理Intent.

总结

以上是内存溢出为你收集整理的android-自定义选择器活动:SecurityException UID n没有对content:// uri的许可全部内容,希望文章能够帮你解决android-自定义选择器活动:SecurityException UID n没有对content:// uri的许可所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1092161.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存