我正在尝试访问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);}}
答案 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,并会发回我的结果。