2012-03-12 18 views
10

iPhoneの音量がになったときに私が聞くことができる通知がありますか?iPhoneの音量を検出するボタンを押しますか?

私はAVSystemController_SystemVolumeDidChangeNotificationについて知っていますが、音量が上がったり下がったりしていないときにのみ通知がトリガーされることが不可欠です。

第2に、音量アップボタンを押したときに表示される、システムの音量を示す半透明の表示を非表示にするにはどうすればいいですか? カメラ+がこれを実装しました。

答えて

17

文書化された方法はありませんが、この回避策を使用できます。 AVSystemController_SystemVolumeDidChangeNotificationの通知に登録し、MPVolumeViewを追加すると、システムのボリュームビューが表示されなくなります。

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, 0, 10, 0)]; 
[volumeView sizeToFit]; 
[self.view addSubview:volumeView]; 

この場合のオーディオセッション

AudioSessionInitialize(NULL, NULL, NULL, NULL); 
AudioSessionSetActive(true); 

を開始することを忘れないでくださいは、MPVolumeViewはユーザから隠されています。音量アップまたはダウンが押された場合には、ちょうど現在のアプリケーションのボリューム

float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume]; 

をつかむと、あなたはドン場合は、ボタンが通知コールバック

に押された後、新しいボリュームとそれを比較チェックするよう

」必要であればtは自分でそれをやりたい、ドロップインクラスgithubの

https://github.com/blladnar/RBVolumeButtons

+0

私がこの方法を使用して気づいたことの1つは、バックグラウンドで音楽を再生している別のアプリ(この検出を行っていたアプリで既に音楽を再生している可能性があります)/ – Will

+0

'[[MPMusicPlayerController applicationMusicPlayer] volume]'は、iOS 7以降廃止されました。 – JaredH

+0

"volume"プロパティの代替.... – Javeed

36

で利用可能がありますあなたは「outputVolume」プロパティにリスナーを登録することができ、n個のイベント:

- (void)viewWillAppear:(BOOL)animated { 

    AVAudioSession* audioSession = [AVAudioSession sharedInstance]; 

    [audioSession setActive:YES error:nil]; 
    [audioSession addObserver:self 
        forKeyPath:@"outputVolume" 
         options:0 
         context:nil]; 
} 

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

    if ([keyPath isEqual:@"outputVolume"]) { 
     NSLog(@"volume changed!"); 
    } 
} 
+5

私はstackoverflow上の多くの場所を見てきました。これは非推奨のメソッドと文字列を使ってこれを行う唯一のものです。 – ShayanK

+10

このソリューションの問題点は、outputVolumeがすでに最大値で+ボタンを押している場合、コールバックが発生しないことです。 –

+0

このソリューションは本当にいいですが、レイは正しいですか?(値をプログラムで0にリセットすることは可能ですか? – donmarkusi

3

私はUISliderのための独自のターゲット/アクションを追加することで、この問題を解決するには、MPVolumeViewの内側に配置しました。したがって、音量変化のイベントを捕捉し、どのボタンが押されたかを判断することが可能です。このアプローチの実装にはgithub repoがあります。 iOS 7以上でうまく動作し、廃止予定の警告もAppleからの拒否もありません。ボリューム作用を区別するために

0

:アップのみボリュームのINSTEAD OF を(observeValueガードに)

temp != 0.5 

USE

temp > 0.5 

のみ検出ボリュームダウン:

temp < 0.5 

ボリュームアップまたはダウンのいずれかが押されると、以下のこのソリューションが印刷されます。

関連する問題