MrTouch
MrTouch

Reputation: 654

Download mp3 and save as Ringtone

I want to download an mp3 File from a Link on the Phone(Isolated Storage) and then save it as a Ringtone.

But my Code doesn't work correctly... It gives me back an Error:

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

I call the function like this:

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

    }

The Globalvariables Url is like: www.example.com/mp3/M/myfile.dmf.mp3 (if you need for testing i can give you my real url)

and the filename is like: myfile.dmf.mp3

This is in the Ringtone Class:

   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;
        }
    }

i did it like this example: http://blog.toetapz.com/2010/11/29/how-to-download-and-save-mp3-to-isolatedstorage/

the rest is the safe ringtone part. This works when i add the mp3, directly to my projekt and use the appdata:xyz.mp3 part of the code.

     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;
        }
    }
}

I hope my Problem is understandable. Thanks.

Upvotes: 2

Views: 1781

Answers (1)

MrTouch
MrTouch

Reputation: 654

The Solution to my Problem was to add this:

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

after this:

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

Upvotes: 1

Related Questions