Cordova-плагин-камера не работает с Android версии 8 - PullRequest
0 голосов
/ 09 ноября 2018

Я использую Cordova-Plugin-Camera для доступа к камере в Android. Это работало нормально, пока я не изменил версию Target SDK на API 26: Android 8.0 (Oreo), чтобы иметь возможность загружать в магазин Google Play, который теперь требует эту версию или выше.

Я получаю ошибку

file: /// data / user / 0 / {mypackage} /cache/Capture.jpg, доступный за пределами приложения через ClipData.Item.getUri ()

, что, по моему мнению, связано с изменением того, как приложения могут обращаться к файловой системе с Android-нуги - см. android.os.FileUriExposedException: file: ///storage/emulated/0/test.txt, доступный за пределами приложения через Intent.getData () .

Я пытался исправить проблему с различными версиями cordova, cordova android и плагина камеры согласно https://github.com/ionic-team/ng-cordova/issues/1381, но в каждом случае, как только я меняю 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, чтобы принудительно игнорировать файл Uri, но это не имело значения

    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 голосов
/ 04 декабря 2018

Проблема связана с нашим кодом, а не с плагином - проблема просмотра на 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);
}

Мы заменили функцию captureImage на следующую функцию addImage

function setOptions(srcType) {
    var options = {
        quality: 50,
        limit: 1,
        destinationType: Camera.DestinationType.FILE_URI,
        // In this app, dynamically set the picture source, Camera or photo gallery
        sourceType: srcType,
        encodingType: Camera.EncodingType.JPEG,
        mediaType: Camera.MediaType.PICTURE,
        allowEdit: false,
        correctOrientation: true  
    }
    return options;
}

function addImage() {

  var srcType = Camera.PictureSourceType.CAMERA;
  var options = setOptions(srcType);

  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';
        params.imageType = 'Picture';
        var printName = prompt("Add a title","");
        if (printName){
            params.printedName = printName;
        }
        options.params = params;
        navigator.notification.alert("Your media is being uploaded.", null, "Add media");

        var ft = new FileTransfer();
        ft.upload(imageUri, encodeURI("uploadURL"), win, fail, options);

    }, function captureImageError(error) {
        console.debug("Unable to obtain picture: " + error, "app");
    }, options);
}

Чтобы прояснить ситуацию, я считаю, что проблема заключалась в том, что мы использовали камеру для захвата изображения, а затем пытались загрузить медиафайл из хранилища, что вызывало проблемы с разрешениями в новой версии Android.

...