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 是 Xamarin.Android、Xamarin.IoS 和 Xamarin.Win 的简单总和吗?