uni-app中targetSdkVersion=30时,运行在android 11版本的手机上video组件播放崩溃

uni-app中targetSdkVersion=30时,运行在android 11版本的手机上video组件播放崩溃

很多应用市场要求targetSdkVersion=30
但当运行在android 11手机上,video组件播放造成app崩溃,这种现象是必现的。
请官方帮忙尽快修复下!感谢了!

信息类型 信息内容
开发环境 android 11
版本号 targetSdkVersion=30
11 回复

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 组件访问本地视频文件时因权限问题崩溃。

主要原因:

  1. Scoped Storage 限制:应用无法直接通过文件路径(如 file://)访问外部存储中的媒体文件,除非使用 MediaStore API 或申请 MANAGE_EXTERNAL_STORAGE 权限。
  2. 权限模型变更READ_EXTERNAL_STORAGE 权限在 Android 11 中仅能访问媒体文件类型(图片、视频、音频),但需配合 MediaStore 使用。
  3. 视频路径问题:如果 video 组件的 src 使用本地文件路径(非网络地址),且路径未适配 Android 11 的规则,会触发系统拒绝访问,导致播放器崩溃。

解决方案:

  1. 使用 MediaStore 获取视频 URI
    将本地视频文件路径转换为 Content URI,例如:

    // 通过 uni.chooseVideo 或 MediaStore API 获取视频的 Content URI
    const videoUri = 'content://media/external/video/media/123'; // 示例URI
    

    video 组件中直接使用该 URI 作为源。

  2. 适配网络或沙箱路径

    • 网络视频:直接使用 http://https:// 链接。
    • 沙箱内视频:将视频文件放到应用私有目录(如 uni.env.USER_DATA_PATH)中,通过相对路径访问。
  3. 临时兼容方案(不推荐长期使用)
    manifest.json 中配置 android:requestLegacyExternalStorage="true" 以暂时禁用 Scoped Storage,但此属性仅对 Android 10 有效,在 Android 11 中可能失效

  4. 检查权限动态申请
    确保在播放前已动态申请 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>
回到顶部