uni-app 安卓内嵌项目使用uni.chooseImage无法打开相机
uni-app 安卓内嵌项目使用uni.chooseImage无法打开相机
操作步骤:
- uni-app项目中的manifest文件配置相机权限、sd卡访问权限;
- 安卓sdk开启相机权限、sd卡访问权限;
- 先真机连接HbuilderX调试,可拍照;
- 使用wgt包方式打包uni-app项目,放入安卓项目中,作为内嵌小程序,进一步打包成APP;
- 安卓APP中打开相机失败。
预期结果:
正常询问相机权限,点击允许拍照之后可以使用拍照功能。
实际结果:
只弹出了相机权限申请弹窗,点击允许拍照之后没有反应了,无法启用相机。
bug描述:
背景:安卓端内嵌uni-app项目,使用wgt打包方式嵌入安卓原生sdk中,已经在uni-app项目中的manifest.json中打开了相机权限,并且安卓端也做了所有相关权限配置。表现:在HbuilderX中连接手机调试可以打开拍照,但是安卓打包之后仍旧打不开相机拍照。配置如下:
uni-app配置:
{
"name" : "MobileEShop",
"appid" : "__UNI__2609B62",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
"networkTimeout" : {
"request" : 300000 //多长时间算超时(单位毫秒) 设置5分钟
},
/* 5+App特有相关 */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* 模块配置 */
"modules" : {
"UIWebview" : {},
"Statistic" : {}
},
/* 应用发布信息 */
"distribute" : {
/* android打包配置 */
"android" : {
"permissions" : [
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
]
},
/* ios打包配置 */
"ios" : {},
/* SDK配置 */
"sdkConfigs" : {
"ad" : {},
"statics" : {}
}
}
},
/* 快应用特有相关 */
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "2",
"h5" : {
"port" : 8086 //浏览器运行端口
}
}
安卓端配置:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.****.****.fileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
您好,请问解决了吗?我也遇到了这个问题.
看下打包模块配置,有没有勾选相应的模块
现在是2024年了,我也遇到了类似问题,通过uni.chooseImage打开相机偶尔会一片黑,偶发的,无法复现,也没找到解决方案
我最近也遇到了这个问题,现在已经解决了,参考一下我的做法,添加权限声明代码,release包可以正常调用相机了,亲测有效。 我的HBuilderX和离线SDK版本都是4.3.6,在android studio 打开SDK -> src/main/AndroidManifest.xml,然后在 <manifest>标签中添加以下代码: …
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.READ_LOGS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.telephony" android:required="false" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" /> ... </manifest>在uni-app中,如果遇到在安卓内嵌项目中uni.chooseImage
无法打开相机的问题,通常可能是由于权限配置或API调用方式不正确导致的。以下是一些可能的原因及相应的代码示例,帮助你检查和解决问题。
1. 确保已申请相机权限
首先,确保你的应用已经在manifest.json
中正确配置了相机权限。对于Android平台,你需要添加如下配置:
"mp-weixin": { // 这里以微信小程序为例,其他平台类似
"appid": "your-app-id",
"setting": {
"requestDomain": [],
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序相机功能"
},
"scope.camera": {
"desc": "你的相机将用于拍照"
}
}
}
},
"plus": {
"distribute": {
"android": {
"permissions": [
"android.permission.CAMERA"
]
}
}
}
注意:对于不同的平台(如H5、App等),权限配置方式可能有所不同,请参考uni-app官方文档进行配置。
2. 正确调用uni.chooseImage
在调用uni.chooseImage
时,确保传入了正确的参数来允许用户选择相机。以下是一个示例代码:
uni.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['camera'], // 从相机选择
success: function (res) {
console.log(res.tempFilePaths);
},
fail: function (err) {
console.error(err);
}
});
在上面的代码中,sourceType: ['camera']
指定了只从相机选择图片。如果你想同时允许从相册选择,可以添加'album'
到数组中,如sourceType: ['camera', 'album']
。
3. 检查AndroidManifest.xml
在某些情况下,你可能需要手动检查或修改生成的AndroidManifest.xml
文件,确保相机权限已被正确声明。这通常发生在自定义原生插件或深度集成Android原生功能时。
4. 调试与日志
如果上述步骤都无法解决问题,建议查看应用的日志输出,检查是否有关于权限拒绝或API调用失败的错误信息。这些信息可以帮助你进一步定位问题。
通过上述步骤,你应该能够解决在uni-app安卓内嵌项目中uni.chooseImage
无法打开相机的问题。如果问题依旧存在,请考虑查看uni-app的官方社区或提交issue寻求帮助。