android - Android 11 ACTION_OPEN_DOCUMENT_TREE:将初始 URI 设置为 Documents 文件夹
问题描述
在 Android 11 中使用 Scoped Storage 模型我想让用户能够选择一个文件夹,从文档文件夹开始:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, ??? );
startActivityForResult(intent, OPEN_DIRECTORY_REQUEST_CODE,null);
问题是,如何生成手机文档文件夹的正确 URI?(它只是在 root / 中)在官方文档中,没有给出示例。我真的希望所有标准位置都有一些简洁的常量?
解决方案
我们将操纵INITIAL_URI
从StorageManager..getPrimaryStorageVolume().createOpenDocumentTreeIntent()
.
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
{
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
Intent intent = sm.getPrimaryStorageVolume().createOpenDocumentTreeIntent();
//String startDir = "Android";
//String startDir = "Download"; // Not choosable on an Android 11 device
//String startDir = "DCIM";
//String startDir = "DCIM/Camera"; // replace "/", "%2F"
//String startDir = "DCIM%2FCamera";
String startDir = "Documents";
Uri uri = intent.getParcelableExtra("android.provider.extra.INITIAL_URI");
String scheme = uri.toString();
Log.d(TAG, "INITIAL_URI scheme: " + scheme);
scheme = scheme.replace("/root/", "/document/");
scheme += "%3A" + startDir;
uri = Uri.parse(scheme);
intent.putExtra("android.provider.extra.INITIAL_URI", uri);
Log.d(TAG, "uri: " + uri.toString());
((Activity) context).startActivityForResult(intent, REQUEST_ACTION_OPEN_DOCUMENT_TREE);
return;
}
推荐阅读
- javascript - 开玩笑 - localeForage.createInstance 不是一个函数
- r - 列出目录中的所有文件,忽略符合模式的文件夹?特别是低于给定年份?
- android - ScrollView 中的 Android Recyclerview
- javascript - 遇到这个 API 的任何问题 console.log,我们不允许使用 JQuery 或 Bootstrap,所以我必须使用 fetch 和 bulma
- python - 从excel文件导入并添加到现有数据框
- r - 如何将条件指示符变量添加到 R 中的数据框?
- php - 如何使用 php curl 传递安全 cloudflare 服务器
- html - 如何使用省略号截断屏幕大小的文本
- react-native - 防止阅读视频 react native
- airflow - 如何在 Airflow 安装中创建触发器进程?