導入頭文件:
#import <AVFoundation/AVCaptureDevice.h>
#import <AVFoundation/AVMediaFormat.h>
代理:
<AVCaptureMetadataOutputObjectsDelegate,
UIAlertViewDelegate,
UIImagePickerControllerDelegate,
UINavigationControllerDelegate>
AV...haha
@property (strong,nonatomic) AVCaptureDevice *avDevice;
@property (strong,nonatomic) AVCaptureDeviceInput *avInput;
@property (strong,nonatomic) AVCaptureMetadataOutput *avOutput;
@property (strong,nonatomic) AVCaptureSession *avSession;
@property (strong,nonatomic) AVCaptureVideoPreviewLayer *avPreview;
當每次進入這個掃一掃頁面時,判斷是否開啟了權限,
如果沒有開啟相機權限"彈出提示頁"
點擊跳轉設置頁面;
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
/*
typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
AVAuthorizationStatusNotDetermined = 0,// 系統(tǒng)還未知是否訪問,第一次開啟相機時
AVAuthorizationStatusRestricted, // 受限制的
AVAuthorizationStatusDenied, //不允許
AVAuthorizationStatusAuthorized // 允許狀態(tài)
} NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
*/
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied) {
UIAlertView *alt = [[UIAlertView alloc]initWithTitle:@"\"AppName\"想訪問您的相機"
message:@"是否允許此App使用你的相機?"
delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"立即開啟", nil];
[alt show];
}
}
CaptureSession 這是個捕獲會話只祠,也就是說你可以用這個對象從輸入設備捕獲數(shù)據(jù)流辜纲。 AVCaptureVideoPreviewLayer 可以通過輸出設備展示被捕獲的數(shù)據(jù)流污朽。
- (void)setupCamera{
self.avDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.avInput = [AVCaptureDeviceInput deviceInputWithDevice:self.avDevice error:nil];
self.avOutput = [[AVCaptureMetadataOutput alloc]init];
[self.avOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
self.avSession = [[AVCaptureSession alloc]init];
[self.avSession setSessionPreset:AVCaptureSessionPresetHigh];
if ([self.avSession canAddInput:self.avInput]){
[self.avSession addInput:self.avInput];
}
if ([self.avSession canAddOutput:self.avOutput]){
[self.avSession addOutput:self.avOutput];
}
// 二維碼類型 AVMetadataObjectTypeQRCode
if ([self.avOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeQRCode]){
self.avOutput.metadataObjectTypes = [NSArray arrayWithObject:AVMetadataObjectTypeQRCode];
// AVMetadataObjectTypeAztecCode 條形碼
} else{
return ; }
self.avPreview =[AVCaptureVideoPreviewLayer layerWithSession:self.avSession];
self.avPreview.videoGravity = AVLayerVideoGravityResizeAspectFill;
//全屏掃一掃
self.avPreview.frame =CGRectMake(0, 64, KScreenWidth, KScreenHeight-64);
[self.view.layer insertSublayer:self.avPreview atIndex:0];
[self.avSession startRunning];//開始掃描
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:
(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if ([metadataObjects count] > 0){
[self.avSession stopRunning];//停止掃描
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
NSString *stringValue = metadataObject.stringValue;//掃描出來的字符串
}
//NSLog(@"%@",metadataObjects);
//我這里掃描出來的是json字符串,轉字典,拿到自己需要用的字段;
NSData *JSONData = [stringValue dataUsingEncoding:NSUTF8StringEncoding];
dic = [NSJSONSerialization JSONObjectWithData:JSONData
options:NSJSONReadingMutableLeaves error:nil];
//這里判斷是否是URL地址鏈接
NSString *regex =@"[a-zA-z]+://[^\\s]*";
NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if ([urlTest evaluateWithObject:stringValue]) {
//如果是跳轉瀏覽器
NSURL *url = [[NSURL alloc] initWithString: stringValue ];
[[UIApplication sharedApplication] openURL:url];
[self.avSession startRunning];//重新開始掃描
}
}
到這里系統(tǒng)掃描功能就結束了