DemoとProの2 つのアプリがあります。デモにはコンテンツ プロバイダーがあり、Pro をインストールすると、デモ プロバイダーからすべてのファイルを転送する必要があります。
デモアプリ (プロバイダー):
<provider
android:name="***.provider.InternalStorageProvider"
android:authorities="***.demo.storage.int.provider"
android:exported="false"
android:syncable="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/int_storage_paths" />
</provider>
プロアプリ (消費者):
実験 1:
ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri, "r");
FileInputStream 入力 = 新しい FileInputStream(pfd.getFileDescriptor());
java.lang.SecurityException: Permission Denial: open provider .provider.InternalStorageProvider from ProcessRecord{9c85875 10734: /u0a61} (pid=10734, uid=10061) からエクスポートされていない uid 10062
実験 2:
アクティビティ活動 = getActivity(); activity.grantUriPermission(activity.getPackageName(), exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri, "r"); FileInputStream 入力 = 新しい FileInputStream(pfd.getFileDescriptor());
java.lang.SecurityException: Uid 10061 には uri 0 @ content://***.demo.storage.int.provider/db/file1 へのアクセス許可がありません
InternalStorageProvider
は法線のコピーですFileProvider
。しかし、実行がそれに到達することさえできないので、それは問題ではありません。呼び出される前に例外がスローされます。セレクター アクティビティとインテントは含まれないことに注意してください。コンシューマーは、チューザーなしで、既知の uri から直接ファイルを開こうとします。私が見つけた例のほとんどは使用Intent.FLAG_GRANT_READ_URI_PERMISSION
していますが、インテントはまったく使用していません。
コンシューマーに uri パーミッションを正しく付与するにはどうすればよいですか?