Android应用从READ_MEDIA_VIDEO权限迁移的技术咨询
嘿,我之前帮朋友处理过同款旧Android应用的权限适配问题,刚好能给你一些接地气的实用建议,完全贴合你这个2014年的老项目场景:
先明确核心矛盾
Google Play发通知找你,大概率是因为你的权限声明或申请逻辑没踩中Android 13+的合规点——毕竟你的app是自己录视频并存到Pictures子文件夹,权限选择其实有更精准的方案,不一定非得硬扛READ_MEDIA_VIDEO的合规问题。
分版本适配的实操步骤
我给你拆成不同Android版本的处理方式,都是能直接套进你老项目的:
Android 12及以下版本
继续用你原来的READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限就行,但要在Manifest里加个版本限制,避免高版本系统乱申请:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />动态申请逻辑和你之前写的保持一致,不用大改,省得折腾老代码。
Android 13及以上版本
这里有两个可选方案,你看自己代码复杂度挑:优化READ_MEDIA_VIDEO权限的使用(改动最小)
- 先在Manifest里把权限声明写对:
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> - 重点改申请时机:别一启动app就弹权限框,一定要和用户操作绑定——比如用户点击「查看我的录制视频」按钮时再申请。Google Play对权限的「必要性」卡得很严,你得让审核员看到这个权限是用户主动触发的,不是乱要的。
- 额外小技巧:因为视频是你自己app录的,存到Pictures子文件夹时,记得在MediaStore里标记好归属,读取时过滤自己app的视频,就算用户拒绝权限,也能读到自己录的内容(这个需要你在存视频时把app包名关联到媒体条目里)。
- 先在Manifest里把权限声明写对:
改用MediaStore API操作(推荐,合规性拉满)
既然视频是自己录的,不如直接用MediaStore API来存,这样Android 13+下读取自己的视频根本不需要申请READ_MEDIA_VIDEO权限——系统默认允许app访问自己插入到MediaStore的媒体文件,完美绕开权限合规问题。
给你个简单的存视频示例代码,直接替换你原来的文件写入逻辑就行:val videoValues = ContentValues().apply { put(MediaStore.Video.Media.DISPLAY_NAME, "my_record_${System.currentTimeMillis()}.mp4") put(MediaStore.Video.Media.MIME_TYPE, "video/mp4") put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/你的专属子文件夹名") } val contentUri = contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoValues) // 接下来把录制好的视频数据写入contentUri对应的输出流读取的时候,直接通过MediaStore查询你那个专属子文件夹下的视频,不用申请任何额外权限,Google Play审核绝对过。
最后必做的合规检查
- 一定要在app的隐私政策里写清楚权限用途:比如「本app申请的视频读取权限,仅用于展示您通过本app录制并保存的视频,不会访问其他来源的视频内容」,别漏了这个,不然审核容易卡。
- 测试时一定要覆盖权限被拒绝的场景:比如用户点了拒绝,app不能崩溃,要友好提示用户去系统设置开权限,或者给个替代方案(比如提示「您拒绝了权限,暂时无法查看录制的视频,请在设置中开启权限」)。
内容来源于stack exchange

