Windows Phone 8下载并在背景上播放音频

哈格·艾利(Hager Aly)

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

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

罗马斯

在WP8.0中,由于您TransferStatusChanged正处于App进程中,当您离开它时,该进程将停止,这是不可能的

当引发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的下载队列中

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章