【发布时间】:2017-04-19 08:11:55
【问题描述】:
我最近几天浏览了存储访问框架,但仍然不明白。
我的问题是:如何在选择 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);
}
}
【问题讨论】:
-
takePersistableUriPermission()应该给你持久/永久的权限。 -
如果你只在 inActivityResult 中调用 writeFile() ,你甚至不必使用它们。
-
您最好从您的意图中删除所有 addFlags() 。它们无用且令人困惑。多重有效吗?否则出于同样的原因将其删除。
-
grantUriPermission()。同时删除。令人困惑。
标签: android android-permissions android-sdcard documentfile