IOS 9中的Cordova相机插件

时间:2015-11-16 10:02:41

标签: ios cordova camera ios9 photolibrary

我在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在添加插件时是否添加了所需的功能?

1 个答案:

答案 0 :(得分:3)

我在iOS上使用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();
};