ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-26 02:34:02  阅读:403  来源: 互联网

标签:android android-fileprovider permissions securityexception


我有两个申请.我正在尝试使用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/MyFileName
at 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,android-fileprovider,permissions,securityexception
来源: https://codeday.me/bug/20190926/1818441.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有