Ring/Silent スイッチがアクティブかどうかを検出するために、これらの方法を使用してみました。
iPhoneのミュートスイッチをプログラムで感知する方法は?
AVAudioSession カテゴリがドキュメントの指示どおりに機能しない
しかし、私の iPhone 4 では、「状態」の値は常に「スピーカー」です (また、CFStringGetLength(state) によって返される長さの値は常に 7 です)。この方法を使って成功した人はいますか? もしそうなら、どのような種類のデバイスと SDK のバージョンですか?
私はそれを次のように呼んでいます:
- (BOOL)deviceIsSilenced {
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
OSStatus audioStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if (audioStatus == kAudioSessionNoError) {
NSLog(@"audio route: %@", state) // "Speaker" regardless of silent switch setting, but "Headphone" when my headphones are plugged in
return (CFStringGetLength(state) <= 0);
}
return NO;
}
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
audioSession.delegate = self;
[audioSession setCategory:AVAudioSessionCategoryAmbient error:nil];
[audioSession setActive:YES error:nil];
NSLog(@"muted? %i", [self deviceIsSilenced]);
...
}
電話の物理スイッチが切り替えられたときに、他の(より正確な)kAudioSessionPropertyイベントが発生するのではないかと考えていました。誰にもアイデアはありますか?
ちなみに、[AVAudioSession sharedInstance] で AVAudioSessionCategoryAmbient カテゴリを使用しています。
更新:また、さまざまなオーディオ カテゴリと他のいくつかのオーディオ セッション プロパティを使用してみましたが、スイッチをミュート/ミュート解除するときに何も起動しないようです。:(
2014 年 1 月 1 日更新:ちょっとしたハックです。iPhone 5S でマルチタスクを実行しているときにクラッシュが発生しましたが、新しく受け入れられた回答にリンクされているSoundSwitchライブラリが、サイレントスイッチ。iOS 7 でも動作します。