我有一个ios应用程序,当它移动到后台时继续播放音乐。现在,如果有电话,无论是否应答,应用程序都不会恢复播放音乐。 有两天我一直在读这个问题的帖子。他们中没有人解决了我的问题。
我正在使用AVQueuePlayer对象,因为我在需要时也流式播放音乐。 现在,自ios6以来,委托方法已被弃用。所以我正在使用Notications。
令人惊讶的是,通知中断结束(电话结束),播放音乐的代码也会被写入,但应用程序jus不会播放音乐,直到前景(另有通知)
这是我的代码
-(void)viewWillAppear
{.....
........
.....
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioInterruptionNotification:) name:AVAudioSessionInterruptionNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioInterruptionNotification:) name:UIApplicationDidBecomeActiveNotification object:nil]
}
-(void)audioInterruptionNotification:(NSNotification *) aNotification {
NSLog(@"Interrupt %@", aNotification);
NSDictionary *dict = [aNotification userInfo];
NSUInteger typeKey = [[dict objectForKey:@"AVAudioSessionInterruptionTypeKey"] unsignedIntegerValue]; NSLog(@"%d", typeKey);
if (typeKey == 0)
{
[avPlayer play];
NSLog(@"1.......");
}
else if (typeKey == 1)
{
[avPlayer play];
NSLog(@"3...............");
;
}
}
此外,我尝试通过调度队列引发延迟。 委托方法似乎不起作用。 但是,通过苹果恢复通话后,gaana,saavn和官方音乐应用程序恢复。所以这是可能的。 我似乎错过了一些东西。 如果我使用核心电话。我将不得不添加一个整个框架,这将增加应用程序的大小。 如果这是唯一的方法。请告诉我们如何。
谢谢。我非常感谢你的时间。
答案 0 :(得分:3)
所以我过了一会儿就回来了,我看到我的问题仍然没有答案。好吧,我已经解决了我的问题。 事实证明这只是一个缺失的简单陈述。
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
以及我在问题中写的代码。
答案 1 :(得分:0)
我已经解决了问题 - 应用程序被电话打断了,音乐消失了怎么样?
OSStatus result1 = AudioSessionInitialize(NULL, NULL, interruptionListener, NULL);
实现interruptionListener
:
void interruptionListener( void * inClientData, UInt32 inInterruptionState){
if (inInterruptionState == kAudioSessionBeginInterruption)
{
NSLog(@"Begin kAudioSessionBeginInterruption");
alcMakeContextCurrent(NULL); // important
}
else if (inInterruptionState == kAudioSessionEndInterruption)
{
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
NSError * err = nil;
[audioSession setCategory :AVAudioSessionCategoryPlayback error:&err]; // important
if(err){
NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
return;
}
err = nil;
[audioSession setActive:YES error:&err];
if(err){
NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
return;
}
//AudioSessionSetActive(true); //sometimes have no effect
// use alcMakeContextCurrent to set the context——with the context you stored before // important
NSLog(@"End kAudioSessionEndInterruption");
}
}
现在,当时钟或电话中断时,它可以播放,音乐可以播放。
但是,如果您接听电话并触摸“主屏幕”(尚未挂断),然后重新挂断电话,然后返回应用程序,则无法播放音乐,你应该这样做:
当应用从背景转到前景时,请设置AVAudioSession
和context
。 (不只是在中断结束时设置它们)