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

Posted

技术标签:

【中文标题】Xamarin Forms:在 Android 设备的内部存储中写入文件【英文标题】:Xamarin Forms: Write a file in Android device's internal storage 【发布时间】:2017-10-11 10:19:09 【问题描述】:

我正在使用 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();
        
    

【问题讨论】:

通常建议(并且安全)使用应用程序的沙箱来存储文件。如果您将文件存储到设备存储中,而不是您的文件可以轻松修改/删除... Directory.CreateDirectory(dirPath); 不应该检查返回值吗?或者在尝试将文件放入其中之前检查目录是否存在? 在特定行上显示“访问被拒绝” 使用内部存储根本不需要任何权限。 安卓版本? 【参考方案1】:

在此我需要在 android 的内部存储中写入一个文件,以便我可以访问它。我已授予写入外部存储权限,但是当我尝试写入文件时,它显示访问被拒绝。

首先<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />的权限是针对外部存储的,所以对内部存储不起作用。

根据您的代码:

Java.IO.File DataDirectoryPath = Android.OS.Environment.DataDirectory; 

你写的是Data Directory,这个目录是系统所有的,没有写权限,SO上有几个关于这个问题的讨论,例如:Data directory has no read/write permission in Android 。

因此,正如那里的答案所建议的那样,您可以使用 getFilesDir() 写入内部存储,在 Xamarin 中,它是 Android.Content.Context.FilesDir Property。

更新:

我根据你的代码写了一些代码,应该是一样的,例如:

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();
        
    

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

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

【讨论】:

你有使用这个属性的示例代码吗?请分享。 @Sonali,我根据您的代码编写了一些代码,请查看我更新的答案。如果您觉得这对您有帮助,请您标记这个答案吗? 我将this 替换为Android.App.Application.Context.FilesDir。对吗? @Sonali,是的,没错,抱歉回复晚了,我正在开会。刚刚用 Xamarin.Forms 测试过,效果很好。 如何在设备中查看此文件?

以上是关于Xamarin Forms:在 Android 设备的内部存储中写入文件的主要内容,如果未能解决你的问题,请参考以下文章

将Xamarin.Android应用程序迁移到Xamarin.Forms应用程序

Xamarin.Forms Android 底部导航栏

在 Xamarin.Forms 中将默认的深色 Android 主题更改为白色?

Xamarin.Forms 手势密码实现

Xamarin.Forms 是 Xamarin.Android、Xamarin.IoS 和 Xamarin.Win 的简单总和吗?

跨 Android/iOS 的 Xamarin 通用 Xamarin.Forms 代码