xml地图|网站地图|网站标签 [设为首页] [加入收藏]

二维码扫描,库全面使用解析

来源:http://www.ccidsi.com 作者:集成介绍 人气:115 发布时间:2020-03-01
摘要:new IntentIntegrator.initiateScan(); // `this` is the current Activity// Get the results:@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(req
new IntentIntegrator.initiateScan(); // `this` is the current Activity// Get the results:@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if(result != null) { if(result.getContents() == null) { Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Scanned: "   result.getContents(), Toast.LENGTH_LONG).show(); } } else { super.onActivityResult(requestCode, resultCode, data); }}
3.在MainActivity的构造文件中放置二个Button(用于张开二维码扫描分界面)。

图片 1activity_main.png

onResume

  • 初步化Camera:使用CameraManager,那么些类主要提供有关Camera的一些基本操作
  • 开始化ViewfinderView:覆盖在预览图(SurfaceView)上方的叁个View,主要成效是加多了有些透明的取景框和围观动漫;大家得以依赖需求转移取景框的大大小小形状,改造扫描动漫等。
  • 初始化SurfaceView

能够看来使用起来非常便捷,onActivityResult带回扫码出来的结果,然后开展管理就OK了。下文中就不再介绍 ReadMe 中的内容,转而介绍一下以此库一些别的的安顿。

一、ZXing Android Embedded简单介绍及采纳办法

ZXing Android Embedded 是用于Android的条形码扫描库,使用ZXing进行解码。

注:二维码是条形码中的一种,该库也足以扫描二维码。

添加gradle库依赖:

dependencies { ...... compile 'com.journeyapps:zxing-android-embedded:3.5.0'}

注意事项:

  • 该库在急需时会自动引进ZXing库,没有供给额外手动引进。
  • buildToolsVersion '23.0.2'(营造筑工程具的本子要>=23.0.2)
  • compile 'com.android.support:appcompat-v7:23.1.0' (support-v7包版本要在23 以上卡塔尔
  • 低于协理的Android版本(API level 9 )

想要驾驭更加多详细情形,可张开Github链接研商学习。

接下去,小编用四个实例来介绍一下该库的行使格局。

camera包结构

图片 2

camera包结构

该package成效是治本camera,包涵张开,关闭,配置camere, 闪光灯等。

  • CameraFacing: 枚举类, 标注前置视频头,前置录制头
  • OpenCamera: 表示已经展开的Camera以致它的元数据
  • OpenCameraInterface :抽象于Camera之上的类,用于张开Camera并拿走数据
  • AutoFocusManager:Camera自动对焦相关
  • CameraConfigurationManager:用于读取,深入分析,设置Camera参数
  • CameraManager: 大旨类,相机管理类, 操作Camera的入口,用于预览和平解决码
  • FrontLightMode:枚举类, 表示闪光灯的开,关,自动
  • PreviewCallback:预览回调类

经过即日半天的岁月,算是把这么些库看理解了,写得很好值得推荐介绍,有心的心上人能够优良看看源码,有的可学。

4.在MainActivity中为Button设置点击事件,点击后跳转至扫描分界面。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById.setOnClickListener(new View.OnClickListener() { @Override public void onClick { // 创建IntentIntegrator对象 IntentIntegrator intentIntegrator = new IntentIntegrator(MainActivity.this); // 开始扫描 intentIntegrator.initiateScan; }}

ZXing扫码全体进程

图片 3

扫码进程

无意二维码已经深切影响了大家的生活,为大家提供了宏大的有益。线下结账、租一辆车子、可能去要八个三妹的Wechat号等等。张小龙把它叫做从线下到线上的进口。正因为二维码如此的显要,何况现身的成效越来越高,所以 Android 应用中扫面二维码、条形码的要求也很遍布了。本文便是来衔接使用叁个科学的二维码库 ZXing

图片 4scan_bg.jpg

ZXing Camera具体流程

图片 5

ZXing Camera张开流程

以上流程图,经过手提式有线电话机 log调节和测量试验,内容翔实! 该图展现,ZXing 展开Camera 扫描 1D/2D 主体流程。

后天我们差非常少知道了二维码是怎么变卦的,有关 Android 上扫码的库有繁多,此次来介绍的是 ZXing,四个绝妙的开源扫码库。

8. setTimeout(long timeout)

该情势用于安装扫描分界面包车型地铁过期时间。(幸免客商展开扫描页面,忘记关闭)

譬喻,作者设置多少个2秒的逾期时间

图片 6other_config10.png

运作一下程序,如下图所示:

图片 7other_config11.gif

能够看见,2秒后,扫描自动撤消了。

ZXing Android Embedded的主题选拔办法介绍完了。想询问越来越多用法的对象能够经过GitHub链接或查看源码的法子学习。

ZXing 结构

本体系关系的都是谷歌(Google卡塔尔国 ZXing 德姆o, 也正是源码中的android目录。从 谷歌ZXing体系讲授(一卡塔尔——导入AS 就提到 ZXing源码中的目录分类,包蕴内容比较多。从Android实际使用角度,会提到 core, android-core, android-integration, android 八个目录。

  • core 可以以为是ZXing库的基本算法,
  • android-core 中独有七个文本 CameraConfigurationUtils.java, 该公文的辨证是:
/**
 * Utility methods for configuring the Android camera.
 *
 * @author Sean Owen
 */
  • android-integration 仅有2个文件
IntentIntegrator.java
<p>A utility class which helps ease integration with Barcode Scanner via {@link Intent}s. This is a simple
  way to invoke barcode scanning and receive the result, without any need to integrate, modify, or learn the
  project's source code.</p>

 IntentResult.java
 <p>Encapsulates the result of a barcode scan invoked through {@link IntentIntegrator}.</p>

该jar包用于第三方接收通过Intent调用ZXing app。

  • android
    ZXing 德姆o, 用于体现如何行使ZXing库。
    该种类文章以android 目录为商讨对象, 分析哪些采用ZXing。

那么些库是一个根据 ZXing 的 Android 二维码解码库,使用起来依旧超级轻松的。

7. setPrompt(String prompt)

该方法用于安装扫描界面包车型客车提示新闻。

举个例证,小编设置一条提醒新闻

图片 8other_config8.png

运转一下先后,能够见到扫描分界面包车型地铁“提示文字”

图片 9other_config9.png

ZXing Android入口

带UI分界面包车型大巴Android App都有三个入口Activity, 从AndroidManifest.xml中能够核准

<activity android:name=".CaptureActivity"
          ......>
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    ... ...
</activity>

所以,类CaptureActivity纵然ZXing 德姆o的入口Activity, 留意查看其生命周期函数,开采做了许多办事。

那几个图很直观了吗,借使定制扫描线的颜料啊,或许扫描框的抑扬顿挫啊,都还没难点了~

近期,在铺子项目上须要步向“二维码扫描”的功力,笔者在网络查阅了一部分素材,落成了那几个作用。最后给自身做个笔记,给诸位做下分享。

CaptureActivity类关系图

图片 10

Capture类关系图

ZXing Android Embedded

3. setBeepEnabled(boolean enabled)

该办法用于安装扫码成功后的提示音,传true为展开,不设置或设置false为关闭。

ZXing Android 录像头运行进度

在介绍ZXing Android Camera运维进程前 ,先来看下扫码总体流程

  • setBeepResource 让扫描之后发出的嘟嘟声可定制,需求传入本地的一个 raw 文件。

  • setVibrateEnable 设置扫描实现之后,是还是不是让手提式有线电话机激动。

“二维码扫描”事实上就是经过手提式有线电话机相计算机扫描描『二维码图片』,将『二维码图片』中的字符串数据通过解码的形式深入分析出来。

onCreate

    inactivityTimer = new InactivityTimer(this);
    beepManager = new BeepManager(this);
    ambientLightManager = new AmbientLightManager(this);
  • 创办贰个提姆er:假诺设备使用电瓶供电,一段时间不活动过后甘休activity
  • 开创一个BeepManager:首要用于扫描成功后提示声的
  • 安装保证荧屏提醒状态

本人把它 fork 回之后,做了一部分优化和修改,具体请查看下文。

1. setBarcodeImageEnabled(boolean enabled)

该措施用于安装“被扫描的二维码图片”能够保存在本地。

图片 11other_config1.png

举例说美素佳儿(FrisoState of Qatar下:

随之在此以前的例子,大家在构造文件中增加叁个ImageView(用于体现二维码图片):

图片 12other_config2.png

MainActivity更改后的代码如下:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById.setOnClickListener(new View.OnClickListener() { @Override public void onClick { IntentIntegrator intentIntegrator = new IntentIntegrator(MainActivity.this); // 设置可以保存条形码图片 intentIntegrator.setBarcodeImageEnabled; intentIntegrator.initiateScan; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 获取解析结果 IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { if (result.getBarcodeImagePath() != null) { // 显示条形码图片的保存路径 Toast.makeText(this, result.getBarcodeImagePath(), Toast.LENGTH_LONG).show(); // 显示条形码图片 showBarcodeImage(result.getBarcodeImagePath; } } else { super.onActivityResult(requestCode, resultCode, data); } } /** * 加载并显示条形码图片 */ private void showBarcodeImage(String barcodeImagePath) { FileInputStream fis = null; try { fis = new FileInputStream(new File(barcodeImagePath)); ((ImageView)findViewById.setImageBitmap(BitmapFactory.decodeStream; } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } }}

跑下程序,如下图所示:

图片 13other_config3.gif

能够看见,作者Toast出了二维码图片被封存后的门径音信,并依靠文件保留路线将二维码图片彰显了出来。

就此,假若加上这一个构造:

intentIntegrator.setBarcodeImageEnabled;

环歌后的二维码图片会被封存;假如不加多这几个布局或参数设置为false,二维码图片不会被保存,大家取得的渠道result.getBarcodeImagePath()就能够成为null。

概要

本篇解说2个难题

  • ZXing Demo结构
  • ZXing 德姆o 主体流程

来看看它在 github 上的库房:

6. setOrientationLocked(boolean locked)

该措施用于安装方向锁。

图片 14other_config5.png

其一效率是用来调度扫描分界面方向的,能够包容传感器使用,举个例证。

修正一下早前的manifest文件,如下所示:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:andro xmlns:tools="http://schemas.android.com/tools" package="com.example.wangnan7.qrcodescandemo"> <application ...... <!-- 调整二维码扫描界面方向为"完全依赖传感器" --> <activity android:name="com.journeyapps.barcodescanner.CaptureActivity" android:screenOrientation="fullSensor" tools:replace="screenOrientation" /> </application></manifest>

在MainActivity中增添方向锁设置,如下所示:

图片 15other_config6.png

运营一下前后相继,如下所示:

图片 16other_config7.gif

能够看看调节手提式有线电话机方向时,扫描布局也会再一次布署,最终小编按Back再次来到键撤消了扫描。

ZXing 德姆o目录构造

图片 17

目录构造图

该德姆o完结的功力很多, 扫描条形码,二维码。扫描书籍, 剪切板, 编码, 扫描历史记录,分享,扫描WIFI。

  • book: 扫描结果是书本音讯,则进行相关操作,包罗搜索与浮现书籍相关类。
  • camera: Camera相关操作包, open/ 是Camera展开相关类,CameraManager是骨干管理类。
  • clipboard: 剪贴板
  • encode:编码功用的种种构件集合,核心类为QRCodeEncoder
  • history:扫描历史管理,主题类是HistoryManager
  • result: 扫码结果被分为差别的门类,全体的项目,都定义对应的xxxResultHandler来管理。
  • share: 将扫码结果分享出来
  • wifi: 扫码自动连接WIFI
<merge xmlns:andro xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"> <com.journeyapps.barcodescanner.BarcodeView android:layout_width="match_parent" android:layout_height="match_parent" android: app:zxing_framing_rect_width="250dp" app:zxing_framing_rect_height="50dp"/> <com.journeyapps.barcodescanner.ViewfinderView android:layout_width="match_parent" android:layout_height="match_parent" android: app:zxing_possible_result_points="@color/zxing_custom_possible_result_points" app:zxing_result_view="@color/zxing_custom_result_view" app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser" app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" android:background="@color/zxing_transparent" android:text="@string/zxing_msg_default_status" android:textColor="@color/zxing_status_text"/></merge>
  • 第1部分:ZXing Android Embedded简单介绍及应用办法。

  • 第2部分:自定义扫描分界面。

  • integrator.setBarcodeImageEnabled 保存扫描完毕后二维码的图像。源码在那地:

二、自定义扫描分界面

诸君大概开掘 ZXing Android Embedded库 提供的暗中同意的扫视野面有个别简陋,满意不断产物和希图的供给,比方:

付加物想要下图这种效率,该如何是好吧?

图片 18target_effect.png

当时就供给大家自定义扫描分界面了...

自定义计策:比着葫芦画瓢

出于源码中的类在AndroidStudio中暗中同意是被加锁的,大家无权直接改良。但大家能够仿写在这之中的一部分类,方便我们抬高本身的逻辑。自定义源点能够从Activity最初

在源码中能够查到,我们此前一向在行使一个CaptureActivity实行二维码扫描:

图片 19capture_activity.png

接下去,大家能够效仿CaptureActivity写贰个和好的Activity(直接Copy也得以)。

小编仿写的代码如下:

/** * @Class: CustomCaptureActivity * @Description: 自定义条形码/二维码扫描 * @Author: wangnan7 * @Date: 2017/5/19 */public class CustomCaptureActivity extends AppCompatActivity { /** * 条形码扫描管理器 */ private CaptureManager mCaptureManager; /** * 条形码扫描视图 */ private DecoratedBarcodeView mBarcodeView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(com.google.zxing.client.android.R.layout.zxing_capture); mBarcodeView = (DecoratedBarcodeView)findViewById(com.google.zxing.client.android.R.id.zxing_barcode_scanner); mCaptureManager = new CaptureManager(this, mBarcodeView); mCaptureManager.initializeFromIntent(getIntent(), savedInstanceState); mCaptureManager.decode(); } @Override protected void onResume() { super.onResume(); mCaptureManager.onResume(); } @Override protected void onPause() { super.onPause(); mCaptureManager.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mCaptureManager.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState; mCaptureManager.onSaveInstanceState; } /** * 权限处理 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { mCaptureManager.onRequestPermissionsResult(requestCode, permissions, grantResults); } /** * 按键处理 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mBarcodeView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event); }}

注:XML结构依然利用的源码中CaptureActivity的布局。

任何时候,我们能够在manifest文件中宣称一下以此新创设的Activity。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:andro package="com.example.wangnan7.qrcodescandemo"> <application ....... <!-- 设置二维码扫描界面方向为竖屏 --> <activity android:name=".CustomCaptureActivity" android:label="自定义扫描界面" android:screenOrientation="portrait"/> </application></manifest>

末段,大家就足以在MainActivity中调用那些新的扫描Activity了。

图片 20start_custom_capture.png

运行程序,效果如下:

图片 21custom_activity_success.gif

能够见见我们自定义的扫描Activity能够通常运营,扫码也不负义务了。

可是,大家自定义Activty使用的布局依旧源码中的布局文件,对于那么些结构文件大家未有权限改革,接下去就需求自定义扫描结构了。

源码布局如下:

图片 22zxing_layout.png

小编仿写的自定义扫描布局 (activity_zxing_layout.xml):

图片 23activity_zxing_layout.png

性子简要介绍:app:zxing_preview_scaling_strategy : 预览视图的缩放战术,使用centerCrop就可以app:zxing_use_texture_view : 是或不是选用纹理视图

接下去,大家就能够把自定义扫描Activity的布局文件给替换掉了。

/** * @Class: CustomCaptureActivity * @Description: 自定义条形码/二维码扫描 * @Author: wangnan7 * @Date: 2017/5/19 */public class CustomCaptureActivity extends AppCompatActivity { ...... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_zxing_layout); mBarcodeView = (DecoratedBarcodeView)findViewById(R.id.zxing_barcode_scanner); ...... } ......}

最后,大家跑程序验证一下:

图片 24use_texture_view.gif

能够看看大家的自定义构造文件也远非难点。

大家的自定义Activity和自定义布局文件都成功了,剩下的就是改革扫描视图的体制了。

想要改正扫描视图的体制,须求多少研讨下DecoratedBarcodeView的源码。

1.DecoratedBarcodeView初阶化深入分析

图片 25source_code1.png

补充:能够见见 scannerLayout 最终被作为扫描布局inflate进了DecorateBarcodeView中。

2.默许布局Evoque.layout.zxing_barcode_scanner分析

图片 26source_code2.png

浅析到此处,大家须要做的干活就显现出来了。那正是:

自定义View(世襲ViewfinderView),重写onDraw方法,然后替换掉这里的ViewfinderView。

因为R.layout.zxing_barcode_scanner是源码中的布局文件,不能够直接改正,所以还要重写一份构造文件给DecoratedBarcodeView加载。那么,接下去须求做两步思考干活:

仿写暗许构造文件CRUISER.layout.zxing_barcode_scanner

图片 27custom_barcode_scanner.png

让DecoratedBarcodeView加载刚刚仿写结构,不再使用暗许布局。

图片 28load_custom_scanner.png

3.发端自定义扫描视图(世袭ViewfinderView重写onDraw方法)

小能力:假如不知情怎么着最初,能够先将原ViewfinderView的onDraw方法copy进来一点一点商讨修正。

小编间接将团结的自定义扫描布局粘贴出来,必要的爱人能够借鉴或Copy:

/** * @Class: CustomViewfinderView * @Description: 自定义扫描框样式 * @Author: wangnan7 * @Date: 2017/5/22 */public class CustomViewfinderView extends ViewfinderView { /** * 重绘时间间隔 */ public static final long CUSTOME_ANIMATION_DELAY = 16; /* ****************************************** 边角线相关属性 ************************************************/ /** * "边角线长度/扫描边框长度"的占比  */ public float mLineRate = 0.1F; /** * 边角线厚度  */ public float mLineDepth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics; /** * 边角线颜色 */ public int mLineColor = Color.WHITE; /* ******************************************* 扫描线相关属性 ************************************************/ /** * 扫描线起始位置 */ public int mScanLinePosition = 0; /** * 扫描线厚度 */ public float mScanLineDepth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics; /** * 扫描线每次重绘的移动距离 */ public float mScanLineDy = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, getResources().getDisplayMetrics; /** * 线性梯度 */ public LinearGradient mLinearGradient; /** * 线性梯度位置 */ public float[] mPositions = new float[]{0f, 0.5f, 1f}; /** * 线性梯度各个位置对应的颜色值 */ public int[] mScanLineColor = new int[]{0x00FFFFFF, Color.WHITE, 0x00FFFFFF}; public CustomViewfinderView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void onDraw(Canvas canvas) { refreshSizes(); if (framingRect == null || previewFramingRect == null) { return; } Rect frame = framingRect; Rect previewFrame = previewFramingRect; int width = canvas.getWidth(); int height = canvas.getHeight(); //绘制4个角 paint.setColor(mLineColor); // 定义画笔的颜色 canvas.drawRect(frame.left, frame.top, frame.left   frame.width() * mLineRate, frame.top   mLineDepth, paint); canvas.drawRect(frame.left, frame.top, frame.left   mLineDepth, frame.top   frame.height() * mLineRate, paint); canvas.drawRect(frame.right - frame.width() * mLineRate, frame.top, frame.right, frame.top   mLineDepth, paint); canvas.drawRect(frame.right - mLineDepth, frame.top, frame.right, frame.top   frame.height() * mLineRate, paint); canvas.drawRect(frame.left, frame.bottom - mLineDepth, frame.left   frame.width() * mLineRate, frame.bottom, paint); canvas.drawRect(frame.left, frame.bottom - frame.height() * mLineRate, frame.left   mLineDepth, frame.bottom, paint); canvas.drawRect(frame.right - frame.width() * mLineRate, frame.bottom - mLineDepth, frame.right, frame.bottom, paint); canvas.drawRect(frame.right - mLineDepth, frame.bottom - frame.height() * mLineRate, frame.right, frame.bottom, paint); // Draw the exterior (i.e. outside the framing rect) darkened paint.setColor(resultBitmap != null ? resultColor : maskColor); canvas.drawRect(0, 0, width, frame.top, paint); canvas.drawRect(0, frame.top, frame.left, frame.bottom   1, paint); canvas.drawRect(frame.right   1, frame.top, width, frame.bottom   1, paint); canvas.drawRect(0, frame.bottom   1, width, height, paint); if (resultBitmap != null) { // Draw the opaque result bitmap over the scanning rectangle paint.setAlpha(CURRENT_POINT_OPACITY); canvas.drawBitmap(resultBitmap, null, frame, paint); } else { // 绘制扫描线 mScanLinePosition  = mScanLineDy; if(mScanLinePosition > frame.height{ mScanLinePosition = 0; } mLinearGradient = new LinearGradient(frame.left, frame.top   mScanLinePosition, frame.right, frame.top   mScanLinePosition, mScanLineColor, mPositions, Shader.TileMode.CLAMP); paint.setShader(mLinearGradient); canvas.drawRect(frame.left, frame.top   mScanLinePosition, frame.right, frame.top   mScanLinePosition   mScanLineDepth, paint); paint.setShader; float scaleX = frame.width() /  previewFrame.width(); float scaleY = frame.height() /  previewFrame.height(); List<ResultPoint> currentPossible = possibleResultPoints; List<ResultPoint> currentLast = lastPossibleResultPoints; int frameLeft = frame.left; int frameTop = frame.top; if (currentPossible.isEmpty { lastPossibleResultPoints = null; } else { possibleResultPoints = new ArrayList<>; lastPossibleResultPoints = currentPossible; paint.setAlpha(CURRENT_POINT_OPACITY); paint.setColor(resultPointColor); for (ResultPoint point : currentPossible) { canvas.drawCircle(frameLeft    (point.getX() * scaleX), frameTop    (point.getY() * scaleY), POINT_SIZE, paint); } } if (currentLast != null) { paint.setAlpha(CURRENT_POINT_OPACITY / 2); paint.setColor(resultPointColor); float radius = POINT_SIZE / 2.0f; for (ResultPoint point : currentLast) { canvas.drawCircle(frameLeft    (point.getX() * scaleX), frameTop    (point.getY() * scaleY), radius, paint); } } } // Request another update at the animation interval, but only repaint the laser line, // not the entire viewfinder mask. postInvalidateDelayed(CUSTOME_ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom); }}

代码简单介绍:

onDraw方法中的大部分代码Copy自ViewfinderView,小编加多了两有的逻辑:第一有的是边角线的绘图;第2盘部是用“扫描线”替换掉了庐山真面目目的“激光线”。

代码的主旨是在onDraw方法的第5行代码:

Rect frame = framingRect;

这些矩阵记录了围观框多个极点的坐标,有了那么些变量,各位能够发布想象力自定义自个儿索要的扫描体制。

接下来,我们用CustomViewfinderView替换掉ViewfinderView

图片 29custom_viewfinderview.png

末尾,跑下程序

图片 30custom_success.gif

4.样式调解

我们的自定义扫描分界面解决了,但UI样式还索要再优化一下:

框体大小调解 (DecoratedBarcodeView有属性支持改正)

图片 31zxing_frame_change.png

调解后的功能图:

图片 32zxing_frame_change2.png

将围观分界面尾部文字平移至扫描框底部

图片 33zxing_frame_change3.png

调动后的效果图:

图片 34zxing_frame_change4.png

将扫描框向上移动

扫描框在暗许情形下是周旋于相机视图居中的,想要调节扫描框的岗位还要去校勘源码...

小编想了多个投缘取巧的方法:透明掉标题栏和气象栏让相机预览视图向上延伸,使扫描框在视觉上微微上移

这有个别代码和二维码扫描未有直接关乎,小编就不贴代码了,各位可以品尝自身实现,但结尾小编会附着Bend姆o的GitHub链接。

最终的职能:

图片 35final_scan.gif

Demo的Github链接:

中文版 ZXing Android Embedded

4. setCameraId(int cameraId)

该方法用于安装相机ID。大家采取的无绳电话机平时都有内置和前置录制头,该措施传0将会使用前置录像头,传1将会使用前置录像头。不安装则私下认可使用后置录像头。

这几天稍稍手提式有线电话机后置双摄像头,相机ID只怕全体调换,有野趣的敌人请自行钻研。

本来笔者把它 fork 回来之后,做了一部分改造,比如修了四个bug,然后开放了多少个自己以为相比确切的新的设置项:

7.其余配置项

在上述实例中,我们用两行代码达成了开发银行二维码扫描界面。

IntentIntegrator intentIntegrator = new IntentIntegrator(MainActivity.this);intentIntegrator.initiateScan();

多数未有拉长什么布署。不过,该库还提供了其余安顿项。

图片 36other_config.png

接下去,作者详细明白一下那8个布局项。

 /** * Save the barcode image to a temporary file stored in the application's cache, and return its path. * Only does so if returnBarcodeImagePath is enabled. * * @param rawResult the BarcodeResult, must not be null * @return the path or null */ private String getBarcodeImagePath(BarcodeResult rawResult) { String barcodeImagePath = null; if (returnBarcodeImagePath) { Bitmap bmp = rawResult.getBitmap(); try { File bitmapFile = File.createTempFile("barcodeimage", ".jpg", activity.getCacheDir; FileOutputStream outputStream = new FileOutputStream(bitmapFile); bmp.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); outputStream.close(); barcodeImagePath = bitmapFile.getAbsolutePath(); } catch (IOException e) { Log.w(TAG, "Unable to create temporary file and store bitmap! "   e); } } return barcodeImagePath; }
5.重写onActivityResult方法接受扫描结果。
public class MainActivity extends AppCompatActivity { ...... @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 获取解析结果 IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { if (result.getContents() == null) { Toast.makeText(this, "取消扫描", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "扫描内容:"   result.getContents(), Toast.LENGTH_LONG).show(); } } else { super.onActivityResult(requestCode, resultCode, data); } }}

成功此步,基本的二维码扫描效能就早就出来了。

接下去,我们得以筹算二维码图片试验须臾间。若无二维码图片,能够用草料二维码生成器在线生成一个二维码使用。

图片 37caoliao_qrcode.png

本文由68399皇家赌场发布于集成介绍,转载请注明出处:二维码扫描,库全面使用解析

关键词: 68399皇家赌场 Android 进阶 An 二维码

最火资讯