ContentResolver.query() on MediaStore Uri works only for Android API 31+ - MediaStore.getMediaUri() BUG?

67 Views Asked by At

I checked the following code and it works only for API 31+, for lower versions the Cursor is null

private fun getMediaInfo(context: Context, uri: Uri): Long? {
    try {
        context.contentResolver.query(
            uri,
            arrayOf(
                MediaStore.MediaColumns.DURATION
            ),
            null, null, null
        )?.use { cursor ->
            var duration: Long? = null
            if (cursor.moveToFirst()) {
                val durationColumnId =
                    cursor.getColumnIndex(MediaStore.MediaColumns.DURATION)
                if (durationColumnId != -1) {
                    duration = cursor.getLongOrNull(durationColumnId)
                }
                return duration
            }
        }
    } catch (e: Throwable) {
        e.printStackTrace()
    }
    return null
}

How can I use MediaStore for lower API versions?

p.s. I get Media Uri from DocumentProvider Uri after using MediaStore.getMediaUri(context, uri) (Android API 29+) content://com.android.externalstorage.documents/tree/primary%3AMovies/document/primary%3AMovies%2FVoiceRecorder%2FVoice%202024.02.19%2021_45_51.m4a

becomes:

content://media/external_primary/file/60

but it works only for Android API 31+, for 29, 30 Cursor is null.

Also I tried MediaStore.MediaColumns.BITRATE and this time I got exception

java.lang.IllegalArgumentException: Invalid column bitrate

On Android 30 Cursor is null.

For Android 31+ both BITRATE and DURATION work fine

0

There are 0 best solutions below