2つのアプリケーションがあります。FileProvider を使用して、アプリケーション A からアプリケーション B にファイルを共有しようとしています。アプリケーション A は、アプリケーション B の ContentProvider で insert メソッドを呼び出して、レコードを挿入します。挿入されたデータには、アプリ A から共有したいファイルへの Uri が含まれています。アプリ B の ContentProvider は、アプリ A から共有ファイルを読み取ろうとします。ファイルを共有するためにインテントを使用していないため、Context.grantUriPermission
アプリ A を呼び出して、読み取り (場合によっては書き込み) を許可します。
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>
アプリ A とアプリ 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 に許可を与えることができますか?