Xamarin表单:在Android设备的内部存储中写入文件

Son*_*ali 1 android file xamarin.android xamarin.forms

我正在使用Xamarin Forms PCL项目开发一个跨平台的应用程序.在这里我需要在Android的内部存储中写一个文件,以便我可以访问它.我已经写入了"外部存储"权限,但是当我尝试编写该文件时,它表示拒绝访问.

这是我尝试过的:

Java.IO.File DataDirectoryPath = Android.OS.Environment.DataDirectory;
string dirPath = DataDirectoryPath.AbsolutePath + "/MyFolder";
bool exists = Directory.Exists(dirPath);
string filepath = dirPath + "/test.txt";
if (!exists)
{
    Directory.CreateDirectory(dirPath);
    if (!File.Exists(filepath))
    {
        File.Create(filepath).Dispose();
        using (TextWriter tw = new StreamWriter(filepath))
        {
            tw.WriteLine("The very first line!");
            tw.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*eng 5

在这里,我需要在android的内部存储中写一个文件,以便我可以访问它.我已经写入了"外部存储"权限,但是当我尝试编写该文件时,它表示拒绝访问.

首先,权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />是外部存储,因此它不适用于内部存储.

根据您的代码:

Java.IO.File DataDirectoryPath = Android.OS.Environment.DataDirectory; 
Run Code Online (Sandbox Code Playgroud)

您用于Data Directory写作,此目录由系统拥有,并且没有写入它的权限,在SO上有关于此问题的几个讨论,例如:数据目录在Android中没有读/写权限 .

所以,正如它在答案中建议的那样,你可以getFilesDir()用来编写内部存储,在Xamarin中,它是Android.Content.Context.FilesDir属性.

更新:

我根据你的代码编写了一些代码,它应该是相同的,例如:

var dirPath = this.FilesDir + "/MyFolder";
var exists = Directory.Exists(dirPath);
var filepath = dirPath + "/test.txt";
if (!exists)
{
    Directory.CreateDirectory(dirPath);
    if (!System.IO.File.Exists(filepath))
    {
        var newfile = new Java.IO.File(dirPath, "test.txt");
        using (FileOutputStream outfile = new FileOutputStream(newfile))
        {
            string line = "The very first line!";
            outfile.Write(System.Text.Encoding.ASCII.GetBytes(line));
            outfile.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也通过DDMS检查了这个文件,可以在文件夹下看到data\data\yourAPP\files\MyFolder\test.txt:

在此输入图像描述

我只是测试Xamarin.Android项目,没有尝试使用DependencyServiceXamarin.Forms,如果你想这样做,只需将this上面代码中的单词替换为你的android上下文.

  • 我用`Android.App.Application.Context.FilesDir`替换了`this`.这是对的吗? (2认同)