アプリでは、ユーザーはインテントを使用して SAF 経由でディレクトリを選択し、ACTION_OPEN_DOCUMENT_TREE
ユーザーはその中にさまざまなファイルを作成できます。問題は、ユーザーが (常に SAF を使用して) 作業ディレクトリを変更すると、これらのファイルへのアクセスが失われることです。またはのようにアクセスを維持するにはどうすればよいですACTION_CREATE_DOCUMENT
かACTION_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
}
これをどのように処理しますか?または、アプリケーションがアンインストールされるまで、ディレクトリのアクセス許可を保持しますか???