Cordova-plugin-camera不适用于Android版本8

时间:2018-11-09 10:36:25

标签: android cordova cordova-plugins

我正在使用cordova-plugin-camera访问Android中的相机。在我将目标SDK版本更改为API 26:Android 8.0(Oreo)之前,此方法一直很好,以便能够上传到现在需要此版本或更高版本的Google Play商店。

我得到的错误是

  

file:/// data / user / 0 / {mypackage} /cache/Capture.jpg通过ClipData.Item.getUri()在应用程序之外公开

我认为这是由于应用程序可以从Android Nougat访问文件系统的方式发生了变化-请参见android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()

我尝试按照https://github.com/ionic-team/ng-cordova/issues/1381修复不同版本的cordova,cordova android和照相机插件的问题,但是在每种情况下,只要将TargetSDK更改为26,我在Android 8上都会遇到相同的错误电话。

我已将以下内容添加到我的AndroidManifest.xml文件中

            <provider android:authorities="com.okappy.okappy.provider" android:exported="false" android:grantUriPermissions="true" android:name="android.support.v4.content.FileProvider">
        <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/camera_provider_paths" />
    </provider>

并且我已经检查了我的camera_provider_paths.xml和以下

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>

我还尝试在cordova / camera / CordovaURI.java中编辑以下几行,以强制忽略fileUri,但没有区别

    public Uri getCorrectUri()
{
    /*if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        return androidUri;
    else
        return fileUri;
    */
    return androidUri;

}

我有以下版本

  • 8.1.2(cordova-lib@8.1.1)

  • android 7.1.2

  • cordova-plugin-camera 4.0.3

  • cordova-plugin-console 1.0.3
  • cordova-plugin-file 6.0.1

我使用的是Compile SDK版本28.0.3,MinumumSDK版本21和TargetSDK版本26。

预先感谢您的帮助

1 个答案:

答案 0 :(得分:1)

问题出在我们的代码,而不是插件-view issue on github

我们正在使用以下代码

function captureImage() {
    navigator.device.capture.captureImage(captureImageSuccess, captureImageError, {limit: 1});
}

function captureImageSuccess(mediaFiles) {
    uploadFile(mediaFiles[0]);
}

function uploadFile(mediaFile,fileType) { //#F333
    var win = function (r) {
}

var options = new FileUploadOptions();
    ImageURL=mediaFile.fullPath;
    options.fileName = (fileType)? mediaFile.name : mediaFile.file; //#F333
    options.mimeType = "multipart/form-data";
    var params = new Object();
    params.fileName = 'AndroidPhoneUpload';
    params.imageType = (fileType)?fileType:'Picture';   //#F333
    var printName = prompt("Add a title","");  //#F644
    if (printName){
        params.printedName = printName;
    }
    window.resolveLocalFileSystemURL(ImageURL, function(fileEntry) {
        fileEntry.file(function(fileObj) {
            params.fileSize = ""+fileObj.size;
        });
    });
    options.params = params;
    var ft = new FileTransfer();
    ft.upload(ImageURL, encodeURI("uploadURL"),win,fail,options);
}

我们已替换为

navigator.camera.getPicture(function cameraSuccess(imageUri) {
        var options = new FileUploadOptions();
        options.fileKey="file";
        options.fileName="test";
        options.mimeType="multipart/form-data";
        var params = new Object();
        params.fileName = 'AndroidPhoneUpload';           
        options.params = params;
        var ft = new FileTransfer();
        ft.upload(imageUri, encodeURI("https://upload.okappy.com/UploadToS3"), win, fail, options);
    }, function captureImageError(error) {
        console.debug("Unable to obtain picture: " + error, "app");
    }, options);

希望有帮助!