4

アプリでは、ユーザーはインテントを使用して SAF 経由でディレクトリを選択し、ACTION_OPEN_DOCUMENT_TREEユーザーはその中にさまざまなファイルを作成できます。問題は、ユーザーが (常に SAF を使用して) 作業ディレクトリを変更すると、これらのファイルへのアクセスが失われることです。またはのようにアクセスを維持するにはどうすればよいですACTION_CREATE_DOCUMENTACTION_OPEN_DOCUMENT

ここに私のコード

  • ディレクトリを選ぶ
private void showDirectoryPicker() {
        Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
               i.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
               i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

        startActivityForResult(i, 12345);
}
  • 取り扱い実績
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_OK) return;
        mDir = data.getData();

        grantUriPermission(getPackageName(), mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        getContentResolver().takePersistableUriPermission(mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
  • ファイルの作成
 mFile = DocumentFile.fromTreeUri(getContext(), mDir).createFile("text/plain", "some file.txt").getUri();
  • ユーザーが作業ディレクトリを変更した場合、古いディレクトリの権限を解放します。
getContentResolver().releasePersistableUriPermission(mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
revokeUriPermission(mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

mDir = null;

// ask for another dir
showDirectoryPicker();

アプリケーションを再起動し、古いディレクトリに作成されたファイルを開こうとすると、次のようになります。 java.lang.SecurityException: No persistable permission grants found for UID <<<uid>>> and Uri 0 @ <<<file uri>>>

例:

DocumentFile file = DocumentFile.fromSingleUri(getContext(), mFile);

if (file.getName() == null) {
     // permissions lost
} else {
     // do something
}

これをどのように処理しますか?または、アプリケーションがアンインストールされるまで、ディレクトリのアクセス許可を保持しますか???

4

1 に答える 1