Delphi XE5 Android - 存储路径问题

时间:2014-01-13 19:32:02

标签: android delphi delphi-xe5

我开始在Delphi XE5中为Android做一个应用程序,并遇到了一些麻烦。

我真的不明白获得路径。 在我设置写入和读取外部存储的权限后,我试图获取路径,以便我可以看到我在哪里保存我创建的文件,这就是我得到的:

表示System.IOUtils.TPath。 - >

GetDocumentsPath;       -  /data/data/com.myapp.app1/files
GetDownloadsPath;       -  /storage/emulated/0/Android/data/com.myapp.app1/files/Download
GetHomePath;            -  /data/data/com.myapp.app1/files
GetSharedDocumentsPath; -  /storage/emulated/0/Android/data/com.myapp.app1/files
GetLibraryPath;         -  /data/data/com.myapp.app1/files
GetPublicPath;          -  /storage/emulated/0/Android/data/com.myapp.app1/files
GetPicturesPath;        -  /storage/emulated/0/Android/data/com.myapp.app1/files/Pictures

据我从其他主题了解,GetDocumentsPath应该是默认的SD卡路径,下载应该是sdcard / Downloads,而是使用/ android / data / application的文件夹/ files / here创建文件夹已经存在于SD卡上本身。

/ emulated / 0 /实际上与我手机上的/ sdcard /相同,如果这让任何人感到困惑(以防万一......)。

它有几个快捷方式,据我所知,存储/模拟/ 0 /,存储/ sdcard0 /,也可以从root文件夹直接访问sdcard /(但我想没有root访问权限的应用只能默认访问存储/文件夹,因此存在/ sdcard0和emulated / 0文件夹;不知道为什么重复的快捷方式到同一个文件夹,但....)

[[还有存储/模拟/遗留/,它似乎也指向同一个文件夹,但我从来没有碰过它,因为我曾经遇到过一些文件重复和奇怪的音乐库行为的麻烦,就在我生根之前并格式化它。从未想过真正发生过什么,但甚至不关心。事实是,模拟文件夹似乎是邪恶的和无法解释的;)]]

此外,这些路径问题是否与事实相关,手机没有挂载选项,但只有MTP,或者它是android 4.3,还是......?

感谢。

//更新:关于这个和屏幕分辨率的分裂问题正如Rufo先生所建议的那样。

更新: 看起来硬编码'/sdcard/filename.extension'作为路径字符串完成工作,但是我不确定在应用程序中硬核位置是多么明智......://

2 个答案:

答案 0 :(得分:3)

尽量不要对路径进行硬编码。对于不同的Android平台,外部存储的路径可能会有所不同,您将错过跨平台编程的优势。当我开始为Android编程时,我写了一个小应用'Where',目标是列出所有平台的所有'特殊'目录。这非常有用,因为我甚至不知道Windows的这些目录,更不用说Android了。在您的示例中,您会错过SharedDirectories。这将返回/storage/emulated/0/Music/ GetSharedMusicPath的路径,例如MoviesDownload等等。我认为我的Galaxy Tab不同但是我我不确定。只需删除姓氏,即可获得外部存储路径。

如果要读取和写入外部存储(在Project | Options | Android中的某个位置),请注意设置READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE。我不知道Android是否允许您在外部存储根目录中编写,您必须亲自尝试。

uses System.IOUtils;

procedure THeaderFooterForm.Loaded;
begin
   inherited Loaded;

   TPath.SetApplicationPath ('WhereAppTest');

   add_path (TPath.GetTempPath, 'GetTempPath');
   add_path (TPath.GetHomePath, 'GetHomePath');
   add_path (TPath.GetDocumentsPath, 'GetDocumentsPath');
   add_path (TPath.GetApplicationPath ('WhereAppTest'), 'GetApplicationPath');
   add_path (TPath.GetSharedDocumentsPath, 'GetSharedDocumentsPath');
   add_path (TPath.GetLibraryPath, 'GetLibraryPath');
   add_path (TPath.GetCachePath, 'GetCachePath');
   add_path (TPath.GetPublicPath, 'GetPublicPath');
   add_path (TPath.GetPicturesPath, 'GetPicturesPath');
   add_path (TPath.GetSharedPicturesPath, 'GetSharedPicturesPath');
   add_path (TPath.GetCameraPath, 'GetCameraPath');
   add_path (TPath.GetSharedCameraPath, 'GetSharedCameraPath');
   add_path (TPath.GetMusicPath, 'GetMusicPath');
   add_path (TPath.GetSharedMusicPath, 'GetSharedMusicPath');
   add_path (TPath.GetMoviesPath, 'GetMoviesPath');
   add_path (TPath.GetSharedMoviesPath, 'GetSharedMoviesPath');
   add_path (TPath.GetAlarmsPath, 'GetAlarmsPath');
   add_path (TPath.GetSharedAlarmsPath, 'GetSharedAlarmsPath');
   add_path (TPath.GetDownloadsPath, 'GetDownloadsPath');
   add_path (TPath.GetSharedDownloadsPath, 'GetSharedDownloadsPath');
   add_path (TPath.GetRingtonesPath.Empty, 'GetRingtonesPath');
   add_path (TPath.GetSharedRingtonesPath, 'GetSharedRingtonesPath');
   FMediaPlayer := TMediaPlayer.Create(Self);
end; // Loaded //

procedure THeaderFooterForm.add_path (path, header: string);
var
   item: TListViewItem;
   bitmap: TBitmap;
begin
   item := List_Paths.Items.Add;
   item.ButtonText := 'button';
   item.Detail := path;
   item.Text := header;
end; // add_path //

答案 1 :(得分:1)

这是从GetShared路径获取默认SDCard路径的函数; 第一个很简单,只能从SharedMusic的固定路径获取SDCard路径;

function GetSDCardPath: string;
var MusicPathLength: integer;
    MusicPath, SDCardPath: string;
begin
  MusicPath:=System.IOUtils.TPath.GetSharedMusicPath;
  MusicPathLength:=Length(MusicPath);
  SDCardPath:=Copy(MusicPath, 0, MusicPathLength-5);
  Result:=SDCardPath;
end;

我可以添加函数从任何提供的路径结果中提取sdcard路径,但我认为上面的示例是您可以使用的最简单的,并且对我来说完美无缺。感谢@Arnold的帮助。 :)