繁体   English   中英

IOS 9中的Cordova相机插件

[英]Cordova Camera Plugin in IOS 9

我在IOS 9上使用Cordova 5.3.3和Apache Camera Plugin 1.2.0。我可以用相机成功拍摄照片但是当我试图从照片库中获取照片时它会回到相机并且我收到错误“在cordova错误回调中无法访问资产。 我使用以下代码。

 navigator.camera.getPicture(onSuccess, onFail, {
       quality: 75,
       destinationType: Camera.DestinationType.DATA_URL,
       sourceType : Camera.PictureSourceType.PHOTOLIBRARY
   });

当我检查应用程序权限时,我发现它可以访问相机而不是照片。 那是问题吗? Cordova在添加插件时是否添加了所需的功能?

我在iOS上使用cordova-plugin-camera时遇到了类似的问题:在cordova-plugin-camera后没有要求将照片存储在照片应用程序中,因此将其存储到相机胶卷失败。

我通过使用cordova-plugin-diagnostic来解决这个问题,以确保在尝试拍照之前授权相机和照片。 这也解决了用户在初始授予访问权限后撤销访问权限的边缘情况。 根据我的实现和您对相机插件的使用,您可以尝试这样的事情:

var userMessages = {
    noCamera: "The device doesn't have a working camera",
    cameraUnauthorized:{
        title: "Camera unavailable",
        message: "The app is not authorised to access the camera, which means it can't take photos. Would you like to switch to the Settings app to allow access?"
    },
    cameraRollUnauthorized:{
        title: "Photos unavailable",
        message: "The app is not authorised to access your Photos, which means it can't take photos. Would you like to switch to the Settings app to allow access?"
    },
    cameraAuthorisationError:{
        title: "Camera authorisation error",
        message: "The app could not request access to the camera due to the following error: "
    }
};

// Request camera authorisation
checkCameraIsUsable({
    successFn: onCameraAuthorised,
    errorFn: onCameraAuthorisationError,
    requireCameraRoll: true
});

// Called on successful authorisation of camera/camera roll
function onCameraAuthorised(){
    navigator.camera.getPicture(onSuccess, onFail, {
           quality: 75,
           destinationType: Camera.DestinationType.DATA_URL,
           sourceType : Camera.PictureSourceType.PHOTOLIBRARY
   });
}

// Called on error during authorisation of camera/camera roll
function onCameraAuthorisationError(error){
    console.error("An error occurred authorising use of the camera"):
    navigator.notification.alert(userMessages.cameraAuthorisationError.message, null, userMessages.cameraAuthorisationError.title);
}


/**
 * Checks if camera is available for use; i.e. camera is present and authorized for use.
 * If not and authorization has not yet been requested, requests authorization.
 * If authorization is denied, informs user and offers to switch to settings page to allow.
 * Optionally also checks if camera roll access has been authorized.
 * * If not and authorization has not yet been requested, requests authorization.
 * If authorization is denied, informs user and offers to switch to settings page to allow.
 *
 * @param {Object} params - parameters:
 * <ul>
 *    <li>{Function} successFn - callback to invoke if camera is available for use.</li>
 *    <li>{Function} errorFn - callback to to invoke if camera is unavailable for use. The function will be passed a single {String} argument which contains the error message.</li>
 *    <li>{Boolean} requireCameraRoll (optional) - if true, checks for/requests camera roll authorization. Defaults to false.</li>
 * </ul>
 */
 function checkCameraIsUsable(params){

    function requestCameraRollAuthorization(){
        cordova.plugins.diagnostic.requestCameraRollAuthorization(function(granted){
            if(granted){
                params.successFn();
            }else{
                onCameraRollAuthorizationDenied();
            }
        }, params.errorFn);
    }

    function onCameraRollAuthorizationDenied(){
        navigator.notification.confirm(
            userMessages.cameraRollUnauthorized.message,
            function(i){
                if(i==1){
                    cordova.plugins.diagnostic.switchToSettings();
                }
            },
            userMessages.cameraRollUnauthorized.title,
            ["Yes","No"]
        );
    }

    function getCameraRollAuthorizationStatus(){
        cordova.plugins.diagnostic.getCameraRollAuthorizationStatus(function(status){
            switch(status){
                case "denied":
                    onCameraRollAuthorizationDenied();
                    break;
                case "not_determined":
                    requestCameraRollAuthorization();
                    break;
                default:
                    params.successFn();
            }
        }, params.errorFn);
    }

    function requestCameraAuthorization(){
        cordova.plugins.diagnostic.requestCameraAuthorization(function(granted){
            if(granted){
                if(params.requireCameraRoll){
                    getCameraRollAuthorizationStatus();
                }else{
                    params.successFn();
                }
            }else{
                onCameraAuthorizationDenied();
            }
        }, params.errorFn);
    }

    function onCameraAuthorizationDenied(){
        navigator.notification.confirm(
            userMessages.cameraUnauthorized.message,
            function(i){
                if(i==1){
                    cordova.plugins.diagnostic.switchToSettings();
                }
            },
            userMessages.cameraUnauthorized.title,
            ["Yes","No"]
        );
    }

    function getCameraAuthorizationStatus(){
        cordova.plugins.diagnostic.getCameraAuthorizationStatus(function(status){
            switch(status){
                case "denied":
                    onCameraAuthorizationDenied();
                    break;
                case "not_determined":
                    requestCameraAuthorization();
                    break;
                default:
                    if(params.requireCameraRoll){
                        getCameraRollAuthorizationStatus();
                    }else{
                        params.successFn();
                    }

            }
        }, params.errorFn);
    }

    function isCameraPresent(){
        cordova.plugins.diagnostic.isCameraPresent(function(present){
            if(present){
                getCameraAuthorizationStatus();
            }else{
                params.errorFn(userMessages.noCamera);
            }
        }, params.errorFn);
    }
    isCameraPresent();
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM