Bib*_*ins 7 c# filesystems android xamarin.forms uwp
我尝试从网络下载文件并保存到任何 Environment.SpecialFolder 位置。无论我尝试什么方法 - 我总是得到
System.UnauthorizedAccessException: '访问路径'我尝试的任何可能的路径(甚至超出 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));
Run Code Online (Sandbox Code Playgroud)
您面临权限问题。
首先,您必须在 AndroidManifest 中添加:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
由于 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);
}
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式在运行时检查您是否具有权限:
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];
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,您可以查看此博客文章,解释 Android 中的所有权限 - https://devblogs.microsoft.com/xamarin/requesting-runtime-permissions-in-android-marshmallow/