uni-app中targetSdkVersion=30时,运行在android 11版本的手机上video组件播放崩溃
uni-app中targetSdkVersion=30时,运行在android 11版本的手机上video组件播放崩溃
很多应用市场要求targetSdkVersion=30
但当运行在android 11手机上,video组件播放造成app崩溃,这种现象是必现的。
请官方帮忙尽快修复下!感谢了!
| 信息类型 | 信息内容 |
|---|---|
| 开发环境 | android 11 |
| 版本号 | targetSdkVersion=30 |
bug已确认。 稍后会版本会修复这个问题
更多关于uni-app中targetSdkVersion=30时,运行在android 11版本的手机上video组件播放崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html
多谢大佬!
我这里测试。没复现这个问题。 你发一下可以复现问题的demo出来 apk也可以
您好,经过多次测试,终于找到原因了,是由于云打包,勾选了"abiFilters" : [ “armeabi-v7a”, “arm64-v8a” ], 2种cpu类型导致video组件无法在tagetsdkversion=30 和android 11版本上播放视频崩溃,去掉64位cpu,就正常了。可是需要将app提交到谷歌,2种cpu必须选择。官方能够帮忙解决下吗? 急着上谷歌。 谢谢您了。
回复 maple: 内测版本已修复这个问题。 联系我 打包验证一下
回复 DCloud_Android_DQQ: 好的,已经私信你了
官方大佬能够帮忙解决下吗?这种video播放崩溃应该和arm64位的so包,运行在tagetSDK=30 & android=11版本有关系。
这种现象,我用uni-app官方例子云打包测试,也出现崩溃情况,只要满足下面4个条件必崩溃。
1、tagetSDKVersion=30
2、勾选ARM64位CPU;
3、运行在android 11版本手机上;
4、video的src为网络地址;
帮忙看下,万分谢谢!
有官方的人解答下吗?谢谢了!
自顶,有官方大佬知道这个问题吗?
bug 已修复
问题分析:
在 Android 11(API 30)中,系统对存储权限(Scoped Storage) 和媒体文件访问规则进行了更严格的限制。当 targetSdkVersion 设置为 30 时,应用默认启用这些新规则,可能导致 video 组件访问本地视频文件时因权限问题崩溃。
主要原因:
- Scoped Storage 限制:应用无法直接通过文件路径(如
file://)访问外部存储中的媒体文件,除非使用MediaStoreAPI 或申请MANAGE_EXTERNAL_STORAGE权限。 - 权限模型变更:
READ_EXTERNAL_STORAGE权限在 Android 11 中仅能访问媒体文件类型(图片、视频、音频),但需配合MediaStore使用。 - 视频路径问题:如果
video组件的src使用本地文件路径(非网络地址),且路径未适配 Android 11 的规则,会触发系统拒绝访问,导致播放器崩溃。
解决方案:
-
使用
MediaStore获取视频 URI
将本地视频文件路径转换为Content URI,例如:// 通过 uni.chooseVideo 或 MediaStore API 获取视频的 Content URI const videoUri = 'content://media/external/video/media/123'; // 示例URI在
video组件中直接使用该 URI 作为源。 -
适配网络或沙箱路径
- 网络视频:直接使用
http://或https://链接。 - 沙箱内视频:将视频文件放到应用私有目录(如
uni.env.USER_DATA_PATH)中,通过相对路径访问。
- 网络视频:直接使用
-
临时兼容方案(不推荐长期使用)
在manifest.json中配置android:requestLegacyExternalStorage="true"以暂时禁用 Scoped Storage,但此属性仅对 Android 10 有效,在 Android 11 中可能失效。 -
检查权限动态申请
确保在播放前已动态申请READ_EXTERNAL_STORAGE权限(Android 11 需在manifest.json中声明)。
示例代码(获取视频 URI 并播放):
// 选择视频文件获取 Content URI
uni.chooseVideo({
success: (res) => {
this.videoSrc = res.tempFilePath; // 临时路径(沙箱内)
// 或使用 res.tempFilePaths[0](多选时)
}
});
在模板中绑定:
<video :src="videoSrc" controls></video>

