存储访问框架,takePersistableUriPermission [英] Storage Access Framework, takePersistableUriPermission
问题描述
在我的应用程序中,用户可以选择下载目录.如果他选择了外部可移动 SD卡(不是模拟的SD卡!而是内存,例如真正的Physcel MicroSD卡),那么从Android 4.4开始,我只能使用 SAF
(存储访问框架).
In my application user is able to select the downloads directory. If he selects external removable SD card (not an emulated sd card!, but a memory, which is a real physicel microSD card for example), starting from Android 4.4 I am only able to write to it using SAF
(Storage Access Framework).
我已经弄清楚了如何使用SAF创建和写入单个文件:
I've figured out how to create and write a single file using SAF:
public void newFile() {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TITLE, "newfile.txt");
startActivityForResult(intent, CREATE_REQUEST_CODE);
}
public void saveFile() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");
startActivityForResult(intent, SAVE_REQUEST_CODE);
}
这是我的onActivityResult,我实际上在其中写入文件:
And here is my onActivityResult, where I actually write to file:
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
Uri currentUri = null;
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CREATE_REQUEST_CODE) {
if (resultData != null) {
Log.d(TAG, "CREATE_REQUEST_CODE resultData = " + resultData);
}
} else if (requestCode == SAVE_REQUEST_CODE) {
if (resultData != null) {
currentUri = resultData.getData();
getContentResolver().takePersistableUriPermission(currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
writeFileContent(currentUri);
Log.d(TAG, "SAVE_REQUEST_CODE currentUri = " + currentUri);
}
}
}
}
还有 writeFileContent
:
private void writeFileContent(Uri uri) {
try {
ParcelFileDescriptor pfd =
this.getContentResolver().
openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream =
new FileOutputStream(pfd.getFileDescriptor());
String textContent = "some text";
fileOutputStream.write(textContent.getBytes());
fileOutputStream.close();
pfd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
最后是我的问题:
如何创建其他文件,并在调用 getContentResolver().takePersistableUriPermission
后写出它们,而又不提示将来选择目录?
How do I create other files, and write them after I called getContentResolver().takePersistableUriPermission
without a prompt to select a directory in future?
如果我是对的,那么 getContentResolver().takePersistableUriPermission
应该允许我做
If I'm right, then getContentResolver().takePersistableUriPermission
shoudl allow me to do tha
推荐答案
感谢@ earthw0rmjim的答案,然后使用Google谷歌搜索,我想出了一个完整的解决方案:
Thanks to @earthw0rmjim answer, and googling, I figgured out a complete solution:
public void saveFile() {
List<UriPermission> permissions = getContentResolver().getPersistedUriPermissions();
if (permissions != null && permissions.size() > 0) {
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, permissions.get(0).getUri());
DocumentFile file = pickedDir.createFile("text/plain", "try2.txt");
writeFileContent(file.getUri());
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");
startActivityForResult(intent, SAVE_REQUEST_CODE);
}
}
因此,首先,如果我们没有 PersistedUriPermissions
,它将请求此类权限.这样的方式就是 onActivityResult
的样子
So firstly, if we don't have PersistedUriPermissions
, it will request such permissions. This way here is how onActivityResult
looks like
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
Uri currentUri = null;
if (resultCode == Activity.RESULT_OK) {
if (requestCode == SELECT_DIR_REQUEST_CODE) {
if (resultData != null) {
Uri treeUri=resultData.getData();
Log.d(TAG, "SELECT_DIR_REQUEST_CODE resultData = " + resultData);
getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
DocumentFile file = pickedDir.createFile("text/plain", "try2.txt");
writeFileContent(file.getUri());
}
}
}
}
writeFileContent
与问题中的内容相同
private void writeFileContent(Uri uri) {
try {
ParcelFileDescriptor pfd =
this.getContentResolver().
openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream =
new FileOutputStream(pfd.getFileDescriptor());
String textContent = "some text";
fileOutputStream.write(textContent.getBytes());
fileOutputStream.close();
pfd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
这篇关于存储访问框架,takePersistableUriPermission的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!