Использование файла документа с 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 ответ
Это правильный результат?
Это выглядит разумно.
Как я могу сделать это, чтобы вернуть истину?
Я интерпретирую ваш код как:
- Вы получили действительное дерево документов
Uri
(например, черезACTION_OPEN_DOCUMENT_TREE
) - Вы преобразовали
Uri
в строку - Вы где-то сохранили строку (база данных,
SharedPreferences
, так далее.) - Позже вы пробуете код, который у вас есть (преобразование строки обратно в
Uri
затем пытается использовать этоUri
)
Если это так, то после шага № 1 вам нужно позвонить takePersistableUriPermission()
наContentResolver
, В противном случае, только деятельность, которая получила Uri
изначально имеет права на контент, определенный этим Uri
,