安卓zxing规范扫描器_摇钱树捕鱼注册送分100 

效劳热线:025-86112490/18014487552
以后地位:主页 > 新闻动态 > > 安卓zxing规范扫描器

安卓zxing规范扫描器

文章来由:摇钱树捕鱼注册送分100工控人气: 宣布工夫2019-09-10 09:08:10
    zxing是基于多种1D/2D条码处置的开源库,是一个完好的项目。它可以经过手机摄像头完成条码的扫描以及解码,功用及其弱小。那么假如要完成二维码的扫描以及解码,摇钱树捕鱼注册送分100需求在该开源项目标根底上停止简化,并修正。让摇钱树捕鱼注册送分100来看一下
 
二维码扫描后果      
 
    上图是模仿QQ的扫一扫停止修正的zxing项目,以zxing项目为根底,联合实践使用,这里作了三点改动:
 
   (1)竖屏扫描
 
   (2)自界说取景框
 
   (3)重新界说扫描后果处置
 
 
 
     一、第一步:下载zxing项目,并简化出扫描框架
 
     1、起首,下载最新zxing开源项目。 下载地点:http://code.google.com/p/zxing/
 
     2、剖析项目构造,明白扫描框架需求。在zxing中,有许多其他的功用,项目构造比拟庞大;针对二维码QRCode扫描,摇钱树捕鱼注册送分100需求几个包:
 
        (1)com.google.zxing.client.android.Camera  基于Camera挪用以及参数设置装备摆设,中心包
 
        (2)DecodeFormatManager、DecodeThread、DecodeHandler 基于解码款式、解码线程、解码后果处置的解码类
 
        (3)ViewfinderView、ViewfinderResultPointCallBack 基于取景框视图界说的View类
 
        (4)CaptureActivity、CaptureActivityHandler 基于扫描Activity以及扫描后果处置的Capture类
 
        (5)InactivityTimer、BeepManager、FinishListener 基于休眠、声响、加入的辅佐办理类
 
        (6)Intents、IntentSource、PrefrencesActivity 基于常量存储的常量类
 
    3、新建工程,添加如下权限:  
 
 
  <uses-permission android:name="android.permission.CAMERA"/>
         <uses-permission android:name="android.permission.INTERNET" />
         <uses-permission android:name="android.permission.VIBRATE" />
         <uses-permission android:name="android.permission.FLASHLIGHT" />
permission
        添加core.jar文件,并BuildPath;将上述类或包参加工程后,会报一系列错误,缘由有几点:
 
       (1)资源文件缺乏,将zxing下需求的资源文件copy到新工程下
 
       (2)版本兼容题目,zxing下许多技术都是运用4.0版本及以上,集成到低版本之后,须做相应窜改,概况参照项目源码
 
       (3)包构造援用题目,需求重新导入包援用
 
   4、简化CapyureActivity, camera包以及decode各种非常处理当前,即可对CaptureActivity停止代码简化 ,起首看一下capture.xml结构
 
 
 1 <merge xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools" >
 3 
 4     <!-- 全体通明画布 -->
 5     <SurfaceView
 6         android:id="@+id/preview_view"
 7         android:layout_width="fill_parent"
 8         android:layout_height="fill_parent" />
 9 
10     <!-- 扫描取景框 -->
11     <com.karics.library.zxing.view.ViewfinderView
12         android:id="@+id/viewfinder_view"
13         android:layout_width="fill_parent"
14         android:layout_height="fill_parent" />
15     
16  <!-- 标题栏 -->
17     <RelativeLayout 
18         android:layout_width="fill_parent"
19         android:layout_height="50dp"
20         android:layout_gravity="top"
21         android:background="#99000000">
22         
23         <ImageButton
24             android:id="@+id/capture_imageview_back"
25             android:layout_width="42dp"
26             android:layout_height="42dp"
27             android:layout_centerVertical="true"
28             android:background="@drawable/selector_capture_back"/>
29         
30         <TextView 
31             android:layout_width="wrap_content"
32             android:layout_height="wrap_content"
33             android:layout_centerInParent="true"
34             android:textColor="#ffffffff"
35             android:textSize="20sp"
36             android:text="扫一扫"/>
37         
38     </RelativeLayout>
39 
40 </merge>
capture.xml
        capture.xml结构去失后果表现,添加标题栏。那么captureActivity中,onCreate(),onPause(),onResume(),onDestroy触及到Camera的初始化或烧毁  
 
 
 1 @Override
 2     public void onCreate(Bundle icicle) {
 3         super.onCreate(icicle);
 4         // 坚持Activity处于叫醒形态
 5         Window window = getWindow();
 6         window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 7         setContentView(R.layout.capture);
 8 
 9         hasSurface = false;
10 
11         inactivityTimer = new InactivityTimer(this);
12         beepManager = new BeepManager(this);
13 
14         imageButton_back = (ImageButton) findViewById(R.id.capture_imageview_back);
15         imageButton_back.setOnClickListener(new View.OnClickListener() {
16 
17             @Override
18             public void onClick(View v) {
19                 finish();
20             }
21         });
22     }
23 
24     @Override
25     protected void onResume() {
26         super.onResume();
27 
28         // CameraManager必需在这里初始化,而不是在onCreate()中。
29         // 这是必需的,由于当摇钱树捕鱼注册送分100第一次进入时需求表现协助页,摇钱树捕鱼注册送分100并不想翻开Camera,丈量屏幕巨细
30         // 当扫描框的尺寸不准确时会呈现bug
31         cameraManager = new CameraManager(getApplication());
32 
33         viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
34         viewfinderView.setCameraManager(cameraManager);
35 
36         handler = null;
37 
38         SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
39         SurfaceHolder surfaceHolder = surfaceView.getHolder();
40         if (hasSurface) {
41             // activity在paused时但不会stopped,因而surface依旧存在;
42             // surfaceCreated()不会挪用,因而在这里初始化camera
43             initCamera(surfaceHolder);
44         } else {
45             // 重置callback,等候surfaceCreated()来初始化camera
46             surfaceHolder.addCallback(this);
47         }
48 
49         beepManager.updatePrefs();
50         inactivityTimer.onResume();
51 
52         source = IntentSource.NONE;
53         decodeFormats = null;
54         characterSet = null;
55     }
56 
57     @Override
58     protected void onPause() {
59         if (handler != null) {
60             handler.quitSynchronously();
61             handler = null;
62         }
63         inactivityTimer.onPause();
64         beepManager.close();
65         cameraManager.closeDriver();
66         if (!hasSurface) {
67             SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
68             SurfaceHolder surfaceHolder = surfaceView.getHolder();
69             surfaceHolder.removeCallback(this);
70         }
71         super.onPause();
72     }
73 
74     @Override
75     protected void onDestroy() {
76         inactivityTimer.shutdown();
77         super.onDestroy();
78     }
View Code
        surfaceview是基于Camera而完成,surfaceview的运用需求完成SurfaceHolder.Callback接口,在开启屏幕surfaceview的时分初始化camera
 
 
 1 @Override
 2     public void surfaceCreated(SurfaceHolder holder) {
 3         if (!hasSurface) {
 4             hasSurface = true;
 5             initCamera(holder);
 6         }
 7     }
 8 
 9     @Override
10     public void surfaceDestroyed(SurfaceHolder holder) {
11         hasSurface = false;
12     }
13 
14     @Override
15     public void surfaceChanged(SurfaceHolder holder, int format, int width,
16             int height) {
17 
18     }
View Code
        接上去看怎样初始化Camera,代码简化之后如下
 
 
 1 private void initCamera(SurfaceHolder surfaceHolder) {
 2         if (surfaceHolder == null) {
 3             throw new IllegalStateException("No SurfaceHolder provided");
 4         }
 5         if (cameraManager.isOpen()) {
 6             return;
 7         }
 8         try {
 9             // 翻开Camera硬件设置装备摆设
10             cameraManager.openDriver(surfaceHolder);
11             // 创立一个handler来翻开预览,并抛出一个运转时非常
12             if (handler == null) {
13                 handler = new CaptureActivityHandler(this, decodeFormats,
14                         decodeHints, characterSet, cameraManager);
15             }
16         } catch (IOException ioe) {
17             Log.w(TAG, ioe);
18             displayFrameworkBugMessageAndExit();
19         } catch (RuntimeException e) {
20             Log.w(TAG, "Unexpected error initializing camera", e);
21             displayFrameworkBugMessageAndExit();
22         }
23     }
View Code
       在CaptureActivity中,有一个中心办法,用来前往并处置解码后果,也即扫描后果。handleDecode(),假如需求对解码后的内容停止本人的处置,需求对该办法停止窜改,这里修正        为将解码的bitmap以及内容回传到开启扫描的Activiity停止处置。
 
 
 1 public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
 2         inactivityTimer.onActivity();
 3 
 4         boolean fromLiveScan = barcode != null;
 5         //这里处置解码完成后的后果,此处将参数回传到Activity处置
 6         if (fromLiveScan) {
 7             beepManager.playBeepSoundAndVibrate();
 8 
 9             Toast.makeText(this, "扫描乐成", Toast.LENGTH_SHORT).show();
10 
11             Intent intent = getIntent();
12             intent.putExtra("codedContent", rawResult.getText());
13             intent.putExtra("codedBitmap", barcode);
14             setResult(RESULT_OK, intent);
15             finish();
16         }
17 
18     }
View Code
   5、将指定Url天生二维码
 
 
 1 /**
 2      * 天生QRCode(二维码)
 3      * 
 4      * @param str
 5      * @return
 6      * @throws WriterException
 7      */
 8     public static Bitmap createQRCode(String url) throws WriterException {
 9 
10         if (url == null || url.equals("")) {
11             return null;
12         }
13 
14         // 天生二维矩阵,编码时指定巨细,不要天生了图片当前再停止缩放,如许会含糊招致辨认失败
15         BitMatrix matrix = new MultiFormatWriter().encode(url,
16                 BarcodeFormat.QR_CODE, 300, 300);
17 
18         int width = matrix.getWidth();
19         int height = matrix.getHeight();
20 
21         // 二维矩阵转为一维像素数组,也便是不断横着排了
22         int[] pixels = new int[width * height];
23 
24         for (int y = 0; y < height; y++) {
25             for (int x = 0; x < width; x++) {
26                 if (matrix.get(x, y)) {
27                     pixels[y * width + x] = 0xff000000;
28                 }
29 
30             }
31         }
32 
33         Bitmap bitmap = Bitmap.createBitmap(width, height,
34                 Bitmap.Config.ARGB_8888);
35         bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
36         return bitmap;
37     }
View Code
 
 
       经过以上四步,zxing项目标简化任务根本完成。至于一些类需求停止小修小改,盼望可以对着源码停止,这里不再赘述。二维码扫描的全体构架次要包括三局部:
 
       1、界说取景框,也即扫描的View,经过surfaceview停止绘制
 
       2、Camera, 扫描的中心在于camera的设置装备摆设运用,包罗预览,主动聚焦,翻开设置装备摆设等处置
 
       3、Decode解码,扫描完成后整个工程的中心
 
       撤除以上三个模块,需求明白的便是CaptureActivitiy中handleDeCode()办法做本人的处置。
摇钱树捕鱼注册送分100小尺寸手持终端PDA:6寸windows10操纵零碎,支持一维码、二维码扫描,IP67加固型产业手持机,支持底座通讯、蓝牙手柄、电池可装配,自带wifi蓝牙GPS
下一篇:最初一页上一篇:ZXing开辟详解
此文要害字:此文要害词:

相干资讯

    

    南京摇钱树捕鱼注册送分100信息微信,扫扫有惊喜哦!