Fixing Bug Android 13 Invalid URI: content://media

Hi gaes, kali ini saya ingin berbagi pengalaman melakukan troubleshooting terkait upload image di android 13. Singkat cerita aplikasi mobile yang saya bangun sudah lama berjalan stabil di android versi 8 s.d 12, namun petaka muncul mana kala android 13 launching, dan salah satu dampak yang terkena adalah proses pembacaan real path setelah berhasil melakukan file picker, muncul error seperti ini

error Invalid URI: content://media/picker/0/com.android.providers.media.photopicker/media/

Real path adalah versi full path alamat file yang bisa kita gunakan untuk melanjutkan proses upload, untuk versi android 12 ke bawah menggunakan;

DocumentsContract.getDocumentId(uri)

berikut fungsi lengkapnya;

    @SuppressLint("Range")
    fun getImageRealPath(uri: Uri): String? {
        wholeID = DocumentsContract.getDocumentId(uri)
        // Split at colon, use second item in the array
        id = wholeID.split(":").toTypedArray()[1]
        column = arrayOf(MediaStore.Images.Media.DATA)
        // where id is equal to
        sel = MediaStore.Images.Media._ID + "=?"
        cursor = context.contentResolver.query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            column,
            sel,
            arrayOf(id),
            null
        )
        cursor?.let {
            if (it.moveToFirst()) {
                filePath = it.getString(it.getColumnIndex(column[0]))
            }
            it.close()
        }
        return filePath
    }

versi android 13 ke atas menggunakan

context.contentResolver.query(contentURI, null, null, null, null)

berikut fungsi lengkapnya;

    fun getImageRealPath13(context: Context, contentURI: Uri): String? {
        val result: String?
        val cursor: Cursor? = context.contentResolver.query(contentURI, null, null, null, null)
        if (cursor == null) { // Source is Dropbox or other similar local file path
            result = contentURI.path
        } else {
            cursor.moveToFirst()
            val idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
            result = cursor.getString(idx)
            cursor.close()
        }
        return result
    }

Selamat mencoba!


Post a Comment

Previous Next

نموذج الاتصال