Я хочу скачать файл 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;
}
}
}
Надеюсь, моя проблема понятна. Спасибо.