линия

Главная

четверг, 1 декабря 2016 г.

Cordova: getPicture как получить нормальный путь к изображению

Разрабатывая простое приложение работающее с галереей и фотоаппаратом смартфона на  Apache Cordova столкнулся  с проблемой. На первый взгляд выглядело пустяковой проблемой, но часы летели -  проблема не хотела решиться.
А проблема вот в чем:
1. Берем фото из галереи.
2. Выводим саму картинку
3. Сохраняем путь к нему.
4. При последующем открывании страницы с картинкой выводи картинку, и при клике на картинку она открывается как обычная картинка, где можно увеличить и пролистывать. Уф, тавтология (туфтология) получилось. Ну и хер с ним.Идем дальше...


Сама проблем  кроется в путях. 

Выбор картинки из галереи вызывается следующим образом.

 
function getImageGallery() {
    navigator.camera.getPicture(onPhotoSuccessURI, function (message) {
        console.log(message);
    }, {
        quality: 50,
        destinationType: destinationType.FILE_URI,
        sourceType: navigator.camera.PictureSourceType.SAVEDPHOTOALBUM
    }
    );
}



При успешном открывании вызывается функция:

 
function onPhotoSuccessURI(imageURI) {
    var src = imageURI;
    console.log(src);
  $('#smallImage').append('');

}





Видим,думаем. киваем если все ясно.
Путь в данном случаем имеет вид :content://com.android.providers.media.documents/document/image%3A352


Но плагин FullScreen ,  при помощи которого открываю фото,  упорно не хочет обрабатывать такие пути, ему подавай че нить тип такого file://.....

Сначала пытался делать на JS, искал на форумах пути решения, но все что приводилось не работало.  В итоге пришлось лезть в недра плагина, редактировать JAVA файлы.
Итак, открываем
...youapp\plugins\cordova-plugin-camera\src\android
Редактируем файл CameraLauncher.java
Ищем такую строку:

  

// This is a special case to just return the path as no scaling,
            // rotating, nor compressing needs to be done
            if (this.targetHeight == -1 && this.targetWidth == -1 &&
                    (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation &&
                    mimeType.equalsIgnoreCase(getMimetypeForFormat(encodingType)))
            {
                                 // ВОТ ЭТО ЗАМЕНЯЕМ 
                                //this.callbackContext.success(uriString);
                                // НА ЭТО
     this.callbackContext.success( getRealPathFromURI(uri));// getRealPathFromURI(uri)
            } else {

....

}

// В этом же файле вставляем эту функцию

public String getRealPathFromURI(Uri contentUri) {
    String res = null;
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = cordova.getActivity().getContentResolver().query(contentUri, proj, null, null, null);
    if(cursor.moveToFirst()){;
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
       res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
}





. Все, после этих не хитрых манипуляций с путями будет все отлично.
Согласен, статья ужасная, но это больше для меня чем для кого либо. 



Комментариев нет:

Отправить комментарий