電話のリンク (分離ストレージ) から 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;
}
}
}
私の問題が理解できることを願っています。ありがとう。