首页 > 解决方案 > 用户第一次使用我的应用程序时如何设置 ACTION_OPEN_DOCUMENT_TREE 启动路径?

问题描述

我已经看到很多关于设置开始的问题,uriIntent.ACTION_OPEN_DOCUMENT_TREE所有这些都需要一个uri来自之前使用过该文件夹选择器的问题。

我想要做的是Download在选择文件夹时将我的用户直接发送到该文件夹​​,但我不知道如何转换/storage/emulated/0/Downloaduri我可以使用DocumentsContract.EXTRA_INITIAL_URI.

有没有办法将任何文件路径转换为DocumentsContract样式uri

编辑:为了清楚起见,我说的是uri通过这里:

        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
                .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
                .putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)

标签: android

解决方案


我们操纵 .createOpenDocumentTreeIntent() 的 INITIAL_URI。

        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";

            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;
        }

日志将打印如下内容:

INITIAL_URI scheme: content://com.android.externalstorage.documents/root/primary
uri: content://com.android.externalstorage.documents/document/primary%3ADownload

推荐阅读