如何检索保存在android系统的photolibrary中的图像?

时间:2012-02-08 17:10:06

标签: cordova base64 photolibrary

我正在尝试访问Android系统的photolibrary来检索图像。我有navigator.camera.getPicture函数提供的imageURI变量。那是好的,直到那时。但后来,我想访问photolibrary并获取此图像的base64代码。

由于navigator.camera.getPicture不可能返回两个数据(imageURI和imageData),我需要稍后获取base64信息。这是我试图使用的代码,查看phoneGap的“文件”文档,但它不起作用。

它停在“fileSystem.root.getFile”调用 - (错误回调中的错误:File4 = TypeError:表达式'evt.target'[undefined]的结果不是对象。在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 个答案:

答案 0 :(得分:1)

好的,第一个问题是失败函数返回的对象没有您尝试访问的属性。要查看错误对象中的内容,请尝试以下操作:

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

让我们知道它产生了什么......

答案 1 :(得分:1)

我不知道你为什么需要getPicture来返回URI和数据。

如果您需要显示图片,可以要求getPicture返回base 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 */

这样,您还可以存储基础64数据并显示图片

答案 2 :(得分:0)

我发现从API返回的imageURI必须被剥离文件协议:

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,并会发回我的结果。