2

電話のリンク (分離ストレージ) から 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 は次のようになります: 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;
        }
    }
}

私の問題が理解できることを願っています。ありがとう。

4

1 に答える 1

1

私の問題の解決策はこれを追加することでした:

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

この後:

      _webClient.OpenReadCompleted += (s1, e1) =>
      {.... };
于 2012-03-28T06:57:59.117 に答える