我正在努力在我的音频/视频播放器应用程序上提供 Android 11 支持。我主要担心的实际上是不要激怒谷歌部落,因为他们不允许玩家应用程序获得All files access
许可。我不希望我的应用在 Google 商店发布时被拒绝。
在以前的 API 中,我使用的是WRITE_EXTERNAL_STORAGE
权限,包括 Android 10(我选择退出范围存储)。不过,我不知道如何处理Android 11,而不会在Google商店发布时拒绝我的应用程序。我了解到查询MediaStore
记录需要READ_EXTERNAL_STORAGE
权限,我有以下问题:
- Google 是否可以接受在 Android 11 上的运行时请求
READ_EXTERNAL_STORAGE
(当我在他们的商店中发布我的应用时)? - 我可以请求运行时
WRITE_EXTERNAL_STORAGE
权限而不是所有 API 的READ_EXTERNAL_STORAGE
权限,Android 11 设备上的系统会用该权限代替READ_EXTERNAL_STORAGE
,还是需要添加在 Android 11 设备上请求READ_EXTERNAL_STORAGE
的条件。 - Google 是否可以接受在 Android 11 上的运行时请求
WRITE_EXTERNAL_STORAGE
(当我在他们的商店中发布我的应用时)?
您可以使用所有这些权限,而不会受到Google的任何禁止。 您不能/不应该使用MANAGE_EXTERNAL_STORAGE
,专用于作用域存储和文件管理应用程序,Antivirs和其他"特权"软件的新perm
-
这是获取所有视频列表的功能
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