当用户第一次使用我的应用程序时,如何设置 ACTION_OPEN_DOCUMENT_TREE 启动路径?

cas*_*orz 8 android

我见过很多关于设置开始的问题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)
Run Code Online (Sandbox Code Playgroud)

bla*_*pps 9

我们操纵.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;
}
Run Code Online (Sandbox Code Playgroud)

日志将打印如下内容:

INITIAL_URI scheme: content://com.android.externalstorage.documents/root/primary
uri: content://com.android.externalstorage.documents/document/primary%3ADownload
Run Code Online (Sandbox Code Playgroud)