uni-app 安卓内嵌项目使用uni.chooseImage无法打开相机

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app 安卓内嵌项目使用uni.chooseImage无法打开相机

操作步骤:

  1. uni-app项目中的manifest文件配置相机权限、sd卡访问权限;
  2. 安卓sdk开启相机权限、sd卡访问权限;
  3. 先真机连接HbuilderX调试,可拍照;
  4. 使用wgt包方式打包uni-app项目,放入安卓项目中,作为内嵌小程序,进一步打包成APP;
  5. 安卓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"/>

5 回复

您好,请问解决了吗?我也遇到了这个问题.


看下打包模块配置,有没有勾选相应的模块

现在是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寻求帮助。

回到顶部