📌  相关文章
📜  cordova-plugin-camera android 崩溃 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:00:02.150000             🧑  作者: Mango

Cordova-Plugin-Camera Android 崩溃 - Shell-Bash

最近发现使用 Cordova-Plugin-Camera 在 Android 设备上拍照或选择照片时会导致应用程序崩溃。这个问题已经被多个开发者在社区论坛进行了汇报并得到了广泛关注。根据我的研究,这个问题似乎与 Cordova-Plugin-Camera 以及 Android 系统的相机和存储权限有关。

现象

当尝试通过 Cordova-Plugin-Camera 来上传照片时,应用程序会意外崩溃。在 Android 设备的控制台输出中,我们可以看到以下错误消息:

java.lang.RuntimeException: Failure delivering result ResultInfo{...} to activity {...}: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.OutputStream.close()' on a null object reference
原因

根据我的调查,这个问题似乎是由 Cordova-Plugin-Camera 与 Android 设备的相机和存储权限之间的交互冲突导致的。

具体来说,当试图将照片保存到设备的存储器中,并且应用程序没有正确的权限来访问该存储器时,应用程序就会崩溃。

解决方案

目前,我已经找到了一个解决方案,可以解决这个问题。针对这个问题的解决方案是在应用程序中添加 “WRITE_EXTERNAL_STORAGE” 权限,并在 Cordova 中添加一个插件以请求该权限。

具体来说,您需要完成以下步骤:

1. 在您的应用程序中添加 "WRITE_EXTERNAL_STORAGE" 权限:

在您的应用程序的 AndroidManifest.xml 文件中,添加以下代码:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 在 Cordova 中添加一个插件以请求权限:

使用 Cordova 命令行工具添加 cordova-plugin-android-permissions 插件,该插件可以请求在 Android 设备上运行的应用程序必需的权限。可以使用以下命令执行此操作:

cordova plugin add cordova-plugin-android-permissions

然后,在调用 Cordova-Plugin-Camera 的位置添加以下代码:

var permissions = cordova.plugins.permissions;
permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, successCallback, errorCallback);

这将请求相应的权限,并在成功或失败时调用回调函数。

3. 在应用程序中正确使用 Cordova-Plugin-Camera:

请注意,应用程序必须使用 Cordova-Plugin-Camera 的正确方法来上传图片。以下代码片段提供了正确的用法示例:

var options = {
    quality: 50,
    destinationType: Camera.DestinationType.FILE_URI,
    sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
    allowEdit: true,
    encodingType: Camera.EncodingType.JPEG,
    targetWidth: 300,
    targetHeight: 300,
    popoverOptions: CameraPopoverOptions,
    saveToPhotoAlbum: false
};
 
navigator.camera.getPicture(onSuccess, onFail, options);
 
function onSuccess(imageData) {
    var image = document.getElementById('myImage');
    image.src = imageData;
}
 
function onFail(message) {
    alert('Failed because: ' + message);
}
结论

使用 Cordova-Plugin-Camera 在 Android 设备上拍照或选择照片时会导致应用程序崩溃的问题可能是由于相机和存储权限之间的交互冲突引起的。这个问题可以通过在应用程序中添加 "WRITE_EXTERNAL_STORAGE" 权限,并使用 cordova-plugin-android-permissions 插件来请求该权限来解决。同时,确保正确地使用 Cordova-Plugin-Camera 的方法以上传照片。