无法从 android 模拟器 (Titanium) 获取文件

Having trouble to get the files from android emulator (Titanium)

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

① 这是我的模拟器信息: 供个人使用的 Genymotion - Samsung 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 也什么都没有。谁有好办法给我,先谢谢了。

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

请将外部存储用于您需要从非创建应用程序访问的文件。

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

① 从模拟器获取本地文件

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

首先,emulated目录只是模拟器专用的,所有android模拟器都有这个目录。然后,目录 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(外部存储)[=98=的文件路径].但是,有一个坏消息要告诉你,Titanium API提供的检测外部存储是否存在的方法不好用。详情如下:

  1. if(Ti.Filesystem.isExternalStoragePresent()) 总是 return true 虽然, SDCard 不存在。

    我想现在几乎所有的智能手机都内置了 内部存储(绝不意味着智能手机本身的存储像电话本,我的意思是内部存储是一种特殊的外部存储,但嵌入到智能手机中),SDCard是扩展存储,但他们'同样。

  2. 不同厂家外接存储设置不同

    在我的测试中,当智能手机来自HUAWEI时,外部存储路径变为: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');
    }
    

    嗯,太可怕了!

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

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