如何在xamarin android下载mp3文件?

时间:2016-05-20 03:42:02

标签: xamarin xamarin.android

    async void ImgDownload_Click (object sender, EventArgs e)
    {
        var webClient=new WebClient();
    var url=new Uri(stream_url_soundcloud);
    byte[] bytes=null;


    webClient.DownloadProgressChanged+= WebClient_DownloadProgressChanged;
    dialog = new ProgressDialog (this);
    dialog.SetProgressStyle (ProgressDialogStyle.Horizontal);
    dialog.SetTitle("Downloading...");
    dialog.SetCancelable (false);
    //dialog.SetButton("Cancel",);
    dialog.SetCanceledOnTouchOutside (false);
    dialog.Show ();

    try
    {
        bytes= await webClient.DownloadDataTaskAsync(url);
    }
    catch(TaskCanceledException)
    {
        Toast.MakeText(this,"Task Canceled!",ToastLength.Long);
        return;
    }
    catch(Exception a)
    {
        Toast.MakeText(this,a.InnerException.Message,ToastLength.Long);
        dialog.Progress=0;
        return;
    }

    Java.IO.File documentsPath= new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMusic),"MusicDownloaded");
    string localFilename = documentsPath + mListData[mPosition].track.title+".mp3";
    //string localPath=System.IO.Path.Combine(documentsPath,localFilename);
    Java.IO.File localPath=new Java.IO.File(documentsPath,localFilename);

    dialog.SetTitle("Download Complete");

    //Save the Mp3 using writeAsync
    //FileStream fs=new FileStream(localPath,FileMode.OpenOrCreate);
    OutputStream fs=new FileOutputStream(localPath);
    await fs.WriteAsync (bytes, 0, bytes.Length);

    fs.Close ();


    dialog.Progress = 0;
    }

    void WebClient_DownloadProgressChanged (object sender, DownloadProgressChangedEventArgs e)
    {
        dialog.Progress = e.ProgressPercentage;
        if (e.ProgressPercentage == 100) {
            //dialog.Hide ();
        }
    }


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

我在三星Galaxy上测试应用程序,但它在FIle.WriteAllBytes显示错误。 无法找到方向......

文件夹设备是MyAudio。这不是MyMusic。 - 我试图将mymusic替换为mydocument。它没有显示错误,但我等了大约3分钟,然后进入我的设备上的mydocument =&gt;看不到任何mp3文件。

2 个答案:

答案 0 :(得分:2)

尝试与此类似的内容(使用DownloadFileTaskAsync方法):

        button.Click += async delegate
        {
            var destination = Path.Combine(
                System.Environment.GetFolderPath(
                    System.Environment.SpecialFolder.ApplicationData),
                    "music.mp3");

            await new WebClient().DownloadFileTaskAsync(
                new Uri("http://www.xyzmusic.com/music.mp3"),
                destination);
        };

参考:https://stackoverflow.com/a/22420894/3891036

答案 1 :(得分:1)

可能是路径问题? 我的位工作:

         public async Task<string> SaveFilePublicStorage(string filename, byte[] fileBody)
         {
            var documentsPath = Android.OS.Environment.ExternalStorageDirectory + "/download/";
            var filePath = Path.Combine(documentsPath, filename);
            File.WriteAllBytes(filePath, fileBody);
            return filePath;
         }