我正在尝试在类似于 Snapchat 的应用程序中执行振动,该应用程序同时使用音频输出和输入以及支持来自其他应用程序的音频混合,但这似乎是我最初认为的一项更艰巨的任务。重要的是要知道我不会在播放或录制期间尝试振动。通过阅读我能找到的关于该主题的所有文档,这就是我所理解的:
- 为了同时支持播放和录制(输出和输入),我需要使用
AVAudioSessionCategoryPlayAndRecord
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate)
任何录音类别都不支持让手机振动,包括AVAudioSessionCategoryPlayAndRecord
.- 可以通过添加选项来启用其他应用程序播放音频
AVAudioSessionCategoryOptionMixWithOthers
。
因此,我在我的应用程序委托中执行此操作:
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:&error];
我尝试过但失败的振动的可能解决方案是:
在振动之前停用共享
AVAudioSession
,然后立即将其激活。[[AVAudioSession sharedInstance] setActive:NO error:nil]; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); [[AVAudioSession sharedInstance] setActive:YES error:nil];
这成功地执行了振动,但是之后,当我尝试录制电影时,音频被闪避(或其他原因导致它非常安静)。它还给我一个错误,说我不允许在不先删除其 I/O 设备的情况下停用会话。
在振动之前更改类别,然后将其更改回来。
[[AVAudioSession sharedInstance] setActive:NO error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); [[AVAudioSession sharedInstance] setActive:NO error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil];
这个解决方案时不时出现,但似乎对我不起作用。即使类别似乎已设置,也不会发生振动。如果我在我的 AVCaptureSession 上设置,这可能仍然是一个有效的解决方案
usesApplicationAudioSession = YES
,但我还没有让它工作。
资料来源: