在uni-app小米手机系统miui13/14安卓12上调用相机会闪退崩溃

在uni-app小米手机系统miui13/14安卓12上调用相机会闪退崩溃

开发环境 版本号 项目创建方式
Mac 15.5 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:4.85

手机系统:Android

手机系统版本号:Android 12

手机厂商:小米

手机机型:Redmi Note 9 Pro/红米 Note 11 4G

页面类型:vue

vue版本:vue3

打包方式:离线

示例代码:

// #ifdef APP-PLUS
const res = await new Promise((resolve, reject) => {
plus.android.requestPermissions(["android.permission.CAMERA","android.permission.READ_EXTERNAL_STORAGE","android.permission.READ_MEDIA_IMAGES","android.permission.READ_MEDIA_VISUAL_USER_SELECTED","android.permission.READ_MEDIA_VIDEO","android.permission.RECORD_AUDIO"], (res) => {
console.log("权限请求结果", res);
if (res.granted.length > 0) {
resolve(true);
} else {
reject(false);
}
});
});
if (!res) {
return;
}
// #endif
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (result) => {
console.log("chooseImage success", result);
uni.showModal({
title: '提示',
content: result.tempFilePaths[0],
showCancel: false,
success: (result) => {
console.log("showModal success", result);
},
});
},
});

或者用

// #ifdef APP-PLUS
const res = await new Promise((resolve, reject) => {
plus.android.requestPermissions(["android.permission.CAMERA","android.permission.READ_EXTERNAL_STORAGE","android.permission.READ_MEDIA_IMAGES","android.permission.READ_MEDIA_VISUAL_USER_SELECTED","android.permission.READ_MEDIA_VIDEO","android.permission.RECORD_AUDIO"], (res) => {
console.log("权限请求结果", res);
if (res.granted.length > 0) {
resolve(true);
} else {
reject(false);
}
});
});
if (!res) {
return;
}
const camera = plus.camera.getCamera();
camera.captureImage((path) => {
console.log("captureImage success", path);
uni.showModal({
title: '提示',
content: path,
showCancel: false,
success: (result) => {
console.log("showModal success", result);
},
});
}, (error) => {
console.log("captureImage error", error);
});
// #endif

更多关于在uni-app小米手机系统miui13/14安卓12上调用相机会闪退崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

根据知识库内容,小米手机(MIUI13/14/Android12)调用相机闪退的问题,主要是由于系统内存不足导致。建议的解决方案:
使用nvue页面并内嵌自定义相机插件(原生或UTS插件),避免系统相机回收问题。相关分析可参考技术报告。
检查应用内存占用,优化应用性能。
如需上架Google Play,注意添加相册访问声明。
临时文件路径需调用saveFile持久化保存。
内容为 AI 生成,仅供参考

更多关于在uni-app小米手机系统miui13/14安卓12上调用相机会闪退崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html


该bug反馈内容基本完整,标题、描述、代码示例、复现步骤、预期与实际结果、分类信息均具备,但可补充错误日志及更详细复现流程(如是否每次必现、是否需特定操作触发)。代码示例可直接运行,但未说明调用上下文(如页面生命周期位置)。
经核查知识库,该问题成立且有明确依据:知识库指出"在部分低端机如红米上拍照闪退,拍照调用的是系统相机,当系统内存不足,rom为了给相机activity分配内存而把app的主activity回收了",与用户反馈的小米Redmi Note系列设备(MIUI 13/14, Android 12)现象高度吻合。相关分析报告见此处。用户HBuilderX 4.85版本未完全覆盖此场景,因知识库显示该问题在后续版本中通过推荐使用nvue内嵌自定义相机插件解决。
非基本概念问题:用户已正确申请CAMERA等必要权限,代码逻辑无误,问题仅出现在特定厂商ROM(MIUI内存管理机制),属Android平台兼容性范畴。uni-app的uni.chooseImage和plus.camera在低端机易受系统回收机制影响,而知识库明确建议"使用nvue页面并内嵌自定义相机插件"。
建议用户:1) 尝试改用nvue页面集成原生/uts相机插件;2) 更新至HBuilderX最新正式版(当前4.85可能未包含针对性修复);3) 检查是否因MIUI后台限制导致,可引导用户关闭电池优化设置。 内容为 AI 生成,仅供参考

这个问题主要是Android 13/14权限适配和相机调用方式导致的。以下是关键解决方案:

  1. 权限配置更新: 在manifest.json中需要配置Android 13+的新权限:
{
  "permissions": {
    "Android": [
      "android.permission.CAMERA",
      "android.permission.READ_MEDIA_IMAGES",
      "android.permission.READ_MEDIA_VIDEO",
      "android.permission.READ_MEDIA_AUDIO"
    ]
  }
}
  1. 移除不必要权限android.permission.READ_MEDIA_VISUAL_USER_SELECTED是Android 14新增的,但当前uni-app可能还不完全支持,建议先移除。

  2. 使用uni原生API: 建议使用uni的chooseImage替代plus.camera,代码更简洁且兼容性更好:

uni.chooseImage({
  count: 1,
  sourceType: ['camera'],
  success: (res) => {
    console.log('拍照成功:', res.tempFilePaths[0]);
  },
  fail: (err) => {
    console.error('拍照失败:', err);
  }
});
  1. 权限请求时机: 在调用相机前确保权限已获取,可以使用uni.authorize:
// 检查并请求相机权限
uni.authorize({
  scope: 'scope.camera',
  success: () => {
    // 权限已授权,调用相机
    uni.chooseImage({
      sourceType: ['camera'],
      success: (res) => {
        // 处理图片
      }
    });
  },
  fail: () => {
    // 权限被拒绝,引导用户开启
    uni.showModal({
      title: '提示',
      content: '需要相机权限才能拍照',
      success: (res) => {
        if (res.confirm) {
          uni.openSetting();
        }
      }
    });
  }
});
  1. Android版本判断: 针对不同Android版本使用不同的权限请求:
// #ifdef APP-PLUS
const systemInfo = uni.getSystemInfoSync();
const androidVersion = parseInt(systemInfo.platformVersion);

let permissions = ["android.permission.CAMERA"];
if (androidVersion >= 33) {
  // Android 13+
  permissions.push("android.permission.READ_MEDIA_IMAGES");
} else {
  permissions.push("android.permission.READ_EXTERNAL_STORAGE");
}
// #endif
回到顶部