在 Android 11 上正确查询媒体商店记录



我正在努力在我的音频/视频播放器应用程序上提供 Android 11 支持。我主要担心的实际上是不要激怒谷歌部落,因为他们不允许玩家应用程序获得All files access许可。我不希望我的应用在 Google 商店发布时被拒绝。

在以前的 API 中,我使用的是WRITE_EXTERNAL_STORAGE权限,包括 Android 10(我选择退出范围存储)。不过,我不知道如何处理Android 11,而不会在Google商店发布时拒绝我的应用程序。我了解到查询MediaStore记录需要READ_EXTERNAL_STORAGE权限,我有以下问题:

  1. Google 是否可以接受在 Android 11 上的运行时请求READ_EXTERNAL_STORAGE(当我在他们的商店中发布我的应用时)?
  2. 我可以请求运行时WRITE_EXTERNAL_STORAGE权限而不是所有 API 的READ_EXTERNAL_STORAGE权限,Android 11 设备上的系统会用该权限代替READ_EXTERNAL_STORAGE,还是需要添加在 Android 11 设备上请求READ_EXTERNAL_STORAGE的条件。
  3. Google 是否可以接受在 Android 11 上的运行时请求WRITE_EXTERNAL_STORAGE(当我在他们的商店中发布我的应用时)?

您可以使用所有这些权限,而不会受到Google的任何禁止。 您不能/不应该使用MANAGE_EXTERNAL_STORAGE,专用于作用域存储和文件管理应用程序,Antivirs和其他"特权"软件的新perm

  1. 这是获取所有视频列表的功能

    fun getVideo():ArrayList {

    val   marrayList = ArrayList<Video>()
    val contentResolver =context?.contentResolver
    val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
    val selection = "${MediaStore.Video.Media.DURATION} >= ?"
    val selectionArgs = arrayOf(
    TimeUnit.MILLISECONDS.convert(2, TimeUnit.SECONDS).toString()
    )
    val sortOrder = "${MediaStore.Video.Media.DISPLAY_NAME} ASC"
    val collection =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    MediaStore.Video.Media.getContentUri(
    MediaStore.VOLUME_EXTERNAL
    )
    } else {
    MediaStore.Video.Media.EXTERNAL_CONTENT_URI
    }
    val cursor = contentResolver?.query(collection, null, selection, selectionArgs, sortOrder)
    if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) {
    val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)
    val nameColumn =
    cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)
    val titleCol =cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)
    val date=cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_ADDED)
    val durationColumn =
    cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)
    val sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)
    while (cursor.moveToNext()) {
    val videoPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))
    val id = cursor.getLong(idColumn)
    val title=cursor.getString(titleCol)
    val name = cursor.getString(nameColumn)
    val duration = cursor.getInt(durationColumn)
    val mdate=cursor.getString(date)
    val size = cursor.getString(sizeColumn)
    val thumb =
    ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id)
    var duration_formatted: String
    val sec: Int = duration / 1000 % 60
    val min: Int = duration / (1000 * 60) % 60
    val hrs: Int = duration / (1000 * 60 * 60)
    duration_formatted = if (hrs == 0) {
    min.toString() + ":" + String.format(Locale.UK, "%02d", sec)
    } else {
    hrs.toString() + ":" + String.format(
    Locale.UK,
    "%02d",
    min
    ) + ":" + String.format(
    Locale.UK, "%02d", sec
    )
    }
    val folder = Video(thumb.toString(),id,title,name,size, duration_formatted, videoPath, mdate)
    marrayList.add(folder)
    }
    cursor.close()
    }
    return marrayList
    

    }

2.这是视频播放器项目的所有[源代码]1

最新更新