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