【问题标题】:Having trouble to get the files from android emulator (Titanium)无法从 android 模拟器 (Titanium) 获取文件
【发布时间】:2016-03-30 13:05:18
【问题描述】:

伙计们!我无法从我的 android 模拟器中获取文件!

①这是我的模拟器信息: Genymotion 供个人使用 - 三星 Galaxy Note 3 - 4.4.4 - API 19 - 1080x1920

②这里是模拟器的文件树:

我在Internal storage目录下保存了两个mp3文件供测试,路径是/storage/emulated/0/Download

如您所见,这两个 mp3 文件位于 Download 目录中。我的麻烦是我永远无法将这两个文件放在正确的路径上。

③ 这是我的代码:

if(Ti.Filesystem.isExternalStoragePresent()){
    var sdkDir_1 = Ti.Filesystem.getExternalStorageDirectory();
    console.info('------------->sdkDir_1');
    console.info(sdkDir_1);

    var sdkDir_2 = Ti.Filesystem.getFile(Ti.Filesystem.externalStorageDirectory);
    console.info('------------->sdkDir_2');
    console.info(sdkDir_2);

    var downLoadDir = Ti.Filesystem.getFile(sdkDir_2.parent.directoryListing[7]);
    console.info('------------->downLoadDir.getDirectoryListing()');
    console.info(downLoadDir.getDirectoryListing());
    ...

这是控制台:

[INFO] [android, 4.4.4, 10.0.3.15] ------------->sdkDir_1
[INFO] [android, 4.4.4, 10.0.3.15] appdata://

[INFO] [android, 4.4.4, 10.0.3.15] ------------->sdkDir_2
[INFO] [android, 4.4.4, 10.0.3.15] {
"readonly": false,
"bubbleParent": true,
"writable": true,
"directoryListing": [],
"symbolicLink": false,
"apiName": "Ti.Filesystem.File",
"hidden": false,
"nativePath": "file:///storage/emulated/0/co.test.zone",
"executable": false,
"size": 4096,
"name": "co.happysoft.zone",
"parent": {
    "readonly": false,
    "bubbleParent": true,
    "writable": true,
    "directoryListing": [
        "Music",
        "Podcasts",
        "Ringtones",
        "Alarms",
        "Notifications",
        "Pictures",
        "Movies",
        "Download",
        "DCIM",
        "Android",
        "storage",
        ...

 [INFO] [android, 4.4.4, 10.0.3.15] ------------->downLoadDir
 [INFO] [android, 4.4.4, 10.0.3.15] {
        "readonly": true,
        "bubbleParent": true,
        "writable": false,
        "directoryListing": [],
        "symbolicLink": false,
        "apiName": "Ti.Filesystem.File",
        "hidden": false,
        "nativePath": "file:///android_asset/Resources/api/Download",
        "executable": false,
        "size": 0,
        "name": "/Download",
        "parent": null
  }

我很困惑,Download 路径应该如何改变,而它的 directoryListing 什么都没有。而且,我想知道为什么 sdkDir_1 也没有。谁有好的解决方案,提前谢谢。

【问题讨论】:

    标签: android android-emulator filesystems titanium


    【解决方案1】:

    内部存储对于存储它们的应用来说是私有的: http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

    请使用外部存储来存储您需要从创建它们的应用以外的应用访问的文件。

    【讨论】:

    • 非常感谢 Fokke Zandbergen。我已经解决了。
    【解决方案2】:

    嗯,非常感谢@Fokke Zandbergen,提醒我我犯了一个错误,试图通过外部存储目录获取模拟器的内部文件。现在,很明显,如果您想从模拟器或真正的移动设备获取本地文件,也许以下建议可能会对您有所帮助:

    ①从模拟器中获取本地文件

    1 Android,试试这个路径:file:///storage/emulated/0

    首先,emulated目录是模拟器专用的,所有安卓模拟器都有这个目录。然后,目录0表示你的模拟器只有一个内部存储目录,因为模拟器没有外部存储sdcard

    [2] iPhone,试试这个路径:/Users/xxx/Library/Developer/CoreSimulator/Devices/F34851D0-AFA5-443E-AEF6-70B695FB9C5E/data

    F34851D0-AFA5-443E-AEF6-70B695FB9C5E目录是模拟器ID,可以通过ti info命令查看.

    ②从真实移动设备获取本地文件

    1 Android,试试这个路径:file:///storage/sdcard0

    请注意,sdcard0 是您移动设备的内部存储。如果您需要从外部存储目录获取本地文件,也意味着SD卡,那么您应该尝试这种方式:

    if(Ti.Filesystem.isExternalStoragePresent()){
        var sdkDir = Ti.Filesystem.getExternalStorageDirectory();
    }
    

    [2] iPhone,因为iPhone没有外置存储,所以和模拟器一样。嗯,我没有测试过这种方式,也许你应该尝试一下。



    各位,我最近测试了真正的移动设备文件路径,我指的是SDCard(external storage)的文件路径。不过,有个坏消息要告诉你,Titanium API 负担得起的检测外部存储是否存在的方法不好用。详情如下:

    1. if(Ti.Filesystem.isExternalStoragePresent()) 总是返回 true,尽管 SDCard 不存在。

      我想,如今,几乎所有的智能手机都内置了内部存储(绝不意味着智能手机的自身存储就像电话簿,我的意思是内部存储是一个特殊的外部存储,但嵌入到智能手机中),SDCard是一个扩展存储,但它们是相同的。

    2. 不同厂商的外置存储设置不同

      在我的测试中,当智能手机来自华为时,外部存储路径变为:file:///storage/sdcard1,区分带内部存储sdcard0

      但是,当制造商为SAMSUNG时,外部存储路径为:file:///storage/extSdCard

      所以,我们必须检查制造商来定义外部存储路径:

      var sdCardPath;
      if(Ti.Platform.manufacturer == 'HUAWEI'){
          sdCardPath = Ti.Filesystem.getFile('file:///storage/sdcard1');
      }
      else if(Ti.Platform.manufacturer == 'samsung'){
          sdCardPath = Ti.Filesystem.getFile('file:///storage/extSdCard');
      }
      

      嗯,太可怕了!

    所以,我一直没有一个好主意来处理来自不同制造商的真实移动设备的文件。小伙伴们,你们有什么好主意吗?

    【讨论】:

      【解决方案3】:

      打开模拟文件夹文件列表,选择所有文件或只选择需要的文件,然后从三个点中选择移动文件并确认文件到达“下载”文件夹,该文件夹可从图库或存储文件树轻松访问

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-17
        • 2012-12-29
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 2012-09-01
        相关资源
        最近更新 更多