Android API 21 引入了称为 SAF(存储访问框架)的新框架,用于接收对存储的访问。在 API 30 之后,这是让您的应用访问外部存储的唯一可能解决方案。
在使用 ACTION_OPEN_DOCUMENT_TREE 意图时,我在该框架中遇到了 2 个错误 (?)。
有人遇到同样的问题吗?
我的代码:
public void openDirectory() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/tree/2C13-1335%3AMusic");
startActivityForResult(intent, FOLDER_ACCESS_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FOLDER_ACCESS_REQUEST_CODE && resultCode == RESULT_OK) {
if (data != null) {
Uri uri = data.getData(); // there i receive uri of selected folder, it is "content://com.android.externalstorage.documents/tree/2C13-1335%3AMusic"
getContentResolver().takePersistableUriPermission(uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
}
使用此代码,两个错误都存在。如果代替
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/tree/2C13-1335%3AMusic");
我写
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:");
Explorer 在内部存储中打开并且按钮可见,即两个错误都不存在。如果我写
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/secondary:");
资源管理器在缓存(即最后选择的)文件夹中打开,但按钮存在,所以我只有第一个错误