如何使用 Jetpack Compose 打开 Android 外部存储目录中的图像文件?

问题描述 投票:0回答:1

我正在将一个大型天文应用程序迁移到 Jetpack Compose。已经成功采取了几个复杂的步骤(迁移房间数据库、OpenGL 视图和渲染器、几个复杂的屏幕等)

但是,我无法实现从外部存储读取图像的基本功能。

我正在使用:

Android 10
READ_EXTERNAL_STORAGE is in the Manifest file
Accompanist permission : implementation "com.google.accompanist:accompanist-permissions:0.29.1-alpha"
Coil: implementation "io.coil-kt:coil-compose:2.2.2"

在这个测试可组合函数中,外部存储目录是可以访问的。该文件存在且大小正确,checkSelfPermission 测试结果授予权限。

但是文件不可读(图像是空的)

我可能遗漏了一些非常简单的东西,但几个小时后,我别无选择,非常感谢您的帮助。

@OptIn(ExperimentalMaterialApi::class, ExperimentalPermissionsApi::class)
@Composable
fun SheetContent() {

    val context = LocalContext.current

    val readExternalMemoryState = rememberPermissionState(
        Manifest.permission.READ_EXTERNAL_STORAGE
    )
    if (readExternalMemoryState.status.isGranted) {
        Text("Read External memory permission Granted")
    } else {
        AskPermission(permissionState = readExternalMemoryState)
    }

    val path = Environment.getExternalStorageDirectory().toString() + "/Download/"
    val file = File(path + "solar-system.png")
    val filesize = file.length()
    
    if (file.exists()) {
        Text("File exist with size: $filesize")
        when (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE
        )) {
            PackageManager.PERMISSION_GRANTED -> {
                //File read logic here
                Text("checkSelfPermission gives status: Granted")
                if (file.canRead()) {
                    Text("File can be read")
                    Image(
                        rememberAsyncImagePainter(file),
                        contentDescription = ""
                    )
                } else {
                    Text("File not readable")
                }
            }
        }
    } else {
        Text("Not available")
    }
}

输出:

Read External memory permission Granted
File exist with size: 20534
checkSelfPermission gives status: Granted
File not readable
android android-jetpack-compose android-permissions
1个回答
0
投票

试试这个下载目录路径:

   val downloadDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
© www.soinside.com 2019 - 2024. All rights reserved.