Как я могу получить изображение, сохраненное в фотобиблиотеке системы Android? - PullRequest
4 голосов
/ 08 февраля 2012

Я пытаюсь получить доступ к фотобиблиотеке системы Android, чтобы получить изображение. У меня есть переменная imageURI, предоставляемая функцией navigator.camera.getPicture. Это нормально до тех пор. Но позже я хочу получить доступ к фотобиблиотеке и взять код base64 этого изображения.

Поскольку невозможно, чтобы navigator.camera.getPicture возвращает обе данные (imageURI и imageData), мне нужно получить информацию о base64 позже. Вот код, который я пытался использовать, просматривая «файловую» документацию phoneGap, но она не работает.

Останавливается при вызове «fileSystem.root.getFile» - (Ошибка в обратном вызове ошибки: File4 = TypeError: Результат выражения 'evt.target' [undefined] не является объектом. At file: /// android_asset / www /phonegap-1.3.0.js:717)

Кто мог мне помочь? Спасибо.

    function base64(imageURI) {
 alert(imageURI);
 document.addEventListener("deviceready", onDeviceReady);

 function onDeviceReady() {
     window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);}

 function gotFS(fileSystem) {
     alert("filesystem");
             //Next line causes error. Perhaps imageURI is not a valid path?
     fileSystem.root.getFile(**imageURI**, null, gotFileEntry, fail);}


 function gotFileEntry(fileEntry) {
     alert("gotfileentry");
     fileEntry.file(gotFile, fail);}

 function gotFile(file){
     alert("got file");
     readDataUrl(file);}

 function readDataUrl(file) {
     alert("readDataURL");
     var reader = new FileReader();
     reader.onloadend = function(evt) {
         console.log("Read as data URL");
         alert(evt.target.result);
         };
     reader.readAsDataURL(file);
 }
 function fail(evt) {
     console.log(evt.target.error.code);}}

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Я не знаю, зачем вам нужен getPicture для возврата как URI, так и данных.

Если вам нужно отобразить картинку, вы можете попросить getPicture вернуть данные в базе 64:

    function capturePhoto(){
        navigator.camera.getPicture(
            addPictureToActuSuccess, 
            addPictureToActuFail, {
                quality: 50,
                destinationType: navigator.camera.DestinationType.DATA_URL,
                sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY
            }
        );
    }

    function addPictureToActuSuccess(data){
        // Store the base64 data in a file or in a variable
    }

    function addPictureToActuFail(error){
        console.log(error);
    }

и отобразите его css:

url('data:image/png;base64,BASE64_DATA') /* From where you stored you base64 data */

Таким образом, вы также можете сохранить данные base 64 и отобразить картинку

1 голос
/ 23 февраля 2012

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

 function fail(evt) {
                 alert("there was an error: " + JSON.stringify(evt));
            }

Дайте нам знать, что это дает ...

0 голосов
/ 09 декабря 2012

Я обнаружил, что imageURI, возвращаемое из API, должно быть удалено из файлового протокола:

var rf=app.profile.customer.site.imageURI.substring(16); // strip off file://localhost
var reader=new FileReader();
reader.onloadend=function(evt){
  // the image data is in :  evt.target.result
  // it starts with:  data:image/jpeg;base64,/9j/....
  // so you may need to strip off the first 24 chars
}
reader.readAsDataURL(rf);

Также, как и выше, вам не нужно выполнять FileSystem / FileEntry / File;Вы можете просто создать FileReader, так как у вас есть полный URI.

Это сработало для меня на iOS.Скоро я буду тестировать Android и опубликую свои результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...