Android: Как получить постоянное разрешение на запись на съемную SD-карту?

Я прошел через Storage Access Framework в последние дни и до сих пор не понимаю.

Мой вопрос: Как я могу создать файл с этими разрешениями на SD-карте, не предлагая выбрать патху после выбора местоположения SD-карты один раз?

Я могу выбрать путь на моей SD-карте для создания файла со следующим кодом. (это работает)

        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
        intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        startActivityForResult(intent, 42);

И в onActivityResult я делаю

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData){

    if(resultCode!=RESULT_OK)
        return;
    Uri treeUri=resultData.getData();
    pickedDir= DocumentFile.fromTreeUri(getContext(), treeUri);
    getContext().grantUriPermission(getContext().getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    getContext().getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION );

    writeFile(pickedDir, "testfile.txt");

}

public void writeFile(DocumentFile pickedDir, String filename) {
    try {
        DocumentFile file = pickedDir.createFile("text/plain", filename);
        OutputStream out = getContext().getContentResolver().openOutputStream(file.getUri());
        try {
            // write the file content
        } finally {
            out.close();
        }

    } catch (IOException e) {
        throw new RuntimeException("Something went wrong : " + e.getMessage(), e);
    }
}

1 ответ

Решение
  Uri treeUri=resultData.getData();

Сохраните дерево для дальнейшего использования. Для последующего использования.

Вы можете сохранить treeUri.toString() как путь к схеме содержимого в общих настройках.

Затем позже найдите строку пути и восстановите Uri wit Uri.parse(path);

После этого используйте DocumentFile, как сейчас.

Посмотрите на getPersistableUriPermissions(). Если вы используете только один URI, вам не нужно сохранять, но вы можете использовать эту функцию.

Другие вопросы по тегам