无法在 android API 29 上获取文件

Can not get file on android API 29 up

我无法读取正在保存的文件。我已声明并请求存储权限。

fun saveImage(bitmap: Bitmap, context: Context): String {
    if (android.os.Build.VERSION.SDK_INT >= 29) {
        val values = contentValues()
        values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/" + context.getString(R.string.app_name))
        values.put(MediaStore.Images.Media.IS_PENDING, true)
        // RELATIVE_PATH and IS_PENDING are introduced in API 29.

        val uri: Uri? = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values).also { uri ->
            if (uri != null) {


                if (uri != null) {
                    saveImageToStream(bitmap, context.contentResolver.openOutputStream(uri))
                    values.put(MediaStore.Images.Media.IS_PENDING, false)
                    context.contentResolver.update(uri, values, null, null)

                }


                //val split = file.path.split(":".toRegex()).toTypedArray() //split the path.
                Log.d(
                    "Tag",
                    "v--- uri.path - ${uri.path}, "
                )

                return uri.path.toString() //assign it to a string(your choice).


            }
        }

    } else { // below API 29 }
}

然后在 onCreate 或我想访问该文件并在预览中显示的任何其他方法中。

            val previousPath = """/external/images/media/356""" //preferenceManager.getString(...)
            //val file  = File(path)

            //previewImage.setImageURI(Uri.parse(previousPath))
       val file  = FileUtils().getFile(applicationContext, Uri.parse(previousPath))
                            Log.d("Tag", "Yo --- "+file?.path + " , "+ file?.name)


//  val myBitmap = BitmapFactory.decodeFile()
// previewImage.setImageBitmap()

但这总是空的。使用 ,我得到空指针异常。我需要将文件上传到服务器。我怎样才能得到这个文件?

val uri: Uri? = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)

您使用获得的 uri 将您的文件内容保存到存储:

 context.contentResolver.openOutputStream(uri)

现在,如果您想读取该文件,请再次使用相同的 uri。只需使用:

context.contentResolver.openInputStream(uri)

使用相同的 uri!

不要乱动文件 class。