Скачать mp3 и сохранить как рингтон - PullRequest
2 голосов
/ 27 марта 2012

Я хочу скачать файл mp3 по ссылке на телефоне (в изолированном хранилище), а затем сохранить его в качестве мелодии звонка.

Но мой код не работает правильно ... Он возвращает мне ошибку:

  System.InvalidOperationException: Path must point to a file in your Isolated Storage or Application Data directory.

Я вызываю функцию так:

   private void getRingtone_Click(object sender, EventArgs e)
    {
        ringtone = new Ringtone();
        ringtone.DownloadFile(GlobalVariables.Url, GlobalVariables.filename);
        //ringtone.SaveRingtone();

    }

URL-адрес Globalvariables выглядит следующим образом: www.example.com/mp3/M/myfile.dmf.mp3 (если вам нужно для тестирования, я могу дать вам свой реальный URL)

и имя файла выглядит так: myfile.dmf.mp3

Это в классе рингтонов:

   WebClient _webClient; // Used for downloading mp3
    private bool _playSoundAfterDownload;
    MediaElement mediaSound;
    SaveRingtoneTask saveRingtoneChooser;


    public void DownloadFile(string uri, string filename)
    {
        _webClient = new WebClient();
        saveRingtoneChooser = new SaveRingtoneTask();
        saveRingtoneChooser.Completed += new EventHandler<TaskEventArgs>(saveRingtoneChooser_Completed);
        _webClient.OpenReadCompleted += (s1, e1) =>
        {
            if (e1.Error == null)
            {
                try
                {
                    string fileName = GlobalVariables.filename;
                    bool isSpaceAvailable = IsSpaceIsAvailable(e1.Result.Length);

                    if (isSpaceAvailable)
                    {
                        // Save mp3 to Isolated Storage
                        using (var isfs = new IsolatedStorageFileStream(fileName,
                                            FileMode.CreateNew,
                                            IsolatedStorageFile.GetUserStoreForApplication()))
                        {
                            long fileLen = e1.Result.Length;
                            byte[] b = new byte[fileLen];
                            e1.Result.Read(b, 0, b.Length);
                            isfs.Write(b, 0, b.Length);
                            isfs.Flush();
                        }

                        if (_playSoundAfterDownload)
                        {
                            _playSoundAfterDownload = false;
                            SaveRingtone();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Not enough to save space available to download mp3.");
                    }

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            else
            {
                MessageBox.Show(e1.Error.Message);
            }
        };
        SaveRingtone();
    }

    // Check to make sure there are enough space available on the phone
    // in order to save the image that we are downloading on to the phone
    private bool IsSpaceIsAvailable(long spaceReq)
    {
        using (var store = IsolatedStorageFile.GetUserStoreForApplication())
        {

            long spaceAvail = store.AvailableFreeSpace;
            if (spaceReq > spaceAvail)
            {
                return false;
            }
            return true;
        }
    }

Я сделал это, как в этом примере: http://blog.toetapz.com/2010/11/29/how-to-download-and-save-mp3-to-isolatedstorage/

остальное - безопасная мелодия звонка. Это работает, когда я добавляю mp3 прямо в мой проект и использую часть appdata: xyz.mp3.

     private void SaveRingtone()
    {
        try
        {
            //saveRingtoneChooser.Source = new Uri("appdata:/myTone.wma");
            saveRingtoneChooser.Source = new Uri("isostore:/"+GlobalVariables.filename); 

            saveRingtoneChooser.DisplayName = "My custom ringtone";

            saveRingtoneChooser.Show();
        }
        catch (System.InvalidOperationException ex)
        {
            MessageBox.Show("An error occurred."); //Error appears here.
        }
    }
    void saveRingtoneChooser_Completed(object sender, TaskEventArgs e)
    {
        switch (e.TaskResult)
        {
            //Logic for when the ringtone was saved successfully
            case TaskResult.OK:
                MessageBox.Show("Ringtone saved.");
                break;

            //Logic for when the task was cancelled by the user
            case TaskResult.Cancel:
                MessageBox.Show("Save cancelled.");
                break;

            //Logic for when the ringtone could not be saved
            case TaskResult.None:
                MessageBox.Show("Ringtone could not be saved.");
                break;
        }
    }
}

Надеюсь, моя проблема понятна. Спасибо.

1 Ответ

1 голос
/ 28 марта 2012

Решением моей проблемы было добавить это:

        Uri url = new Uri(GlobalVariables.Url, UriKind.Absolute);
        _webClient.OpenReadAsync(url);

после этого:

      _webClient.OpenReadCompleted += (s1, e1) =>
      {.... };
...