SecurityException with grantUriPermission when sharing a file with FileProvider

后端 未结 2 756
甜味超标
甜味超标 2020-12-03 07:56

I have two applications. I\'m trying to share a file from application A to application B using a FileProvider. Application A calls the insert method on a ContentProvider i

相关标签:
2条回答
  • 2020-12-03 08:25

    The first problem in your code is exported attribute set to false. Please change it to true as,

    <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="au.com.example.AppA.fileprovider"
    android:exported="true"
    android:readPermission="au.com.example.READ_CONTENT"
    android:writePermission="au.com.example.WRITE_CONTENT" >
    </provider>
    

    The second thing you have to do is, If external application App B is using content provider in App A.Then in App A manifest file mention permission as,

    <permission
    android:name="au.com.example.READ_CONTENT"
     >
    </permission>
    <permission
    android:name="au.com.example.WRITE_CONTENT"
     >
    </permission>
    

    and in App B mention uses-permission as,

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

    Please let me know whether your problem has solved or not. If not please send your entire code. I will try to find the problem. Thank you.

    0 讨论(0)
  • 2020-12-03 08:33

    Well, after a week and a lot of trial and error, it seems the answer is to not specify permissions. So the App A Manifest should instead contain:

    <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>
    

    ie, I removed the read and write permissions. My initial understanding, and failing to find documentation that said otherwise, was these were necessary to restrict access. However, I've found they actually interfere and cause Context.grantUriPermission to fail. Access is limited already.

    To complete the picture, and answer the second part of my question, I found the following:

    Android Permission denial in Widget RemoteViewsFactory for Content

    I had to add:

    final long token = Binder.clearCallingIdentity();
    try {
        [retrieve file here]
    } finally {
        Binder.restoreCallingIdentity(token);
    }
    

    to the Content Provider in App B. Otherwise it would get security errors as well.

    0 讨论(0)
提交回复
热议问题