我有两个应用程序。我正在尝试使用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
目前我陷入了困境。我不知道为什么无法在同一应用程序中授予刚创建的文件权限。因此,我的问题是:为什么会出现这种异常情况,我该如何成功地向应用程序B授予权限?