iOS闪关灯的Demo其实并没有想象中的那么简单: 找到闪光灯相关的类, 它肯定有开关对应的方法, 然后直接调用就行了. 事实证明这种想法太想当然了.
iOS系统中, 并没有专门的类来负责闪光灯的工作, 闪关灯其实是和摄像头一起工作的, 也就是在拍照和摄像过程中一起搭档的. 所以在寻找类的时候, 就要在AVMediaTypeVideo中寻找:
for (AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
if ([device hasFlash] &&
[device isTorchModeSupported:(AVCaptureTorchModeOn)] &&
[device isTorchModeSupported:(AVCaptureTorchModeOff)]) {
_device = device;
break;
}
}
和拍照同理, 在和硬件打交道的时候, 必须先询问它在不在可不可用. 只有在存在并且获取使用权限的时候, 你才可以控制它:
NSString *mediaType = AVMediaTypeVideo;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
if (authStatus != AVAuthorizationStatusRestricted &&
authStatus != AVAuthorizationStatusDenied) {
NSError *error = nil;
if ([_device lockForConfiguration:&error]) {
if (enabled) {
[_device setTorchMode:(AVCaptureTorchModeOn)];
} else {
[_device setTorchMode:(AVCaptureTorchModeOff)];
}
[_device unlockForConfiguration];
} else {
NSLog(@"Failed to lock device %@ for configuration: %@", _device, error);
}
}
在此我封装了一个手电筒的类
MHTorch:工程需导入:AVFoundation.framework
//
// MHTorch.h
//
//
// Created by MacroHong on 9/6/15.
// Copyright © 2015 MacroHong. All rights reserved.
//
#import <Foundation/Foundation.h>
/*!
* @author Macro QQ:778165728, 15-09-06
*
* @brief 手电筒类
*/
@interface MHTorch : NSObject
/*!
* @author Macro QQ:778165728, 15-09-06
*
* @brief 打开手电筒
*/
- (void)turnTorchOn;
/*!
* @author Macro QQ:778165728, 15-09-06
*
* @brief 关闭手电筒
*/
- (void)turnTorchOff;
@end
这个类直接提供了和手电筒相关的开和关的两个接口, 调用的时候也非常方便:
// 初始化一个手电筒对象(最原始的alloc,init初始化方法)
MHTorch *torch = [[MHTorch alloc] init];
// 打开手电筒
[torch turnTorchOn];
// 关闭手电筒
[torch turnTorchOff];
在这两接口的实现过程, 都是在新开辟的线程中进行的, 这样就相当于在后台进行手电筒的操作, 你UI的操作就可以照常进行