Невозможно установить источник изображения при доступе к изображению из галереи — Android.

StackOverflow https://stackoverflow.com//questions/24037487

Вопрос

Я использую Кордову 3.4.Когда я захватываю изображение и устанавливаю его, оно работает нормально, но когда я пытаюсь получить доступ к изображению из галереи, я получаю URL-адрес

content://com.android.providers.media.documents/document/image%4A463

и я получаю ошибку загрузки изображения в своем теге изображения. Я знаю, что это известная ошибка, и я ссылался на такие вопросы по стеку, как Невозможно загрузить изображение при его выборе из галереи на Android 4.4 (KitKat) с помощью плагина камеры PhoneGap.

Я не могу использовать упомянутую грубую работу, где URI задается вручную, например content://media/external/images/media/, потому что мы фокусируемся на устройствах с внутренним встроенным хранилищем, таких как Moto.

Также не могли бы вы подтвердить, что эта проблема исправлена ​​в Cordova 3.5. Потому что мне нужно разрешение от моих должностных лиц на загрузку, и я должен убедиться, что это достижимо. Может кто-нибудь, пожалуйста, помогите

ОБНОВЛЯТЬ:

app.directive('upload', function() {
return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
        elm.on('click', function() {
            navigator.camera.getPicture(
                    function(imageURI) {
                        scope.$apply(function() {
                            alert(imageURI);
                               ctrl.$setViewValue(imageURI);
                        });
                        window.resolveLocalFileSystemURI(imageURI, function(fileEntry)                                                                       {
                             //                                                   ctrl.$setViewValue(imageURI);
                            alert("inside local file" + imageURI);
                            alert("Inside local file system");
                            fileEntry.file(function(fileObj) {
                                alert("hai");
                                var options = new FileUploadOptions();
                                options.fileKey = "file";
                                options.fileName = fileObj.name;
                                options.mimeType = fileObj.type;
                                var ft = new FileTransfer();
                                // var url = fileUploadUrl;
                                // ft.upload(imageUri, encodeURI(url), success,                 failure, options);
                            });
                        });
                    },
                    function(err) {
                        ctrl.$setValidity('error', false);
                    }, {quality: 50,
                destinationType: Camera.DestinationType.FILE_URI,
                  sourceType: Camera.PictureSourceType.PHOTOLIBRARY
            }
            );
        });
    }
};
       });

Мой HTML:

  <img
                    ng-src="{{onepic}}" 
                    width="250" 
                    height="390" 
                    alt="error"/>

Я установил значение для onepic в моем контроллере внутри функции просмотра. Поэтому, когда директива возвращает URI, он будет автоматически установлен в onepic. Пожалуйста, укажите любое альтернативное решение, или если я делаю что-то не так, я новичок в angularjs

Это было полезно?

Решение

Попробуйте это ..

В плагине камеры есть один файл FileHelper.java, замените плагин getRealPath с моим этим моим методом.

Для более подробной информации вы можете следить за этим -> https://issues.apache.org/ jira / loowse / cb-5398

filehelper.java

    @SuppressWarnings("deprecation")
    public static String getRealPath(String uriString, CordovaInterface cordova) {
        String realPath = null;


        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat) {
        Cursor cursor =  cordova.getActivity().getContentResolver().query(Uri.parse(uriString), null, null, null, null);
        cursor.moveToFirst();
        String document_id = cursor.getString(0);
        document_id = document_id.substring(document_id.lastIndexOf(":")+1);
        cursor.close();

        cursor = cordova.getActivity().getContentResolver().query( 
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
        cursor.moveToFirst();
        String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        realPath = path;
        cursor.close();
        }else{

        if (uriString.startsWith("content://")) {
            String[] proj = { _DATA };
            Cursor cursor = cordova.getActivity().managedQuery(Uri.parse(uriString), proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(_DATA);
            cursor.moveToFirst();
            realPath = cursor.getString(column_index);
            if (realPath == null) {
                LOG.e(LOG_TAG, "Could get real path for URI string %s", uriString);
            }
        } else if (uriString.startsWith("file://")) {
            realPath = uriString.substring(7);
            if (realPath.startsWith("/android_asset/")) {
                LOG.e(LOG_TAG, "Cannot get real path for URI string %s because it is a file:///android_asset/ URI.", uriString);
                realPath = null;
            }
        } else {
            realPath = uriString;
        }

        }
        return realPath;
    }
.

в генеракодицетагкоде класса Threer - один метод CameraLauncher.java

private void processResultFromGallery
.

Найти этот код:

    if (this.targetHeight == -1 && this.targetWidth == -1 &&
                (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation){

        this.callbackContext.success(uri.toString());
    }
.

и заменить с этим:

    if (this.targetHeight == -1 && this.targetWidth == -1 &&
                (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) {

            String s    =FileHelper.getRealPath(uri.toString(), cordova);
            Log.i("test","<<<<ifURI::::::"+s +"URI::::" + uri.toString());
            this.callbackContext.success(s);

     }  
.

Другие советы

Посмотреть Это Ответ:

    if (imageUri.toString().substring(0,21).equals("content://com.android")) {
          String [] photo_split= imageUri.toString().split("%3A");
          String imageUriBasePath = "content://media/external/images/media/"+photo_split[1];
           imageUri= Uri.parse(imageUriBasePath );

        }
.

Всякий раз, когда некоторые uri передается в <img src="uri" /> это неявно декодируется из

контент://com.android.providers.media.documents/document/image%3A9888 (1)

в

контент://com.android.providers.media.documents/document/image:9888 (2)

Однако после возвращения из Intent.ACTION_OPEN_DOCUMENT или Intent.ACTION_GET_CONTENT Android предоставляет вам разрешение на чтение (1), нет (2).В этом случае WebView ожидаемо зарегистрирует ошибку:

java.lang.SecurityException:Отказ в разрешении:Чтение com.android.providers.media.mediaDocumentsProvider URI Content: //com.android.providers.media.documents/document/image: 9888 от pid = 13163, uid = 10165 требует Android.permission.manage_documents, или грантопередачи ().

или

Невозможно открыть URL-адрес контента

Фрагмент кода

Все, что вам нужно для решения проблемы, это

    String uriToUseInWebView = transformForWebView(uri.toString());

    private String transformForWebView(String uri) {
        for (int i = 0; i < timesDecodingWebView(); i++)
            uri = uri.replace("%", Uri.encode("%"));
        return uri;
    }

    private int timesDecodingWebView() {
        if (Build.VERSION.RELEASE.equals("4.4.2")) {
            return 2;
        } else {
            return 1;
        }
    }

в вашем Java-коде перед передачей uri в HTML/JS, чтобы гарантировать, что (1) будет действительно загружен.

Я тестировал это на 4.4.2, 4.4.4 и 5.0.Самое смешное, что Android 4.4.2 декодирует uri внутренне дважды.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top