ボタンを押すと音を鳴らす非常に単純なアプリケーションを作成しています。デバイスが無音に設定されている場合、そのボタンはあまり意味がないため、デバイスのオーディオ音量がゼロの場合は無効にしたいと考えています。(その後、音量を上げたときに再度有効にします。)
現在の音量設定を検出し、音量レベルが変化したときに通知/コールバックを取得するための有効な (そして AppStore で安全な) 方法を探しています。音量設定を変更したくありません。
ViewController
これはすべて、上記のボタンが使用されている場所に実装されています。これは、iOS 4.0.1 および 4.0.2 を実行する iPhone 4 と、4.0.1 を実行する iPhone 3G でテストしました。iOS SDK 4.0.2 と llvm 1.5 で構築されています。(gcc または llvm-gcc を使用しても、何も改善されません。) どちらの方法でも、ビルドの実装中に問題はなく、エラーも警告もありません。静的アナライザーも満足です。
これが私がこれまでに試したことですが、すべて成功しませんでした。
Apple のオーディオ サービスのドキュメントに従って、次のように動作するAudioSessionAddPropertyListener
を登録する必要があります。kAudioSessionProperty_CurrentHardwareOutputVolume
// Registering for Volume Change notifications
AudioSessionInitialize(NULL, NULL, NULL, NULL);
returnvalue = AudioSessionAddPropertyListener (
kAudioSessionProperty_CurrentHardwareOutputVolume ,
audioVolumeChangeListenerCallback,
self
);
returnvalue
これは0
、コールバックの登録が機能したことを意味します。
悲しいことにaudioVolumeChangeListenerCallback
、デバイスの音量ボタン、ヘッドセット クリッカー、リンガーサイレント スイッチを押しても、関数へのコールバックが得られません。
に登録するためにまったく同じコードをkAudioSessionProperty_AudioRouteChange
使用すると (WWDC ビデオ、開発者ドキュメント、およびインターウェブ上の多数のサイトで類似のサンプル プロジェクトとして使用されます) 、オーディオ ルートを変更するときに実際にコールバックを取得します (プラグイン/アウトによって)ヘッドセットまたはデバイスのドッキング)。
Dougという名前のユーザーは、既に最大の音量の iPhone 音量変更イベントというタイトルのスレッドを開き、この方法を使用して成功していると主張しました (音量が既に最大に設定されているため、実際には音量が変化しない場合を除きます)。それでも、私にはうまくいきません。
私が試した別の方法は、NSNotificationCenter
このように登録することです。
// sharedAVSystemController
AudioSessionInitialize(NULL, NULL, NULL, NULL);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
これにより、メソッドvolumeChanged
にSystemVolume
変更が通知されるはずですが、実際には通知されません。
一般に、Cocoa で何かを達成しようと懸命に働きすぎると、根本的に間違ったことをしているということがわかっているので、ここで何かを見落としていると思います。現在の音量レベルを取得する簡単な方法がないとは信じがたいですが、Apple のドキュメント、サンプル コード、Google、Apple Developer Forums を使用したり、WWDC 2010 のビデオを見たりしても、見つけることができませんでした。