首页 > 解决方案 > 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 / 中)在官方文档中,没有给出示例。我真的希望所有标准位置都有一些简洁的常量?

标签: androidandroid-11scoped-storage

解决方案


我们将操纵INITIAL_URIStorageManager..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;
        }

推荐阅读