Titanium Android file.read()对于来自intent的外部媒体返回null

Titanium Android file.read()对于来自intent的外部媒体返回null,file,android-intent,titanium,blob,external,File,Android Intent,Titanium,Blob,External,当我调用gallery意图时,我得到的文件是ok,但尝试使用read()将该文件转换为blob时,会给出null: Q)如何获取此文件的blob? 代码: 产生: I/TiAPI ( 2897): intentdata: content://media/external/images/media/59 I/TiAPI ( 2897): file: {"readonly":true,"bubbleParent":true,"writable":false,"directoryListi

当我调用gallery意图时,我得到的文件是ok,但尝试使用
read()
将该文件转换为
blob
时,会给出null:

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

代码:

产生:

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获取之前,需要将其复制到applicationDataDirectory

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:读取

方法不受支持。org.appcelerator.titanium.io.TitaniumBlob:存在

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

此外,它可能有助于:

Ti.Filesystem.requestStoragePermissions(callback);
如果您想访问常规文件存储,请在代码的早期的某个地方。缺少此选项将导致持续的权限拒绝错误

Ti.Filesystem.requestStoragePermissions(callback);