Titanium Android file.read() 从意图返回外部媒体的空值



当我调用图库意图时,我得到的文件正常,但尝试将该文件转换为带有 read()blob会给出 null:

问) 如何获取此文件的 blob?

法典:

    var intent = Ti.Android.createIntent({ action : Ti.Android.ACTION_PICK, type : "image/*" });            
    intent.addCategory(Ti.Android.CATEGORY_DEFAULT);
    win.getActivity().startActivityForResult(intent, function(e) { 
        if (e.error) { 
            alert(e.error);
        } 
        else {
            if (e.resultCode === Titanium.Android.RESULT_OK) {                  
                var file = Ti.Filesystem.getFile(e.intent.data);
                console.log('intentdata: ' + e.intent.data);
                console.log('file: ' + JSON.stringify(file));
                console.log('file read result: ' + JSON.stringify(file.read()));
            } 
        }
    }); 

生产:

I/TiAPI   ( 2897):  intentdata: content://media/external/images/media/59
I/TiAPI   ( 2897):  file: {"readonly":true,"bubbleParent":true,"writable":false,"directoryListing":null,"symbolicLink":false,"h
idden":false,"nativePath":"content://media/external/images/media/59","executable":false,"size":0,"name":"butterfly2_large1.jpg"
,"parent":null}
I/TiAPI   ( 2897):  file read result: null

我发现您需要将文件复制到应用程序数据目录,然后再尝试将其作为blob获取。

var intentFile = Ti.Filesystem.getFile(e.intent.data);          
var copiedFile = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, intentFile.name);                            
intentFile.copy(copiedFile.nativePath);                         
var blob = copiedFile.read();

谢谢,谢谢,谢谢戴夫,已经在这里呆了两天了,这节省了我剩下的头发。

我没有足够的观点发表评论,所以再次回答以提出一些可能对其他人有帮助的关键点,因为它们似乎没有明确的记录。

上面的答案解决了当您尝试在下载中读取文件时令人困惑的错误消息。系统似乎认为它已经是一个 blob,而不是文件句柄,如下所示:

var pdf = Ti.Filesystem.getFile(intent.getData());
pdf = pdf.read();
if(pdf.exists()){
   //do something 
}

提供控制台消息,例如

方法不受支持 org.appcelerator.titanium.io.TitaniumBlob : read

方法不受支持 org.appcelerator.titanium.io.TitaniumBlob : exists

Dave 的建议也适用于使用 intent.getData() 从下载或邮件中打开文件(在我的例子中是 PDF),该 intent.getData() 将 URI 重新调整到这些资源。

此外,它可能有助于放置:

Ti.Filesystem.requestStoragePermissions(callback);
如果您想

访问常规文件存储,请在代码早期的某个位置。缺少此功能将导致持续的权限被拒绝错误。

最新更新