【问题标题】:Titanium Android file.read() returns null for external media from intentTitanium Android file.read() 从 Intent 中为外部媒体返回 null
【发布时间】:2014-01-06 15:39:13
【问题描述】:

当我调用画廊意图时,我得到了文件,但尝试使用 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

【问题讨论】:

    标签: file android-intent titanium blob external


    【解决方案1】:

    我发现您需要先将文件复制到 applicationDataDirectory,然后再尝试将其作为 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();
    

    【讨论】:

      【解决方案2】:

      谢谢,谢谢,谢谢戴夫,已经用了两天了,这救了我剩下的头发。

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

      当您尝试在下载中读取文件时,上面的答案解决了一个令人困惑的错误消息。系统似乎认为它已经是一个 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 的建议也适用于从下载或邮件中打开文件(在我的例子中是 PDF),使用 intent.getData() 将 URI 返回到这些资源。

      另外,它可能会有所帮助:

      Ti.Filesystem.requestStoragePermissions(callback);
      

      如果您想访问一般文件存储,请在代码的早期位置。缺少这将导致持续的权限被拒绝错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 2014-11-16
        • 1970-01-01
        • 2022-10-24
        相关资源
        最近更新 更多