当前位置: 首页 > 知识库问答 >
问题:

Delphi XE5 Android-存储路径问题

贲凌
2023-03-14

我开始在Delphi XE5中为android开发应用程序,遇到了一些问题。

我真的不懂怎么找路。在我设置了写入和读取外部存储的权限后,我尝试获取路径,以便查看我将创建的文件保存在何处,我得到的结果如下:

对于系统。尤蒂尔斯。第四-

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应该是默认的sdcard路径,下载应该是sdcard/Downloads,但它使用/Android/data/application的文件夹/文件/在这里创建的文件夹已经存在于sdcard本身。

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

它有几个快捷方式,据我所知,存储/仿真/0/,存储/sdcard0/,也可以从root的文件夹直接访问sdcard/(但我猜没有root访问的应用程序只有默认访问存储/文件夹,因此存储/sdcard0和仿真/0文件夹存在;不知道为什么重复的快捷键到相同的文件夹,虽然...(

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

此外,这些路径问题是否与以下事实有关:手机没有挂载选项,只有MTP,或者是android 4.3,或者。。。。?

谢谢

//更新:如鲁弗爵士建议的那样,关于这个和屏幕分辨率的问题被分割开来。

更新:看起来像是硬编码“/sdcard/filename。“扩展”作为路径字符串完成了这项工作,但我不确定在应用程序中硬核位置有多明智…://

共有2个答案

金霄
2023-03-14

下面的函数将从GetShared path获得默认SD卡路径;第一种方法很简单,只需从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的帮助。:)

牟波
2023-03-14

尽量不要硬编码路径。对于不同的Android平台,外部存储的路径可能会有所不同,您将错过跨平台编程的优势。当我开始为Android系统编程时,我写了一个小应用程序“在哪里”,目标是列出所有平台的所有“特殊”目录。这是非常有用的,因为我不知道这些目录甚至Windows,更不用说Android。在您的示例中,您错过了共享目录。这将返回路径到/存储/仿真/0/音乐/GetSharedMusicPath,以此类推为电影下载等。我以为我的银河标签不同,但我不确定。只需删除姓氏,您就拥有了外部存储的路径。

如果你想读写到你的外部存储(在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 //
 类似资料:
  • 01-20 08:55:14.787:W/System.err(1383):at libcore.io.iobridge.open(iobridge.java:409)01-20 08:55:14.787:W/System.err(1383):at java.io.fileInputStream.(fileInputstream.java:78)01-20 08:55:14.827:W/Syste

  • 我对firebase存储是新手,想知道什么是最好的做法。我想上传图像到firebase云存储,并返回了一个下载url,然后我存储到FireStore。下载网址是永久的吗?其他用户将从firestore读取以获得下载图像的url。 但是当我想从CloudStorage中删除图像时,我只有下载url,而没有文件路径。所以我要删除它吗? 如果我存储的是文件路径,如何获得下载url?

  • 问题内容: 我在Eclipse中保存密码时遇到问题。我的密码都没有被“记住”,我发现Eclipse试图将其保存在Windows帐户无法访问的文件夹中。 它尝试保存到 一个不存在的目录,我的Win帐户也无法将其写入该目录。 我发现我的user.home变量设置为D:\ Users \ Administrator。我的猜测很疯狂,因为安装Java的是Administrator帐户。 所以我的问题是-我

  • 我正在尝试将我上传到Tomcat的文件的路径存储到我的MySQL数据库中。我已经存储了名为filepath的字符串的路径,但是当我执行程序时,我收到了以下错误: “您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在第1行的':\User\Nick\Desktop\bot.png)'附近使用的正确语法”我使用的代码的一部分: 我想问题与路径的格式有关,但我对java很陌生,所以我

  • 问题内容: 我有两节课: MyApplication 库 该库已被编译为Library.class,并且源代码不再可用。我现在正在尝试从源代码编译MyApplication。MyApplication取决于库。该库的软件包名称为org.myCompany。我尝试将我的类路径设置为以下内容: 产生以下javac编译器错误消息: 所以我将类路径更改为: 产生完全相同的错误消息。 如何设置Windows

  • 我正在尝试在Android 8 API Level 26 emulator上运行Xamarin Android应用程序。当我试图将日志写入文件时,这是一个例外。 例外: 系统UnauthorizedAccessException:对路径“/storage/emulated/0/abc.txt”的访问被拒绝 代码: 我也给了和权限。 目标Android版本:Android8.0 API级别26 Or