需求:使用蓝牙快门遥控器控制拍照 APP 进行拍照。
解决思路
苹果手机系统相机可以通过按音量键进行拍照,目前市面上绝大部分的手机蓝牙快门遥控器都是基于这一点实现蓝牙拍照的,所以我们只需要监听系统 音量的变化 就可以间接的给自定义的相机适配蓝牙拍照,而不需要通过蓝牙的扫描、连接、订阅等来与蓝牙设备进行通讯。
1.导入头文件
#import <AVFoundation/AVFoundation.h>
2.监听音量变化
//监听系统音量变化,用于蓝牙拍照
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryAmbient error:nil];
[session setActive:YES error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//监听系统音量
[HTNotificationCenter addObserver:self selector:@selector(volumeChangeNotification:)name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
3.通知
/**
蓝牙控制相机拍照
*/
- (void)volumeChangeNotification:(NSNotification *)noti {
NSDictionary *userInfo = noti.userInfo;
if ([userInfo[@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"] isEqualToString:@"ExplicitVolumeChange"]) {//系统音量发生了变化
//拍照处理
}
}
新的问题及解决
因为蓝牙设备控制的是系统音量,所以在使用的时候,会弹出系统音量变化的弹窗,这是我们不需要的,所以下一步就是隐藏掉这个弹窗。
1.控制系统音量的接口在 MediaPlayer 库中,所以我们需要导入这个库
1558506595700.jpg
2.导入头文件
#import <MediaPlayer/MPVolumeView.h>
3.想要隐藏音量变化的视图,我们只需要把 MPVolumeView 的实例添加到当前视图中,并且设置 frame 到视图外即可,方法如下:
//隐藏系统音量变化视图
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, -100,100,100)];
[self.view addSubview:volumeView];
另外,MPVolumeView 中负责控制音量的是它的子视图 MPVolumeSlider,而这个类并未对外公开,所以要去控制它,需要遍历 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;
}
}
// 设置系统音量,区间为 0.0f ~ 1.0f
[volumeViewSlider setValue:0.3f animated:NO];
// 立即生效
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];