图库选择器在 Android 10 上返回带有文件方案的 Uri,如何读取它?

Efi*_*ndr 2 android android-contentresolver kotlin android-external-storage android-10.0

我的应用程序的 targetSdkVersion = 29(新的范围存储策略)并且没有在清单中启用 requestlegacyexternalstorage 标志(我不想启用它)。

我尝试编写意图的方法:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
Run Code Online (Sandbox Code Playgroud)

也试过这个

val galleryIntent = Intent(Intent.ACTION_PICK).apply {
    type = PICK_INTENT_TYPE
}
flowInterruptBlocker?.blockFlowInterruption()
startActivityForResult(galleryIntent, GALLERY_INTENT_REQUEST_CODE)
Run Code Online (Sandbox Code Playgroud)

还试图添加一个CATEGORY_OPENABLE意图。这些都不起作用。

因此,当我发送意图从图库中选择图像时,游戏市场中的一些应用程序会返回一个带有文件方案的 Uri,例如:file:///storage/emulated/0/Download/sample.jpg

当我尝试将其转换为位图(用于设置为 imageView)时,我收到 EACCES(权限被拒绝)异常。

我试着用以下方式阅读它:

java.File Api

contentResolver.openInpuStream()

contentResolver.openFileDescriptor()

ImageDecoder
Run Code Online (Sandbox Code Playgroud)

没有任何帮助。正如我所看到的,如果我的清单中没有启用 requestlegacyexternalstorage 标志,我将无法在 android 10(针对 29 sdk)上使用文件方案读取 Uri。

如果我错了,请帮助我弄清楚如何阅读它。

关于它的神秘事情,带有针对 29 sdk 的应用程序的 android 11 模拟器可以在没有 requestlegacyexternalstorage 标志的情况下读取这些类型的 Uri。

是的,我已授予 READ/WRITE_EXTERNAL_STORAGE 权限。

Com*_*are 5

一些来自游戏市场的应用程序返回一个带有文件方案的 Uri,例如:file:///storage/emulated/0/Download/sample.jpg

一些应用程序是由缺乏经验的开发人员编写的。

如果我错了,请帮助我弄清楚如何阅读它。

在 Android 10 上,如果Uri没有android:requestLegacyExternalStorage="true".

关于它的神秘事情,带有针对 29 sdk 的应用程序的 android 11 模拟器可以在没有 requestlegacyexternalstorage 标志的情况下读取这些类型的 Uri。

Android 11 中引入的“原始路径”功能意味着READ_EXTERNAL_STORAGE再次正常工作。因此,推荐的方法是 requestREAD_EXTERNAL_STORAGE use android:requestLegacyExternalStorage="true",以确保 Android 版本之间的一致性。