iOS_二維碼掃描(iOS自帶)
iOS7開始,不需要第三方也能進行二維碼掃描了。
之前用過ZBar這個第三方包,後來iOS版本高了用不了,貌似我下的那個包只支援32位。
應該還有其他版本的支援,只是後來沒用到就沒去找了。
今天研究了一下系統自帶的二維碼掃描,掃描速度很快。
肚子餓,節約點時間直接上程式碼,因怎麼用我也有註釋了。大家根據需要看看響應的程式碼吧。
首先,匯入
#import <AVFoundation/AVFoundation.h>
Ps:自己練習的時候,順便複習了一下block傳值和代理傳值,在此程式碼也一起上了吧,不懂的可以看看,自己也權當做個筆記。
先附上掃描VC的.h程式碼
@protocol ScanDelegate <NSObject>//新增代理方法(預設情況下必須實現)- (void)setStringValue:(NSString *)stringValue;@optional//可選的方法@[email protected] ScanVC : BaseVC//block傳值@property (strong, nonatomic) void (^stringValue)(NSString *value);//代理傳值@property (strong, nonatomic) id<ScanDelegate>delegate;@end 以下為.m的程式碼#import </span>"BaseVC.h" //該viewController是繼承BaseVC(ViewController)建立<pre name="code" class="objc">
#import "ScanVC.h" #import <AVFoundation/AVFoundation.h> @interface ScanVC ()<AVCaptureMetadataOutputObjectsDelegate> //** @property (strong, nonatomic) AVCaptureSession *captureSession; @property (strong, nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer; @property (strong, nonatomic) AVCaptureMetadataOutput *captureMetadataOutput; @property (strong, nonatomic) UIView *viewPreview;//掃描視窗 @end @implementation ScanVC - (void)viewDidLoad { [super viewDidLoad]; /** CaptureSession 這是個捕獲會話,也就是說你可以用這個物件從輸入裝置捕獲資料流。 AVCaptureVideoPreviewLayer 可以通過輸出裝置展示被捕獲的資料流。 首先,應該判斷當前裝置是否有捕獲資料流的裝置。 */ NSError *error; AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; if (!input) { NSLog(@"%@", [error localizedDescription]); }else{ //設定會話的輸入裝置 if (!_captureSession) { _captureSession = [[AVCaptureSession alloc] init]; } [_captureSession addInput:input]; //對應輸出 if (!_captureMetadataOutput) { _captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; } [_captureSession addOutput:_captureMetadataOutput]; //建立一個佇列 dispatch_queue_t dispatchQueue; dispatchQueue = dispatch_queue_create("myQueue",NULL); [_captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue]; [_captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];//設定條碼型別。更多型別底下補上 //降捕獲的資料流展現出來 _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession]; [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; if (!_viewPreview) { _viewPreview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 320)]; [self.view addSubview:_viewPreview]; } [_videoPreviewLayer setFrame:_viewPreview.layer.bounds]; [_viewPreview.layer addSublayer:_videoPreviewLayer]; //開始捕獲 [_captureSession startRunning]; } } //獲得的資料在 AVCaptureMetadataOutputObjectsDelegate 唯一定義的方法中 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ //判斷是否有資料,是否是二維碼資料 if (metadataObjects != nil && [metadataObjects count] > 0) { AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0]; if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) { //獲得掃描的資料,並結束掃描 [self performSelectorOnMainThread:@selector(stopReading:)withObject:metadataObj.stringValue waitUntilDone:NO]; //執行緒更新label的text值 // [_result performSelectorOnMainThread:@selector(setText:) withObject:metadataObj.stringValue waitUntilDone:NO]; //block傳值 _stringValue(metadataObj.stringValue); //代理傳值 [_delegate setStringValue:metadataObj.stringValue]; } } } - (void)stopReading:(id)sender{ [_captureSession stopRunning]; _captureSession = nil; [_videoPreviewLayer removeFromSuperlayer]; [self.navigationController popViewControllerAnimated:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
掃描型別補充:
AVMetadataObjectTypeQRCode,
AVMetadataObjectTypeCode128Code,
AVMetadataObjectTypeEAN8Code,
AVMetadataObjectTypeUPCECode,
AVMetadataObjectTypeCode39Code,
AVMetadataObjectTypePDF417Code,
AVMetadataObjectTypeAztecCode,
AVMetadataObjectTypeCode93Code,
AVMetadataObjectTypeEAN13Code,
AVMetadataObjectTypeCode39Mod43Code
掃描的程式碼就這些了,以下為上一個VC接收block值和代理傳過來的值:頭部記得匯入代理<ScanDelegate>(自定義)
</pre><pre>
#pragma mark - 二維碼掃描
//掃描
- (void)scan:(BaseBtn *)button{
ScanVC *scanVC = [[ScanVC alloc]init];
//block 方法
[scanVC setStringValue:^(NSString *value) {
NSLog(@"%@",value);
}];
//設定代理
scanVC.delegate = self;
[self.navigationController pushViewController:scanVC animated:YES];
}
//代理傳值
- (void)setStringValue:(NSString *)stringValue{
[_result performSelectorOnMainThread:@selector(setText:) withObject:stringValue waitUntilDone:NO];
}
這段程式碼測試能獲取到二維碼的內容,一維碼好像不能掃描,應該跟我的條碼型別設定有關係。
找到比較多的條碼型別,也在上邊進行補充了,只是沒有進行更多測試,有興趣的可以自己去試試哈。
補充一下:
我遇到的問題:當前A_VC呼叫掃描的時候,結束後控制元件會卡住,不能進行任何操作。
我的解決方法:切換到另一個B_VC進行掃描,結束時返回當前A_VC控制元件就不會卡住,若要再次掃描再次進入B_VC即可。
希望能幫到大家。
相關推薦
iOS_二維碼掃描(iOS自帶)
iOS7開始,不需要第三方也能進行二維碼掃描了。 之前用過ZBar這個第三方包,後來iOS版本高了用不了,貌似我下的那個包只支援32位。 應該還有其他版本的支援,只是後來沒用到就沒去找了。 今天研究了一下系統自帶的二維碼掃描,掃描速度很快。 肚子餓,節約點時間直接上程式碼
iOS 二維碼掃描(你想要的都在這裡了)
#pragma mark - imageToTransparent void ProviderReleaseData (void *info, const void *data, size_t size){ free((void*)data); } + (UIImage*)imageBlackToTransp
iOS 原生二維碼掃描(可限制掃描區域)
寫這篇文章的主要原因不是展示如何使用 AVFoundation 來進行二維碼掃描,更主要的是限制掃描二維碼的範圍。(因為預設的是全屏掃描) 專案遇到掃描二維碼的功能需求,這裡我放棄了使用三方庫,而採用了蘋果原生的掃描。 原生的好處就是掃描特別快效率特別高,但是遇到一個問
iOS開發(OC)——二維碼掃描(原生API,支援條形碼)
今天,我為大家介紹一下iOS原生API實現二維碼和條形碼掃描功能 主要程式碼如下 //獲取攝像裝置 AVCaptureDevice * device = [AVCaptureDevi
使用系統提供的AVFoundation 實現二維碼掃描(帶動畫)
注意這裡的掃描必須真機測試 模擬器上是看不出來效果的 #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCa
Android實現二維碼掃描(仿微信,輕量Zxing)
前言 要做一個功能,二維碼識別。網上找一堆相關的Demo,但是總不是想要的效果,或者都是多年前的版本,權衡考慮之後,決定親自操刀。不糾結直接選中Zxing框架,https://github.com/zxing/zxing 在網站上直接clone下來,執行,然後就發現問題了.
Android:實際運用Zxing整合二維碼掃描 及 自定義掃碼介面(demo原始碼)
二維碼掃描,各大主流App必不可少的功能,而且google已將輪子替我們造好,直接拿來使用即可。以下是教學如何將Zxing開源庫整合到自己專案中,並且自定義掃碼介面,後期可根據自己的業務需求進行修改,最後補充了一點由此延伸的學習技能點。 一. 整合Zing
[IOS開發]js與WKwebview互動Demo(調取二維碼掃描)
#pragmamark-WKWebDelegate -(void)userContentController:(WKUserContentController*)userContentContr
react-native-smart-barcode目前最好用的二維碼掃描元件(IOS、android)
最近在製作React-Native專案的時候,條碼識別給我們整個專案帶了不少麻煩,幾款主流的條碼識別元件都不是特別好用,使用者體驗比較差,比如二維碼識別速度慢、掃描頁面十分卡頓用等一系列問題,後來在網上無意間找到一個非常好用的二維碼掃描元件——react-native-smart-barcode,這個元件是
Zxing二維碼掃描的三個類(可自定義掃描框)
先新增依賴 compile 'com.journeyapps:zxing-android-embedded:3.3.0' 清單檔案配置許可權 <uses-permission android:name="android.permission.CAMERA" /&
IOS 使用 ZbarSDK 二維碼掃描
fill 下載 src uitext void del symbols per super 1. 下載SDK https://github.com/bmorton/ZBarSDK 2. 引用到項目中 3. 添加引用 4. AppDelegate中添加下面代碼 5.
iOS二維碼掃描
ont 代碼 畫面 告訴 nds ima dds rst bounds 每一步:添加 AVFoundation.framework 庫 General > Linked Frameworks and Libraries 第二步:代碼集成 #import "V
iOS開發-生成二維碼圖片【附中間帶有小圖標二維碼】(QRCode)
獲取 options reat 很多 mapr 過濾 生成二維碼 image bit 生成二維碼圖片也是項目中常用到的,二維碼的掃描Git上有很多好用的,這裏主要說下二維碼的生成 1.普通二維碼 1.1 方法 /** 生成二維碼 QRStering:字符串 image
iOS 原生二維碼掃描
oca lac sig mediatype gate 5.0 項目 machine lec 直接上項目代碼 首先檢查相機權限 AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusFo
iOS 二維碼掃描 Swift
實現相機掃描二維碼, 相簿選取圖片識別二維碼 一. 匯入 framework import AVFoundation//二維碼掃描 import CoreImage//二維碼識別 import AudioToolbox//系統音效 二. 服從協議 AV
iOS 二維碼掃描 原生版
iOS掃描有很多非常成熟的第三方應用,從iOS7以後開始支援原生掃描二維碼,而且效率非常高,整合也很簡單.下面我們來寫下原生掃描方法.直接上圖.swfit 版本. var device: AVCaptureDevice!
Android實現二維碼掃描功能(三)-閃光燈控制
簡介 本篇我們對光線暗淡情況下閃光燈的使用做出介紹。 效果 晚上測試時: 開燈後: 未開燈: 實現步驟 1、在activity_scanner.xml介面上加上閃光燈開關按鈕。可以是Button、Checkbox等控制元件。
iOS 二維碼掃描-中間透明區域以及掃描區域設定
1. 二維碼掃描 在呼叫二維碼掃描之前,首先匯入標頭檔案:AVFoundation/AVFoundation.h,遵循其協議:AVCaptureMetadataOutputObjectsDelegate。並且定義所需要的device、session、input
iOS原生二維碼掃描(可以指定有效區域)
寫這篇文章的主要原因不是展示如何使用 AVFoundation 來進行二維碼掃描,更主要的是限制掃描二維碼的範圍。(因為預設的是全屏掃描) 專案遇到掃描二維碼的功能需求,這裡我放棄了使用三方庫,而採用了蘋果原生的掃描。 原生的好處就是掃描特別快效率特別高,但是遇到一個
Android二維碼掃描開發(一):實現思路與原理
【 回覆“ 1024 ”,送你一個特別推送 】 現在二維碼已經非常普及了,那麼二維碼的掃描與處理也成為了Android開發中的一個必要技能。網上有很多關於Android中二維碼處理的帖子,大都是在講開源框架zxing用法,然後貼貼程式碼就完了,並沒有一個系統的分析和