0

我知道c#;已为 windows mobile 开发;我现在有一个无法更改约束的 android 项目;最重要的是无法在 API 16 以上运行,因为应用程序将在其上运行。这些设备已经购买。我知道这些设备的年代,以及 4.1 的年代;双手被绑。

我已经为 android 启动了一个新的 Xamarin(不是表单)项目;使用 8.1 Oreo 编译;最低版本 4.1,目标版本 8.1。我知道这并不理想,但是这样做我已经设法使许多其他需要的功能正常工作,包括相机和条形码扫描仪。将编译版本更改为 4.1 会导致许多无法编译的错误。

我正在使用实际设备上的 USB 调试来测试设备,即使它是 4.1,代码运行并且功能工作 - 相机、扫描仪等。

我一直试图创建一个文件夹,然后在该文件夹中写入/读取一个文件。我希望在插入计算机时可以通过 Windows 资源管理器访问此文件夹。

我有这样的代码来编写文件:

string FileContents = "Text file contents";

Java.IO.File SaveFolder = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory("Documents") + Java.IO.File.Separator + "FolderName");

Boolean Success = false;
if (!SaveFolder.Exists())
{
    Success = SaveFolder.Mkdirs();
}

string FName = "test.txt";
string FTogether = System.IO.Path.Combine(SaveFolder.Path, FName);

Java.IO.FileWriter fw = new Java.IO.FileWriter(FTogether);
fw.Write(FileContents);
fw.Close();
SaveFolder.Dispose();

和这样的代码来读取文件:

Java.IO.File SaveFolder = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory("Documents") + Java.IO.File.Separator + "FolderName");

string FName = "test.txt";
string FTogether = System.IO.Path.Combine(SaveFolder.Path, FName);

StreamReader sr = new StreamReader(FTogether);
string FileContents = sr.ReadToEnd(); 

调试显示 SaveFolder 的 AbsolutePath 为 /storage/sdcard0/Documents/FolderName

我认为这是应用程序可以访问的 android 内部存储的一部分,但没有别的。

如何获取可从应用程序外部访问的文件夹?

Environment.DirectoryDocuments 

无法使用,因为它在 API 16 上运行时为空。

4

1 回答 1

0

您拥有的路径实际上是可公开访问的,因此它并不特定于您的应用程序。当您将 Android 设备连接到计算机时,您应该能够转到设备的根文件夹并看到 Documents 文件夹。

不要让/storage/sdcard0/路径开头的部分让您感到困惑。由于历史原因,即使设备上实际上没有 SD 卡,Android 也会模拟一张 SD 卡。实际上,/storage/sdcard0/只是一个符号链接到/data/media/0.

为了对 Android 存储有一个非常好的概述,我建议您阅读这篇非常详尽的 Reddit 帖子:让我们一劳永逸地消除关于 Android 存储的困惑,包括 Marshmallow 中的可采用存储。

您还可以下载一个文件浏览器应用程序(如果您的手机还没有),然后转到 Documents 文件夹。你应该看到FolderName那里。


编辑:由于您在这么旧的版本上运行,您可能还会遇到 MTP 协议中的错误,这会导致新创建的文件和文件夹在通过 USB 将设备连接到计算机时不可见。

修复方法是调用MediaScannerConnection.scanFile您创建的每个新文件/文件夹,如此所述。

于 2019-11-20T09:52:03.857 回答