Android 14中加载本应用录制的视频为何无需媒体访问权限?
问题说明
我的应用支持应用内录制视频并保存到设备,同时能加载设备上的视频列表,操作流程如下:
- 打开应用
- 在Android 14系统中,选择媒体访问权限对话框里的「选择照片和视频」选项
- 在应用内录制视频并保存,之后加载已保存的视频列表
- 此时应用无需权限就能列出并播放这些自己录制的文件
请问:为什么加载或播放本应用录制的视频时不需要权限?
以下是我用来加载视频文件的代码:
fun getVideoFiles(context: Context) : List<String> { val videoItemHashSet = HashSet<String>() val projection = arrayOf(MediaStore.Video.VideoColumns.DATA, MediaStore.Video.Media.DISPLAY_NAME) val collection: Uri = 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: Cursor? = context.contentResolver.query(collection, projection, null, null, null) try { if (cursor != null) { if (cursor.count > 0) { cursor.moveToFirst() do { videoItemHashSet.add(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))) } while (cursor.moveToNext()) } cursor.close() } } catch (e: Exception) { e.printStackTrace() } return ArrayList(videoItemHashSet) }
原因解析
这是Android系统的自有文件豁免权限机制导致的,核心逻辑有两点:
文件归属权与沙盒规则
当你的应用通过自身录制并把视频保存到公共媒体库(比如MediaStore)时,系统会自动标记这些文件的「归属应用」为你的APP。对于这类由应用自己创建的媒体文件,Android 10(API 29)及以上版本默认允许应用直接访问,不需要额外的READ_MEDIA_VIDEO或旧版的READ_EXTERNAL_STORAGE权限——哪怕你是通过MediaStore查询获取这些文件,系统也会自动放行。Android 14权限细化后的独立逻辑
你选择的「选择照片和视频」权限,本质是让应用仅能访问用户手动选择的媒体文件,但这和应用自身创建的文件权限是完全分开的。系统对应用自有创建的媒体文件,会跳过权限校验,因为系统能明确识别这些文件是你的APP生成的,不存在越权访问的风险。
另外要注意:你的代码里使用的MediaStore.Video.VideoColumns.DATA字段,在Android Q及以上版本已经被废弃,建议改用ContentUris.withAppendedId()获取文件的Uri来访问,避免在高版本系统出现兼容性问题。
内容的提问来源于stack exchange,提问作者sbkim
相关产品推荐
相关产品推荐

