Использование файла документа с Storage Access Framework

Я получил treeUri из данных о намерениях. Я выбрал корневой путь SDCard. Приведение treeUri к строковому типу content://com.android.externalstorage.documents/tree/C4FD-B5C6%3A,

Вопрос 1.

Это правильный результат?

Вопрос 2.

Во всяком случае, я создал Documentfile, как это.

DocumentFile tree = DocumentFile.fromTreeUri(MusicServiceActivity.getAppContext(),Uri.parse(stringtreeUri));,

И я напечатал

tree.canWrite

используя Log.e, но всегда возвращает false.

Как я могу сделать это, чтобы вернуть истину?

добавленной

Вот мой onActivityResult..

public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (resultCode != RESULT_OK)
        return;
    else {
        Uri treeUri = resultData.getData();
        Log.e("treeuri",treeUri.toString());
        grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        if(Build.VERSION.SDK_INT >= 19)
            getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        String str = treeUri.toString();
        try{
            File dir = new File (Environment.getExternalStorageDirectory().getAbsolutePath());
            if(!dir.exists()){
                dir.mkdir();
            }
            FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"/treeuri.txt", true);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos));
            writer.write(str);
            writer.flush();
            writer.close();
            fos.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

1 ответ

Это правильный результат?

Это выглядит разумно.

Как я могу сделать это, чтобы вернуть истину?

Я интерпретирую ваш код как:

  1. Вы получили действительное дерево документов Uri (например, через ACTION_OPEN_DOCUMENT_TREE)
  2. Вы преобразовали Uri в строку
  3. Вы где-то сохранили строку (база данных, SharedPreferences, так далее.)
  4. Позже вы пробуете код, который у вас есть (преобразование строки обратно в Uriзатем пытается использовать это Uri)

Если это так, то после шага № 1 вам нужно позвонить takePersistableUriPermission() наContentResolver, В противном случае, только деятельность, которая получила Uri изначально имеет права на контент, определенный этим Uri,

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