我用WebClient
在我的apk中下载了一个文件。但是我得到了这个错误:未处理的异常:
System.Net.WebException:在 WebClient 请求期间发生异常。
这是我尝试过的代码:
{
using (WebClient client = new WebClient())
{
client.DownloadFile(
"https://code.org/images/social-media/code-2018-creativity.png",
@"j:storageemulatedlegacyDownloadcode-2018-creativity.png");
}
}
由于您仅引用 WebException,因此它可能与以下情况之一有关:
- 由
BaseAddress
和address
组合形成的 URI 无效。 - 文件或目标文件夹不存在。确保你的路径目标文件夹已存在,并且您有权访问它。
- 发生错误时下载数据。
如果您向我们提供有关异常的更多信息,我们可能能够将错误减少到这些情况之一。要获得InnerException
,您可以执行以下操作:
{
using (WebClient client = new WebClient ())
{
try
{
client.DownloadFile (
"https://code.org/images/social-media/code-2018-creativity.png",
@"j:storageemulatedlegacyDownloadcode-2018-creativity.png");
}
catch (Exception ex)
{
while (ex != null)
{
Console.WriteLine (ex.Message);
ex = ex.InnerException;
}
}
}
}
如果您运行的是 Android API 级别 23 或更高版本,即使您在清单文件中提到了它们,您也必须在运行时请求权限。
看看这个博客会帮助你了解如何询问运行时权限:requesting-runtime-permissions-in-android
此外,这是如何检查运行时权限的官方示例
参考: xamarin-system-unauthorizedaccessexception-access-access-to-the-path-is-deny
更新:
要询问运行时权限,您可以使用此插件:Plugin.Permissions,将其安装到您的项目中。
然后,在下载文件之前致电CheckMyPermissionAsync();
:
private void FabOnClick(object sender, EventArgs eventArgs)
{
View view = (View) sender;
CheckMyPermissionAsync();
}
在方法 CheckMyPermissionAsync()
中,检查您的存储权限,然后下载文件:
public async void CheckMyPermissionAsync()
{
var permissionsStartList = new List<Permission>()
{
Permission.Storage
};
var permissionsNeededList = new List<Permission>();
try
{
foreach (var permission in permissionsStartList)
{
var status = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
if (status != PermissionStatus.Granted)
{
permissionsNeededList.Add(permission);
}
}
}
catch (Exception ex)
{
}
var results = await CrossPermissions.Current.RequestPermissionsAsync(permissionsNeededList.ToArray());
//Check the persimmison again
var storeagePermission = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
if (storeagePermission == PermissionStatus.Granted)
{
//Download file here
DownloadFile("http://www.dada-data.net/uploads/image/hausmann_abcd.jpg", "XF_Downloads");
}
else {
Console.WriteLine("No permissions");
}
}
您可以在已完成的事件中检查结果:
private void Completed(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
Console.WriteLine("success");
}
else
{
if (OnFileDownloaded != null) { }
Console.WriteLine("fail");
}
}
注意:注意你的文件路径,确保你的路径正确,我使用:
string pathToNewFolder = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, folder);
我在这里更新了我的示例:runtime-permission-xamarin.android