我开始在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'作为路径字符串完成工作,但是我不确定在应用程序中硬核位置是多么明智......://
答案 0 :(得分:3)
尽量不要对路径进行硬编码。对于不同的Android平台,外部存储的路径可能会有所不同,您将错过跨平台编程的优势。当我开始为Android编程时,我写了一个小应用'Where',目标是列出所有平台的所有'特殊'目录。这非常有用,因为我甚至不知道Windows的这些目录,更不用说Android了。在您的示例中,您会错过SharedDirectories。这将返回/storage/emulated/0/Music/
GetSharedMusicPath
的路径,例如Movies
,Download
等等。我认为我的Galaxy Tab不同但是我我不确定。只需删除姓氏,即可获得外部存储路径。
如果要读取和写入外部存储(在Project | Options | Android中的某个位置),请注意设置READ_EXTERNAL_STORAGE
和WRITE_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的帮助。 :)