我有一个应用程序执行非常标准的操作: 它在应用程序处于1)前景模式时播放音频(流式传输或在文件系统中),2)屏幕锁定状态3)背景模式。 这在iOS5之前的所有iOS中都运行良好。
我一直在使用MPMoviePlayerController(因为它可以播放流媒体和本地文件系统音频) 我有以下设置:
我有http://developer.apple.com/library/ios/#qa/qa1668/_index.html
所示的Audiosession设置NSError *activationError = nil;
AVAudioSession *mySession = [AVAudioSession sharedInstance];
[mySession setCategory: AVAudioSessionCategoryPlayback error: &activationError];
if (activationError) { /* handle the error condition */ }
[mySession setActive: YES error: &activationError];
if (activationError) { /* handle the error condition */ }
我启用了后台计时器,在音频播放结束时停止 UIBackgroundTaskIdentifier newId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
这样,音频开始播放,当应用程序进入后台状态或手机被锁定时,音频继续播放。但是,当我开始另一个音频文件后, 我立即开始播放PlaybackDidFinishNotification,状态设置为播放结束(但文件从未播放过)
相同的代码在前台模式下播放音频文件(当前音频文件结束后,下一个文件启动没有任何问题)
iOS5中有什么新功能我应该这样做才能让它工作吗?我通读了MPMoviePlayerController类引用,但我看不到iOS5的任何特定内容。
提前致谢。
答案 0 :(得分:6)
终于弄明白了这个问题。这是在apple dev论坛的this帖子中解决的(需要登录才能看到)。该帖子适用于AVPlayer,但也解决了MPMoviePlayerController的问题。
基本上,这是该帖子的摘录:
您的应用必须支持远程控制事件!这些是音频 多任务左侧的控制器接口prex / nex / play / pause 切换器任务栏(不确定事物的正确名称)。您 确保您的视图成为第一个控制器,然后调用
> [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
在viewDidLoad中。一旦你这样做,你的播放器将不再返回 NO !!
答案 1 :(得分:0)
我的情况有所不同,我只是在这里回答(以及在另一个SO问题中),以帮助未来的搜索者了解此错误消息。这不符合原始问题。
我的应用播放声音或一首歌,但是当我第一次编码时,它可以同时播放。在测试中,我总是用一首歌进行测试。我以通常的方式演奏了这首歌:
self.musicQuery = [MPMediaQuery songsQuery];
[_musicQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:selectedSongID forProperty:MPMediaItemPropertyPersistentID comparisonType:MPMediaPredicateComparisonEqualTo]];
[_musicQuery setGroupingType:MPMediaGroupingTitle];
[_myPlayer setQueueWithQuery:_musicQuery];
[_myPlayer play];
周过去了,我开始测试声音,用AVAudioPlayer播放。我的应用程序开始冻结5秒钟,我在控制台中收到 MediaPlayer:Message playbackState超时消息。
事实证明,传递一个空的查询会导致冻结和消息。将我的应用程序的逻辑更改为仅在播放要播放的歌曲时播放歌曲。