4

我正在尝试访问 android 系统的照片库以检索图像。我有 navigator.camera.getPicture 函数提供的 imageURI 变量。在那之前没关系。但后来,我想访问照片库并获取此图像的 base64 代码。

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

它在“fileSystem.root.getFile”调用处停止-(错误回调中的错误:File4 = TypeError:表达式'evt.target'[未定义]的结果不是对象。在文件:///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);}}
4

3 回答 3

1

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

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

让我们知道这会产生什么...

于 2012-02-22T22:05:20.663 回答
1

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

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

这样你也可以存储base 64的数据并显示图片

于 2012-02-22T22:51:31.230 回答
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 并将返回我的结果。

于 2012-12-09T14:40:40.560 回答