android– 与FileProvider共享文件时使用grantUriPermission的SecurityException

android– 与FileProvider共享文件时使用grantUriPermission的SecurityException,第1张

概述我有两个申请.我正在尝试使用FileProvider将应用程序A中的文件共享到应用程序B.应用程序A在应用程序B中的ContentProvider上调用insert方法以插入记录.插入的数据包括我想要从AppA共享的文件的Uri.AppB中的ContentProvider将尝试从AppA读取共享文件.由于我没有使用Intent来共享

我有两个申请.我正在尝试使用fileProvIDer将应用程序A中的文件共享到应用程序B.应用程序A在应用程序B中的ContentProvIDer上调用insert方法以插入记录.插入的数据包括我想要从App A共享的文件的Uri.App B中的ContentProvIDer将尝试从App A读取共享文件.
由于我没有使用Intent来共享文件,因此我在App A中调用Context.grantUriPermission以允许读取(并且有时写入):

mContext.grantUriPermission(MyPackagename, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

但是,执行此行会给我(名称已更改以保护无辜者):

java.lang.SecurityException: UID 10066 does not have permission to uri content://au.com.example.AppA.fileprovIDer/MyFolder/Myfilenameat androID.os.Parcel.readException(Parcel.java:1322)at androID.os.Parcel.readException(Parcel.java:1276)at androID.app.ActivityManagerProxy.grantUriPermission(ActivityManagerNative.java:2374)at androID.app.ContextImpl.grantUriPermission(ContextImpl.java:1371)at androID.content.Contextwrapper.grantUriPermission(Contextwrapper.java:400)at etc...

应用程序A在清单文件中具有以下内容:

<provIDer    androID:name="androID.support.v4.content.fileProvIDer"    androID:authoritIEs="au.com.example.AppA.fileprovIDer"    androID:exported="false"    androID:grantUriPermissions="true"    androID:readPermission="au.com.example.READ_CONTENT"    androID:writePermission="au.com.example.WRITE_CONTENT" >    <Meta-data        androID:name="androID.support.file_PROVIDER_PATHS"        androID:resource="@xml/filepaths" /></provIDer>

filepaths.xml有:

<paths>    <files-path        name="MyFolder"        path="MyFolder/" /></paths>

App A和App B都有以下内容:

<uses-permission androID:name="au.com.example.READ_CONTENT" /><uses-permission androID:name="au.com.example.WRITE_CONTENT" />

我已经尝试在两个应用中定义权限.它们都使用相同的调试签名进行签名:

<permission    androID:name="au.com.example.READ_CONTENT"    androID:permissionGroup="MyGroup"    androID:protectionLevel="signature" ></permission><permission    androID:name="au.com.example.WRITE_CONTENT"    androID:permissionGroup="MyGroup"    androID:protectionLevel="signature" ></permission>

文件最终的实际路径是:

/data/data/au.com.example.AppA/files/MyFolder

在这一点上,我很难过.我不知道为什么我不能授予我刚在同一个应用程序中创建的文件的权限.所以我的问题是:为什么我会收到此异常,如何成功授予App B权限?

解决方法:

好吧,经过一周和大量的试验和错误,似乎答案是不指定权限.所以App A Manifest应该包含:

<provIDer    androID:name="androID.support.v4.content.fileProvIDer"    androID:authoritIEs="au.com.example.AppA.fileprovIDer"    androID:exported="false"    androID:grantUriPermissions="true" >    <Meta-data        androID:name="androID.support.file_PROVIDER_PATHS"        androID:resource="@xml/filepaths" /></provIDer>

即,我删除了读写权限.我最初的理解,并没有找到其他说明的文件,这些是限制访问的必要条件.但是,我发现它们确实会干扰并导致Context.grantUriPermission失败.访问权限已经有限.

为了完成图片,并回答我的问题的第二部分,我发现了以下内容:

Android Permission denial in Widget RemoteViewsFactory for Content

我不得不补充:

final long token = Binder.clearCallingIDentity();try {    [retrIEve file here]} finally {    Binder.restoreCallingIDentity(token);}

到App B中的Content ProvIDer.否则它也会出现安全错误.

总结

以上是内存溢出为你收集整理的android – 与FileProvider共享文件时使用grantUriPermission的SecurityException全部内容,希望文章能够帮你解决android – 与FileProvider共享文件时使用grantUriPermission的SecurityException所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1102578.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存