【问题标题】:Titanium 3.X getFile() from local storage来自本地存储的 Titanium 3.X getFile()
【发布时间】:2014-09-01 11:16:13
【问题描述】:

在 Android 4+ 上使用 Titanium 我想访问用相机拍摄的 jpeg 文件。我需要实现 2 个目标,即返回 EXIF 数据并将字节传输到 API 端点。我的问题是我无法访问该文件...

我正在使用第 3 方模块来处理返回文件位置列表的文件选择(多图像选择器),使用模拟器上的文件管理器应用程序 (GenyMotion) 我可以确认磁盘上的位置是正确的。但是,以下总是返回 false...

var file = Ti.Filesystem.getFile('/mnt/sdcard/DCIM/Camera/IMG_20140901_083735.jpg');
Ti.API.info('Do we have a file? ' (file.exists()? 'YES' : 'NO'));

上面的输出将是...... 我们有文件吗?没有

进一步阅读显示 Titanium 有 5 个预定义的文件夹位置,它们可以传递到 getFile() 方法中,上述代码不起作用的一个可能原因是它默认为“Resouces”文件夹位置?也就是说,除一个文件夹位置外,所有文件夹位置都是特定于应用程序的,externalStorageLocation 除外。现在我对 Android 设备的理解是,除非存在 SD 卡,否则使用相机拍摄的任何图像都将存储在内部存储系统中。在我的情况下确实如此,因为以下列出了 0 个文件...

var extDir = Ti.Filesystem.getExternalStorageDirectory();
var dir = Ti.Filesystem.getFile(extDir);
var dir_files = dir.getDirectoryListing();

Ti.API.info('External files... ' + dir_files.length);

上面的输出将是... 外部文件... 0

所以我认为 Appcelerator 根本没有在其 API 中包含访问本地存储(在任何应用特定文件夹之外)的能力是正确的吗?还是我错过了什么,实际上还有另一种方式?

【问题讨论】:

    标签: android titanium android-camera appcelerator appcelerator-mobile


    【解决方案1】:

    感谢@Bharal,我能够找到解决方案...

    通过使用 Ti.Media.openPhotoGallery() 方法,我能够通过检查从成功回调返回的事件对象来识别图像的正确本机路径。

    路径开头缺少“file://”,我不能 100% 确定,但我怀疑这会强制 getFile() 方法使用绝对路径,而不是 Resources 文件夹中的相对路径.

    为了确认,下面会返回一个文件对象...

    var file = Ti.Filesystem.getFile('file://[path]');
    

    其中 [path] 是设备上文件管理器应用中报告的文件夹位置,例如“/mnt/sdcard/DCIM/Camera/IMG_20140901_083735.jpg”

    【讨论】:

      【解决方案2】:

      是的,我不知道。

      这是我在我的 Ti 应用上做图片时使用的 wat,但后来我摆脱了那个部分,因为我意识到我不需要做图片。伙计,他们有时不是你想要的,哟?

          Ti.Media.openPhotoGallery({ //dissall jus' open up a piccha selectin' ting. ez.
              success:function(event){
                  var image = event.media;
                  if (event.mediaType==Ti.Media.MEDIA_TYPE_PHOTO){
      //so image.nativePath is the path to the image. 
      // profileImg be jus' some Ti.UI.createImageView ting yo be puttin in yo' page.
      //meyybe yo be wantin' alert(image.nativePath); here too, dat be helpin?
                      profileImg.image = image.nativePath; 
                  }
      
              },
              cancel:function(){
                  //we cancelled out, why we doin' that?
              }    
          });
      

      现在这并不能真正帮助你,但你可以用它来查看你所使用的原生路径,然后看看你在代码中放入的内容是什么三丁。

      Jus' 将上述内容包装为 addEventListener("click", function(){ ... } );在 yo 页面中的 sam ting 上,如果你想看到 piccha 但我会告诉你 picchas mon,有时他们不值得花时间。

      但是我,你不想用模拟器来区分,他们可能表现得很奇怪,你应该用一些小手机吗?如果你有记忆韭菜和记忆豆芽,还有记忆洋葱,那么你就可以找到。

      【讨论】:

      • 感谢@bharal,这让我走上了解决问题的正确道路。如果可以的话,我会 +1。
      • @AdrianHolmes 很高兴它有帮助 - 在我写答案之前,我拥有的 caipirinha 帮助我引导了一个古老酷玩的精神来回答你的问题。 VoodooJones 可能是这里真正的英雄。
      猜你喜欢
      • 2017-01-02
      • 2022-01-01
      • 1970-01-01
      • 2016-10-08
      • 2017-06-05
      • 2018-03-19
      • 1970-01-01
      • 2016-07-14
      • 2010-11-29
      相关资源
      最近更新 更多