主要涉及到Tips:
- 獲取設(shè)備音量
- 靜音模式失效
- 監(jiān)聽(tīng)音量改變
- 設(shè)置設(shè)備音量
- 監(jiān)聽(tīng)靜音按鈕
- 監(jiān)聽(tīng)耳機(jī)拔插
1.獲取設(shè)備音量
播放音頻可以通過(guò):
MPMusicPlayerController *iPod = [MPMusicPlayerController systemMusicPlayer];
float volumeLevel = iPod.volume;
播放視頻可以通過(guò):
float outputVolume = [[AVAudioSession sharedInstance] outputVolume];
推薦下面的方法逼肯,上面的在某些版本可能有問(wèn)題委刘,下面的方法兼容iOS6及以上。
2.靜音模式失效
通過(guò)設(shè)置音頻會(huì)話的category實(shí)現(xiàn):
NSError *setCategoryError = nil;
BOOL success = [[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayback
error: &setCategoryError];
if (!success) { /* handle the error in setCategoryError */ }
這樣App就不會(huì)隨著手機(jī)靜音鍵打開(kāi)而靜音辖源,可在手機(jī)靜音下播放聲音??
3.監(jiān)聽(tīng)音量改變
監(jiān)聽(tīng)音頻改變私有通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
實(shí)現(xiàn)通過(guò)回調(diào):
- (void)volumeChanged:(NSNotification *)notification
{
float volume = [[[notification userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"]
floatValue];
// do something
}
4.設(shè)置設(shè)備音量
使用MPVolumeView
類,便利它的子views找到類為MPVolumeSlider
的滑竿。
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
UISlider *volumeViewSlider = nil;
for (UIView *view in [volumeView subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
volumeViewSlider = (UISlider *)view;
break;
}
}
然后再通過(guò)設(shè)置volumeViewSlider
的value
即可。
_volumeViewSlider.value = someVolume;
5.監(jiān)聽(tīng)靜音按鈕
參考Sound Switch - Sharkfood的實(shí)現(xiàn)倘屹。
使用很簡(jiǎn)單,判斷是否為靜音模式:
if ([SharkfoodMuteSwitchDetector shared].isMute) {
// do something
}
動(dòng)態(tài)監(jiān)聽(tīng)款违,通過(guò)block回調(diào):
[SharkfoodMuteSwitchDetector shared].silentNotify = ^(BOOL silent){
// do something
};
6.監(jiān)聽(tīng)耳機(jī)拔插
監(jiān)聽(tīng)AVAudioSessionRouteChangeNotification
通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:nil];
實(shí)現(xiàn)回調(diào):
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification
{
NSDictionary *interuptionDict = notification.userInfo;
NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (routeChangeReason) {
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
// 耳機(jī)插入
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
// 耳機(jī)拔掉
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
// called at start - also when other audio wants to play
NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
break;
}
}