使用 Environment 访问 Android 特殊文件夹路径

Posted

技术标签:

【中文标题】使用 Environment 访问 Android 特殊文件夹路径【英文标题】:Access the Android Special Folder Path by using Environment 【发布时间】:2019-06-05 04:53:50 【问题描述】:

我想将我的日志保存到我可以使用 Windows 资源管理器访问的文件夹中。例如我想在以下路径中创建我的日志

这台电脑\Galaxy A5 (2017)\Phone\android\data\MyApp\files

所以我尝试使用环境变量...我得到诸如

/数据/用户/...

但是在这里我看不到我创建的文件(使用代码我可以访问路径,但我想在资源管理器中看到)。

如何使用代码创建类似上面的路径?

当我尝试这段代码时

var finalPath2 = Android.OS.Environment.GetExternalStoragePublicDirectory
(Android.OS.Environment.DataDirectory.AbsolutePath);

我得到路径“/storage/emulated/0/data”

如果我使用代码

   var logDirectory =Path.Combine(System.Environment.GetFolderPath
  (System.Environment.SpecialFolder.ApplicationData),"logs");

我得到以下路径:

/data/user/0/MyApp/files/.config/logs

var logDirectory =Path.Combine(System.Environment.GetFolderPath
  (System.Environment.SpecialFolder.MyDocuments),"logs");

“/data/user/0/IM.OneApp.Presentation.Android/files/logs”

但不幸的是,我无法通过资源管理器访问此文件夹....

这台电脑\Galaxy A5 (2017)\Phone\Android\data\MyApp\files

那么如何在c#中通过环境找出这条路径呢?

更新:

当我给出以下硬编码的路径时,它会在我想要的位置创建文件..

logDirectory = "/storage/emulated/0/Android/data/MyApp/files/logs";

是否有任何环境可以创建此路径?我可以结合 2 个环境并进行一些字符串处理以创建此路径。但也许有更简单的方法?

【问题讨论】:

@SushiHangover,我更喜欢保存在我们的应用文件夹中。我正在更新我的问题 @SushiHangover 给定的路径有效(我已经更新了我的问题)我只需要创建这个路径.. 这是公共存储(模拟),因为它在您应用的沙盒之外,而不是私有沙盒应用存储。任何人都可以访问它,就像音乐、下载、电影等一样。如果您可以访问私有应用程序文件存储(即 root 手机),整个 Android 文件系统安全模型就会被破坏 @SushiHangover,当然。我的意思是不通过沙箱将文件保存到文件夹中。但正如您看到的路径,它比“下载”文件夹“更”私密。我希望它现在清楚了。顺便谢谢你的回复.. 【参考方案1】:

你正在寻找GetExternalFilesDir的根,只需传递一个null:

示例:

var externalAppPathNoSec = GetExternalFilesDir(string.Empty).Path;

注意:这是一个基于 Context 的实例方法,您可以通过 Android 应用程序上下文、Activity 等来访问它...(请参阅下面的 Android 上下文文档链接)

共享存储可能并不总是可用,因为用户可以弹出可移动媒体。可以使用 Environment.getExternalStorageState(File) 检查媒体状态。

这些文件没有强制执行安全措施。例如,任何持有 Manifest.permission.WRITE_EXTERNAL_STORAGE 的应用程序都可以写入这些文件。

回复:https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String)

【讨论】:

这正是我想要的......我已经给予了许可。非常感谢。【参考方案2】:
string docFolder = Path.Combine(System.Environment.GetFolderPath
     (System.Environment.SpecialFolder.MyDocuments), "logs");
string libFolder = Path.Combine(docFolder, "/storage/emulated/0/Android/data/MyApp/files/logs");
if (!Directory.Exists(libFolder))

    Directory.CreateDirectory(libFolder);


string destinationDatabasePath = Path.Combine(libFolder, "temp.db3");

db.Backup( destinationDatabasePath, "main");

【讨论】:

以上是关于使用 Environment 访问 Android 特殊文件夹路径的主要内容,如果未能解决你的问题,请参考以下文章

Android外部存储ExternalStorage

Android 如何使用 Environment.getExternalStorageDirectory()

Android中Environment与StatFs获取系统/SDCard存储空间大小

如何使用 adb 将文件复制到可从 PC 访问的 android 目录

是否有理由在iOS或Android移动设备的XF代码中使用Environment.NewLine而不是 n?

Android常用记录:Environment获取路径大全