当前位置: 首页 > 知识库问答 >
问题:

与FileProvider共享文件时使用grantUriPermission的

司马耘豪
2023-03-14
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>
<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的权限?

共有1个答案

单品
2023-03-14

好吧,经过一周和大量的试验和错误,似乎答案是不指定权限。因此,应用程序清单应该包含:

<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失败。访问已经受到限制。

为了完成这幅画,并回答我的问题的第二部分,我发现了以下几点:

final long token = Binder.clearCallingIdentity();
try {
    [retrieve file here]
} finally {
    Binder.restoreCallingIdentity(token);
}
 类似资料:
  • 我正在尝试使用内容提供程序共享我的内部日志文件。我有以下

  • 我正在尝试传递一个位于我的应用程序的res/raw目录中的图像以及共享意图。 我遵循了FileProvider文档中描述的流程,下面是我的代码: Androidanifest.xml 我的活动中的代码: 由于无法访问我在其他应用程序中获取的文件,因此上述操作无效: java.io.FileNotFoundException:FILE_PATH:打开失败: EACCES(权限拒绝) 知道我做错了什么

  • 我正在尝试使用文件提供商共享存储在我的应用程序内部存储器的原始文件夹中的MP3文件,并允许用户使用他们选择的音频收听应用程序打开共享的MP3文件。 然而,在我编写的代码中,当我尝试使用附加的内容URI作为数据执行意图时,会出现FileNotFoundException。这会导致FileProvider系统的所有其他方面出现故障。 我创建了一个MediaPlayer,让它毫无问题地打开了我想要共享的

  • 跟随https://developer.android.com/training/secure-file-sharing/index.html,并能够共享文件在内部目录(/data/data/pack/files/xxx/)的应用程序到客户端应用程序使用file提供程序。 如何将资产文件夹(而不是内部目录)中的文件共享到客户端应用程序。 谢谢

  • 我正在使用FileProvider API来共享实际存储在内部存储中的内容。 有什么建议我做错了什么吗?

  • 我看到了很多代码和示例,但我的应用程序还不能正常工作,我想在文件夹,如存储/模拟/0/Android/data/ir。esfandune。mohsen/files/Download/cnt\u imags/images/n1/n1(18)。jpg,我在清单中定义提供者: 和XML: 我的代码是: 但是当发送到其他应用程序时,不要分享任何东西