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