在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
根据知识库内容,小米手机(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权限适配和相机调用方式导致的。以下是关键解决方案:
- 权限配置更新: 在manifest.json中需要配置Android 13+的新权限:
{
"permissions": {
"Android": [
"android.permission.CAMERA",
"android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_MEDIA_VIDEO",
"android.permission.READ_MEDIA_AUDIO"
]
}
}
-
移除不必要权限:
android.permission.READ_MEDIA_VISUAL_USER_SELECTED是Android 14新增的,但当前uni-app可能还不完全支持,建议先移除。 -
使用uni原生API: 建议使用uni的chooseImage替代plus.camera,代码更简洁且兼容性更好:
uni.chooseImage({
count: 1,
sourceType: ['camera'],
success: (res) => {
console.log('拍照成功:', res.tempFilePaths[0]);
},
fail: (err) => {
console.error('拍照失败:', err);
}
});
- 权限请求时机: 在调用相机前确保权限已获取,可以使用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();
}
}
});
}
});
- 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

