windows phone 8下载和播放背景音频

时间:2014-06-03 13:36:55

标签: windows-phone-8

我正在使用后台文件传输和背景音频播放器。 在TransferStatusChanged事件中,我将文件保存到隔离存储中,然后使用音频播放器播放

如果应用程序处于活动状态,它可以正常工作,如果应用程序未处于活动状态,我也想这样做。

1 个答案:

答案 0 :(得分:1)

在WP8.0中,由于您的TransferStatusChanged在您的应用程序流程中,navigate away from it停止了,因此无法执行此操作:

  

当用户远离应用程序向前导航时,在引发Deactivated事件后,操作系统将尝试将应用程序置于休眠状态。在此状态下,所有应用程序的线程都将停止,并且不会进行任何处理,但应用程序在内存中保持不变。

您可以通过禁用 IdleDetection 使其在 LockScreen 下运行,但当您的应用程序进入休眠/逻辑删除状态时,它将无法运行。

您可以考虑在激活应用程序时开始播放,或者在BAP中放置一些逻辑,您可以在TrackChange上检查文件是否已下载然后播放。


编辑 感谢@Romasz建议在文件完成下载时使用空轨道播放 然后在TrackChange中我检查文件是否已下载并从下载队列中删除 - 这可以在音频背景中完成 - 现在工作正常。这是一些代码

 private AudioTrack GetNextTrack(bool isStart = false)
    {





        AudioTrack track = null;
        using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (isStart)
            {
                currentSongIndex = -1;
            }
            currentSongIndex++;
            if (currentSongIndex == _ProgressList.Count())
            {

                //currentSongIndex = 0;
                return track;
            }

            if (ISF.FileExists("shared/transfers/" + _ProgressList[currentSongIndex].FileName))
            {
                var request = requests.Where(it => it.Key ==  _ProgressList[currentSongIndex].FileName).FirstOrDefault().Value;
                if (request != null)
                {
                   bool isDone = ProcessTransfer(request, _ProgressList[currentSongIndex].Directory);
                    if(!isDone )
                    {
                        if(request.BytesReceived > LastDownloadedSize)
                        {
                            NumberOfTrialsToLoadNextTrack = 0;
                            LastDownloadedSize = request.BytesReceived;
                        }
                        else
                        {
                            ++NumberOfTrialsToLoadNextTrack;
                        }
                    }
                }
            }
            else
            {
                ++NumberOfTrialsToLoadNextTrack;
            }

            if (ISF.FileExists(_ProgressList[currentSongIndex].Directory+_ProgressList[currentSongIndex].FileName))
            {
                track = playList[currentSongIndex];
                NumberOfTrialsToLoadNextTrack = 0;
                LastDownloadedSize = 0;
            }
            else
            {

                 currentSongIndex--;
                 if (NumberOfTrialsToLoadNextTrack < 10)
                 {

                     track = new AudioTrack(new Uri("halfsec.mp3", UriKind.Relative),
                                          "empty",
                                          "empty",
                                          "empty",
                                           null);
                 }


            }

        }

        return track;
    }

    private bool ProcessTransfer(BackgroundTransferRequest transfer, string directory = "")
    {
        bool isDone = false;
        switch (transfer.TransferStatus)
        {
            case TransferStatus.Completed:


                if (transfer.StatusCode == 200 || transfer.StatusCode == 206)
                {

                    RemoveTransferRequest(transfer.RequestId);


                    using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        string filename = transfer.Tag;
                        System.Diagnostics.Debug.WriteLine(directory + filename);
                        if (isoStore.FileExists(directory + filename))
                        {
                            isoStore.DeleteFile(directory + filename);
                        }
                        if (isoStore.FileExists(transfer.DownloadLocation.OriginalString))
                        {
                            isoStore.MoveFile(transfer.DownloadLocation.OriginalString, directory + filename);
                        }

                    }
                    isDone = true;

                }
                else
                {

                    RemoveTransferRequest(transfer.RequestId);

                    if (transfer.TransferError != null)
                    {

                    }
                }
                break;



        }
        return isDone;
       // NotifyComplete();
    }

    private void RemoveTransferRequest(string transferID)
    {
        // Use Find to retrieve the transfer request with the specified ID.
        BackgroundTransferRequest transferToRemove = BackgroundTransferService.Find(transferID);

        // try to remove the transfer from the background transfer service.
        try
        {
            BackgroundTransferService.Remove(transferToRemove);
        }
        catch (Exception)
        {

        }
    }



 protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
    {
        switch (playState)
        {
            case PlayState.TrackEnded:
                player.Track = GetNextTrack();
                break;
            case PlayState.TrackReady:
                player.Play();
                break;
            case PlayState.Shutdown:
                // TODO: Handle the shutdown state here (e.g. save state)
                break;
            case PlayState.Unknown:
                break;
            case PlayState.Stopped:
                break;
            case PlayState.Paused:
                break;
            case PlayState.Playing:
                break;
            case PlayState.BufferingStarted:
                break;
            case PlayState.BufferingStopped:
                break;
            case PlayState.Rewinding:
                break;
            case PlayState.FastForwarding:
                break;
        }

        NotifyComplete();
    }

这个代码在AudioPlayer类中,通常在xaml.cs中添加到下载队列的文件

相关问题