0

是否可以使用Intent.ACTION_OPEN_DOCUMENT file:// 格式的 Uri 作为DocumentsContract.EXTRA_INITIAL_URI额外的,让 DocumentsProvider 在文件的位置开始导航?

在我的应用程序中,我为用户提供了使用自定义设置文件的选项,当他选择此选项时,示例默认文件将在应用程序的数据文件夹中创建(由 返回getExternalFilesDir)。

选择自定义文件时,我希望 DocumentsProvider 使用 . 打开当前所选文件所在的文件夹EXTRA_INITIAL_URI。如果某个文件之前选择了 Intent,则没有问题ACTION_OPEN_DOCUMENT,因为返回的 Uri 是content://格式的。

在用户第一次选择文件之前存在问题,并且只有创建默认自定义文件的 Uri 可用。文件通过使用File.createNewFile返回的目录中的使用创建Context.getExternalFilesDir,并使用使用生成Uri Uri.fromFile(file),从而产生file://格式Uri。

这是一个简单的示例代码:

创建自定义文件。像返回 Urifile:///storage/emulated/0/Android/data/com.example.testsapp/files/customFile.txt

fun createFile(context: Context): Uri {
        val appDir = context.getExternalFilesDir(null)
        val customFile = File(appDir, "customFile.txt")
        customFile.createNewFile()
        // writing to customFile via FileOutputStream(file)
        return Uri.fromFile(customFile)
    }

让用户选择一个自定义文件:

fun pickNewFile(fileUri: Uri) {
        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
        intent.addCategory(Intent.CATEGORY_OPENABLE)
        intent.type = "*/*"
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, fileUri)
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true)
        startActivityForResult(intent, FILE_PICKER_REQUEST_CODE)
    }

当 fileUrifile://格式化时,DocumentsProvider 将不会在文件目录中打开,而是显示默认目录。用户选择新的自定义文件后,onActivityResult方法将提供一个新的 Uri,如content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fcom.example.testsapp%2Ffiles%2FcustomFile.txt

当使用此 Uri withpickNewFile方法时,它将在文件目录中打开。

有没有办法将file://Uricontent://类型转换为 Uri 类型?

4

1 回答 1

-1

不可以。在存储访问框架中无法进行这种转换,因为内容 uri 可能指向存储文件、闪存驱动器上的文件甚至是云提供商

https://developer.android.com/guide/topics/providers/document-provider
于 2021-11-25T15:41:58.010 回答