【问题标题】:Play sound with screen turned off / don't let iPhone go to sleep关闭屏幕播放声音/不要让 iPhone 进入睡眠状态
【发布时间】:2010-11-24 13:49:39
【问题描述】:

所以我有一个应用程序,即使屏幕关闭,我也希望它继续工作。 以前,当我想这样做时,我使用了这个 hack/trick - 我在后台循环播放无声/空的声音(AudioServicesPlaySystemSound),所以如果用户按下开/关按钮,应用程序仍然在后台工作 - 所以它永远不会让 iPhone 进入睡眠模式——它只是关闭了屏幕,可能还有 wifi 或蓝牙之类的东西(据我所知,还有 iPod Touch 加速度计)。它奏效了。我想在我的新应用程序中使用相同的技巧,但是当我现在测试它时,它似乎不再起作用了。即使屏幕关闭,后台的声音也会播放(当我用一些声音替换“空”音频文件时,我可以听到它播放)但它应该播放的声音(使用 AVAudioPlayer)不播放(即使我转动屏幕再次开启)。 我不知道它在什么时候停止工作(它肯定在 3.x 操作系统上工作)。难道我做错了什么? Apple 是否更改/修复了允许您的应用在屏幕关闭的情况下也能正常工作的“黑客”?是否有其他方法可以让设备进入睡眠状态(并减少电池电量消耗)但继续工作?

这是我用来播放背景/静音的代码:

-(void) playSilentSound
{ 
 CFBundleRef mainBundle = CFBundleGetMainBundle ();
 CFURLRef silentUrl = CFBundleCopyResourceURL (mainBundle, CFSTR ("silence"), CFSTR ("aiff"), NULL);
 AudioServicesCreateSystemSoundID (silentUrl, &silentSound);
 silentTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0 target: self selector:@selector(playSilence) userInfo: nil repeats: YES];
}

-(void) playSilence
{
 AudioServicesPlaySystemSound (silentSound);
}

这就是我播放即使屏幕关闭也应该播放的声音的方式:

-(BOOL) playSound: (NSString *) path withLoops: (BOOL) loops stopAfter: (int) seconds
{
 NSError *error;
 player = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: &error];
 player.delegate = self;
 player.numberOfLoops = 0;
 player.volume = volume;
 secondsPlayed = 0;
 loop = loops;
 BOOL played = [player play];

 if(played && seconds > 0)
 {
  timer = [[NSTimer scheduledTimerWithTimeInterval: 0.5 target: self selector: @selector(stopPlaying:) userInfo: [NSNumber numberWithInt: seconds] repeats: YES] retain];
  secondsLimit = seconds;
 } else {
  secondsLimit = -1;
 }
}

-(void) stopPlaying:(NSTimer*)theTimer
{
 if(secondsLimit > 0 && (secondsPlayed + [player currentTime]) >= secondsLimit)
 {
  [player stop];
  [timer release];
  timer = nil;
 }
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)sender successfully:(BOOL)flag
{
 if(sender == player)
 {
  if(flag) { secondsPlayed += sender.duration; }
  if(loop) { [player play]; }
 }
}

代码可能有点复杂 - 它可能只是前几行 - 它是这样制作的,因此您只能播放 X 秒的声音(如果声音短于 X,它将播放几个循环,直到总时间为>= X)。当然,当屏幕保持打开状态时,一切正常。

另外 - 如果你发现代码在你的项目中有用(比如 playSound:withLoops:stopAfter:) - 随意使用它(但如果你给我发消息会很酷,这样我就会知道我有帮助:) )。

【问题讨论】:

    标签: iphone objective-c iphone-sdk-3.0 ios ios4


    【解决方案1】:

    所以答案是设置会话类别。当设备被锁定时,某些类别只会关闭声音。对我来说最好的选择是AVAudioSessionCategoryPlayback

    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    

    【讨论】:

    • 非常感谢!这行代码让我的背景音频重新焕发生机。
    【解决方案2】:

    我不知道 Apple 会修复什么,但在 iOS 4 中,现在有 official ways 可以继续在后台做一些事情,你应该利用它。

    【讨论】:

    • “多任务处理”不适用于我的应用程序,因为它必须在 iphone 进入睡眠状态而不是应用程序“关闭”时在后台工作,但无论如何感谢 -我相信它会帮助某人
    猜你喜欢
    • 2012-01-17
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多