Android中的DownloadManager(xamarin)抛出Java.Lang.IllegalArgumentException

时间:2014-06-19 15:36:40

标签: c# android mono xamarin xamarin.android

现在很长一段时间以来,我一直试图通过DownloadManager下载文件。在android中有很多关于如何做到这一点的例子,但是对于xamarin我不是那么幸运。

我创建了一个API v15(4.0.3)最小的应用程序,并检查是否引用了Mono.Android.dll。还添加了权限INTERNETWRITE_EXTERNAL_STORAGE

DownloadManager dm;
dm =  (DownloadManager)GetSystemService (Context.DownloadService);
DownloadManager.Request request = new  Android.App.DownloadManager.Request (Android.Net.Uri.Parse ("https://www.adress));
request.SetDestinationUri (Android.Net.Uri.Parse (EXTERNAL_DIRECTORY));
var c = dm.Enqueue (request);

每当我点击dm.Enqueue (request);时都会发生错误:

enter image description here

我也尝试设置SetDestinationInExternalPublicDirSetDestinationInExternalPublicDir没有成功。

...哦,这是我的目录

  

const string EXTERNAL_DIRECTORY =   Android.OS.Environment.ExternalStorageDirectory.AbsolutePath +   “/ MyAppFolder”;

我不知道我错了什么,请帮帮我。

4 个答案:

答案 0 :(得分:2)

您已将目录路径设置为常量字符串。但是你还没有创建同一个目录。所以你需要创建目录然后传递它。创建这样的路径:

public string GetMyAppDir()
{
    var path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);
    var dir = path.AbsolutePath + File.Separator + "MyAppFolder";
    if (!Directory.Exists(dir))
    {
        Directory.CreateDirectory(dir);
    }
    return dir;
}

然后使用它:

request.SetDestinationUri(Android.Net.Uri.Parse(GetMyAppDir()));

希望它有效。

答案 1 :(得分:1)

诀窍在" Android.Net.Uri.FromFile"位

var dm =  (DownloadManager) GetSystemService (Context.DownloadService);
string webUri = "http://somewhere/some.png";
var dir =  new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/MyAppFolder/");
if (!dir.Exists ())
    dir.Mkdirs ();
var uri = Android.Net.Uri.FromFile (new Java.IO.File (dir.AbsolutePath+"/my.png"));
var request = new  DownloadManager.Request (Android.Net.Uri.Parse (webUri));
request.SetDestinationUri (uri);
dm.Enqueue (request);

答案 2 :(得分:1)

我有同样的问题,但是下载管理器已启用,它取决于Android版本,如果它工作与否。你从downloadmanager(取决于Android版本!)得到的是你仍然需要解决的URI。所以我做的是我添加了以下内容来从本地uri(内容:// downloads / my_downloads / 123)中检索文件路径(file:/// path / to / file)。

像这样:

            DownloadManager downloadManager = (DownloadManager)Application.Context.GetSystemService(Context.DownloadService);

            Uri fileUri = downloadManager.GetUriForDownloadedFile(fileReference);

            String uriString = fileUri.ToString();
            var compareResult = String.Compare("content://", 0, uriString, 0, 10);
            if (compareResult == 0)
            {
                String filePath = "";
                String[] filePathColumn = { "_data" };
                ContentResolver contentResolver = context.ContentResolver;
                var cursor = contentResolver.Query(fileUri, filePathColumn, null, null, null);
                cursor.MoveToFirst();
                int columnIndex = cursor.GetColumnIndex(filePathColumn[0]);
                filePath = cursor.GetString(columnIndex);
                cursor.Close();
                fileUri = Uri.Parse("file://" + filePath);
            }

答案 3 :(得分:0)

我有点惭愧,问题是设备已禁用DownloadManager个应用。