uni-app 安卓10 Android 10 调用相机拍照授权后出错,再次调用无反应

uni-app 安卓10 Android 10 调用相机拍照授权后出错,再次调用无反应

产品分类 版本号 手机系统 手机系统版本号 手机厂商 手机机型 打包方式
HTML5+ 3.1.6 Android Android 10 华为 MRX-AN9 离线
示例代码:

```plus.camera.getCamera().captureImage(function(p) {
    plus.io.resolveLocalFileSystemURL(p, function(entry) {  
        //获取拍照后图片本地路径   
        var path = entry.toLocalURL();  
        //单位名称图片选择拍照时  
        if (selectNum == 0) {  
            //将单位名称图片DIV样式修改为拍照后的样式  
            var unit = document.getElementById("unit");  
            unit.setAttribute("class", "add-btn");  
            //创建包裹image以及a标签的Div  
            var addImgDiv = document.createElement("div");  
            //创建IMage标签  
            var unitImage = document.createElement("img");  
            //压缩文件  
            compress(unitImage, path);  
            //将图片路径放在隐藏的Input内  
            document.getElementById("unitImageUrl").value = p + ";";  
            document.getElementById("unit").insertBefore(addImgDiv, document  
                .getElementById("addUnitImage"));  
            addImgDiv.appendChild(unitImage);  
            imageCss(unitImage, selectNum);  
            //选择两张照片后将添加按钮隐藏  
            if (unitImageNum == 1) {  
                document.getElementById("addUnitImage").setAttribute("style",  
                    "display: none;")  
            }  

        } else {  
            //检查过程选择拍照时  
            //将检查过程图片DIV样式修改为拍照后的样式  
            var check = document.getElementById("check");  
            check.setAttribute("class", "add-btn");  
            //创建包裹image以及a标签的Div  
            var addImgDiv = document.createElement("div");  
            var checkImage = document.createElement("img");  
            //压缩文件  
            compress(checkImage, path);  
            //将图片路径放在隐藏的Input内  
            document.getElementById("checkImageUrl").value += p + ";";  
            document.getElementById("check").insertBefore(addImgDiv, document  
                .getElementById("addCheckImage"));  
            addImgDiv.appendChild(checkImage);  
            imageCss(checkImage, selectNum);  
            //4张照片时隐藏添加按钮  
            if (checkImageNum == 3) {  
                document.getElementById("addCheckImage").setAttribute("style",  
                    "display: none;")  
            }  

        }  

    })  
}, function(error) {  
    var code = error.code; // 错误编码  
    var message = error.message; // 错误描述信息  
    alert(message);  
}, {  
    index: 1  
});

操作步骤:

  • 在小米、华为 安卓10 调用拍照提示授权出现此错误,授权后再次调用无反应,无报错,在安卓5.1的华为平板上则无此问题

预期结果:

  • 调用相机拍照

实际结果:

  • 相机调用不成功

bug描述:

2021-03-20 13:35:04.851 19692-20121/c.a.p.b.d.d E/libc: Access denied finding property "vendor.camera.hal1.packagelist"
2021-03-20 13:35:04.862 19692-20121/c.a.p.b.d.d W/CameraBase: An error occurred while connecting to camera 0: Status(-8, EX_SERVICE_SPECIFIC): '1: validateClientPermissionsLocked:1026: Caller "c.a.p.b.d.d" (PID 10242, UID 19692) cannot open camera "0" without camera permission'
2021-03-20 13:35:04.863 19692-20121/c.a.p.b.d.d W/System.err: java.lang.RuntimeException: Fail to connect to camera service
2021-03-20 13:35:04.863 19692-20121/c.a.p.b.d.d W/System.err:     at android.hardware.Camera.<init>(Camera.java:637)
2021-03-20 13:35:04.863 19692-20121/c.a.p.b.d.d W/System.err:     at android.hardware.Camera.open(Camera.java:476)
2021-03-20 13:35:04.864 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.js.camera.a.<init>(SourceFile:28)
2021-03-20 13:35:04.864 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.js.camera.CameraFeatureImpl.execute(SourceFile:165)
2021-03-20 13:35:04.864 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.h.b.a(SourceFile:137)
2021-03-20 13:35:04.864 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.h.b.b(SourceFile:3)
2021-03-20 13:35:04.865 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.h.b.processEvent(SourceFile:144)
2021-03-20 13:35:04.865 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.f.b.c.dispatchEvent(SourceFile:22)
2021-03-20 13:35:04.865 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.common.core.ui.l.processEvent(SourceFile:2)
2021-03-20 13:35:04.866 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.common.core.ui.h.exec(SourceFile:10)
2021-03-20 13:35:04.866 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.common.core.ui.h.prompt(SourceFile:18)
2021-03-20 13:35:04.866 19692-20121/c.a.p.b.d.d W/System.err:     at io.dcloud.common.util.Birdge.prompt(SourceFile:1)
2021-03-20 13:35:04.867 19692-20121/c.a.p.b.d.d W/System.err:     at android.os.MessageQueue.nativePollOnce(Native Method)
2021-03-20 13:35:04.867 19692-20121/c.a.p.b.d.d W/System.err:     at android.os.MessageQueue.next(MessageQueue.java:336)
2021-03-20 13:35:04.867 19692-20121/c.a.p.b.d.d W/System.err:     at android.os.Looper.loop(Looper.java:181)
2021-03-20 13:35:04.867 19692-20121/c.a.p.b.d.d W/System.err:     at android.os.HandlerThread.run(HandlerThread.java:67)
2021-03-20 13:35:06.900 19692-19692/c.a.p.b.d.d E/Html5Plus-onResume: 1616218506900

更多关于uni-app 安卓10 Android 10 调用相机拍照授权后出错,再次调用无反应的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

W/CameraBase: An error occurred while connecting to camera 0: Status(-8, EX_SERVICE_SPECIFIC): ‘1: validateClientPermissionsLocked:1073: Caller “com.hola.cc” (PID 10171, UID 6939) cannot open camera “0” without camera permission’ W/System.err: java.lang.RuntimeException: Fail to connect to camera service W/System.err: at android.hardware.Camera.<init>(Camera.java:573) W/System.err: at android.hardware.Camera.open(Camera.java:418) at io.dcloud.js.camera.a.<init>(SourceFile:28) at io.dcloud.js.camera.CameraFeatureImpl.execute(SourceFile:165) W/System.err: at io.dcloud.h.b.a(SourceFile:137) at io.dcloud.h.b.b(SourceFile:3) at io.dcloud.h.b.processEvent(SourceFile:144) W/System.err: at io.dcloud.f.b.c.dispatchEvent(SourceFile:22) at io.dcloud.common.core.ui.l.processEvent(SourceFile:2) W/System.err: at io.dcloud.common.core.ui.h.exec(SourceFile:10) at io.dcloud.common.core.ui.h.prompt(SourceFile:18) at io.dcloud.common.util.Birdge.prompt(SourceFile:1) W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:363) at android.os.Looper.loop(Looper.java:176) W/System.err: at android.os.HandlerThread.run(HandlerThread.java:67)

更多关于uni-app 安卓10 Android 10 调用相机拍照授权后出错,再次调用无反应的实战教程也可以访问 https://www.itying.com/category-93-b0.html


同问,小米8 安卓10 Access denied finding property “vendor.camera.hal1.packagelist” cannot open camera “0” without camera permission’ W/System.err: java.lang.RuntimeException: Fail to connect to camera service at android.hardware.Camera.<init>(Camera.java:637) W/System.err: at android.hardware.Camera.open(Camera.java:476) at io.dcloud.js.camera.g.<init>(:11) at io.dcloud.js.camera.CameraFeatureImpl.execute(:17) at io.dcloud.c.b.a(:90) at io.dcloud.c.b.b(:3) W/System.err: at io.dcloud.c.b.processEvent(:36) at io.dcloud.a.b.j.dispatchEvent(:7) at io.dcloud.common.core.ui.na.processEvent(:2) at io.dcloud.common.core.ui.I.exec(:6) W/System.err: at io.dcloud.common.core.ui.I.prompt(:11) at io.dcloud.common.util.Birdge.prompt(:1) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:336) W/System.err: at android.os.Looper.loop(Looper.java:181) at android.os.HandlerThread.run(HandlerThread.java:67)

https://nativesupport.dcloud.net.cn/AppDocs/FAQ/android
离线打包Android 10上无法启动相机 在application节点下添加provider节点
<provider android:name="io.dcloud.common.util.DCloud_FileProvider" android:authorities="${apk.applicationId}.dc.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/dcloud_file_provider" />
</provider>
${apk.applicationId}须替换成应用的包名。
小米8手机 安卓10 已解决问题,其他机型测试中…

谢谢您

这是Android 10权限管理机制变化导致的相机权限问题。从错误日志cannot open camera "0" without camera permission可以看出应用没有获得相机权限。

在Android 10中,权限请求和回调机制有所变化:

  1. 动态权限请求:需要在调用相机前确保已获取CAMERA权限,使用plus.android.requestPermissions进行动态申请:
plus.android.requestPermissions(['android.permission.CAMERA'], function(e){
    if(e.deniedAlways.length > 0){
        // 用户永久拒绝
        plus.nativeUI.alert('需要相机权限才能拍照');
    }else if(e.denied.length > 0){
        // 用户拒绝
        plus.nativeUI.alert('请允许相机权限');
    }else{
        // 权限已授予,调用相机
        captureImage();
    }
}, function(error){
    console.log('权限请求错误:' + JSON.stringify(error));
});
  1. 权限状态检查:在调用相机前检查权限状态:
plus.android.requestPermissions(['android.permission.CAMERA'], function(e){
    // 权限回调处理
}, function(error){
    console.log('权限请求错误:' + JSON.stringify(error));
});
  1. manifest配置:确保manifest.json中已声明相机权限:
{
    "permissions": {
        "Camera": {
            "description": "相机权限"
        }
    }
}
回到顶部