c# - Xamarin.Forms 在文件系统中保存文件
问题描述
我尝试从网络下载文件并保存到任何 Environment.SpecialFolder 位置。无论我尝试哪种方法 - 我总是得到
System.UnauthorizedAccessException: 'Access to the path '我尝试的任何可能的路径(甚至超出 Environment.SpecialFolder)' 被拒绝。
我尝试在 UWP 和 Android 上访问文件系统 - 都是相同的例外。
到目前为止我没有运气的尝试:
代码示例:
var webClient = new WebClient();
webClient.DownloadDataCompleted += (s, e) => {
var bytes = e.Result;
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
string localFilename = "downloaded.jpg";
string localPath = Path.Combine(documentsPath, localFilename);
File.WriteAllBytes(localPath, bytes);
};
webClient.DownloadDataAsync(new Uri(url));
解决方案
您正面临权限问题。
首先,您必须在 AndroidManifest 中添加:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
而且由于Android Marshmallow,您需要向用户询问权限,所以我建议使用包Permissions.Plugin
并添加您的 MainActivity:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
如果您具有以下权限,则可以在运行时签入:
var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
if (status != PermissionStatus.Granted)
{
if(await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Storage))
{
await DisplayAlert("Need storage, "Request storage permission", "OK");
}
var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Storage);
//Best practice to always check that the key exists
if(results.ContainsKey(Permission.Storage))
status = results[Permission.Storage];
}
有关更多信息,您可以查看此博客文章,解释 Android 中的所有权限 - https://devblogs.microsoft.com/xamarin/requesting-runtime-permissions-in-android-marshmallow/
推荐阅读
- terminal - 管道“查找”命令结果列表以移动 (mv) 命令 – 终端 (zsh)
- c++ - 我尝试从向量中随机取一个词,但每次都取相同的词
- python - M1 上的 Python 平台混乱
- .net - 如何获取多个微服务使用的 Nuget 包列表
- ubuntu - Kubernetes CrashLoopBackOff - libtinfo.so 文件太短?
- reactjs - React Hooks - useState 使用在 useEffect 期间设置的另一个钩子变量的结果
- python - 在 Julia 中导入 python 库
- javascript - 遍历 Reactjs 中的状态变量
- c# - 为什么在创建索引后它会显示旧索引中的数据?
- php - 在 php 中获取 {{ var }} 的子串