6

DemoProの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 パーミッションを正しく付与するにはどうすればよいですか?

4

1 に答える 1