前言:

目前二维码(条形码)的使用非常广泛,所以啊,就想去实现以下嘛,最简单的方法就是选择开源库了。

在网上一查开源库还是很多的,介绍使用最多的就是zxing,所以这里也就是用zxing了。但是由于zxing开源库太大了,有很多不是Android要用的,所以网上很多都是介绍将zxing库中Android用到内容重新封装使用。

但是对于新手来说还是不太好操作的,我看了下,大部分都是拷贝原工程的一部分代码,然后再进行一系列的修改,最终成功使用。

我这里介绍的是直接使用zxing-android-embedded开源库(其实差不多,但是方便,简单),对于需要快速实现该功能的项目来说还是很好的。

zxing-android-embedded 官方介绍
Android使用zxing-android-embedded(由zxing开发)实现二维码生成和扫描_第1张图片

准备工作

首先添加依赖(3.5.0版本,最新的可以取官网查询)

compile 'com.journeyapps:zxing-android-embedded:3.5.0'

添加权限

<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" />

有些小伙伴就发现了CAMERA是危险权限,Android6.0以上需要申请运行时权限
但是该库已经封装好了,所以只需要这里添加就行,还是很方便的,为那些会忘记的同学降低出错率
FLASHLIGHT权限是为了扫描时开启闪光灯,如不需要就删除

如何生成一个二维码

/*** 传入一个字符串,生成一个二维码* @param str* @return*/private Bitmap encodeAsBitmap(String str){    Bitmap bitmap = null;    BitMatrix result;        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();    try {        //可以指定生成二维码Bitmap的大小        result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 400, 400);        BarcodeEncoder barcodeEncoder = new BarcodeEncoder();        bitmap = barcodeEncoder.createBitmap(result);    } catch (WriterException e){        e.printStackTrace();    } catch (IllegalArgumentException iae){        return null;    }    return bitmap;}

扫描二维码

先自定义一个扫描Activity(Fragment)

public class ScanActivity extends AppCompatActivity implements DecoratedBarcodeView.TorchListener {    private CaptureManager captureManager;    private boolean isLightOn = false;    private DecoratedBarcodeView mDBV;    private Button swichLight;    @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    //隐藏状态栏,因为该activity使用无actionbar主题,所以就是全屏了    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,    WindowManager.LayoutParams.FLAG_FULLSCREEN);    setContentView(R.layout.activity_scan);    swichLight = findViewById(R.id.btn_switch);    mDBV = findViewById(R.id.dbv_custom);    mDBV.setTorchListener(this);    // 如果没有闪光灯功能,就去掉相关按钮    if(!hasFlash()) {        swichLight.setVisibility(View.GONE);    }    swichLight.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {        if(isLightOn){            mDBV.setTorchOff();        }else{            mDBV.setTorchOn();        }    }});    //重要代码,初始化捕获    captureManager = new CaptureManager(this,mDBV);    captureManager.initializeFromIntent(getIntent(),savedInstanceState);    captureManager.decode();}    // 判断是否有闪光灯功能    private boolean hasFlash() {        return getApplicationContext().getPackageManager()    .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);    }    @Override    public void onTorchOn() {        Toast.makeText(this,"torch on", Toast.LENGTH_LONG).show();        isLightOn = true;    }    @Override    public void onTorchOff() {        Toast.makeText(this,"torch off",Toast.LENGTH_LONG).show();        isLightOn = false;    }    @Override    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {        super.onSaveInstanceState(outState, outPersistentState);        captureManager.onSaveInstanceState(outState);    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        return mDBV.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);    }    @Override    protected void onPause() {        super.onPause();        captureManager.onPause();    }    @Override    protected void onResume() {        super.onResume();        captureManager.onResume();    }    @Override    protected void onDestroy() {        super.onDestroy();        captureManager.onDestroy();    }}

一些跟生命周期有关,记得重写,最核心的就是captureManager。

界面xml部分

<Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="SwitchLight"    android:id="@+id/btn_switch"    android:layout_marginBottom="20dp"    android:background="#7f383838"    android:layout_centerHorizontal="true"    android:layout_alignParentBottom="true" /><com.journeyapps.barcodescanner.DecoratedBarcodeView    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/dbv_custom"    app:zxing_framing_rect_width="250dp"    app:zxing_framing_rect_height="250dp"    app:zxing_preview_scaling_strategy="fitXY"    app:zxing_use_texture_view="true">com.journeyapps.barcodescanner.DecoratedBarcodeView>

Android清单文件中scanActivity的配置

<activity    android:name=".ScanActivity"    android:screenOrientation="fullSensor"    android:stateNotNeeded="true"    android:theme="@style/Theme.AppCompat.NoActionBar"    android:windowSoftInputMode="stateAlwaysHidden">activity>

调用该扫描Activity

首先初始化,设置一些配置参数

private void initScan() {    integrator = new IntentIntegrator(this);    integrator.setPrompt("请扫描"); //底部的提示文字,设为""可以置空    integrator.setCameraId(0); //前置或者后置摄像头    integrator.setBeepEnabled(false); //扫描成功的「哔哔」声,默认开启    integrator.setCaptureActivity(ScanActivity.class); //设置扫描activity,也就是上面写的Activity}

设置完就可以在启动了,一句代码就行

integrator.initiateScan();

OK,结束

更多相关文章

  1. Android中的Permission权限机制介绍
  2. 扫描二维码下载app,判断是Android还是ios,并跳转到不同的下载地址
  3. Android安卓开发集成微信第三方扫描二维码登录-超级无敌具详细
  4. Android各版本查询和开启悬浮窗权限
  5. Android 基于Zxing扫码实现(三)、从相册选取二维码
  6. Android 手机跳转到权限管理界面汇总
  7. Android使用通讯录的权限问题
  8. Android文件读写权限

随机推荐

  1. Android中的基本组件
  2. Amazon 的平板能否威胁 Google
  3. Android开发者指南(1) —— Android Debu
  4. windows和linux下android sdk通用
  5. Android 性能优化之使用MAT分析内存泄露
  6. 【Android】学习笔记(9)——SQLite简单使
  7. 2012版辅助开发工具包(ADT)新功能特性介绍
  8. Mac下用Charles实现Android(安卓)http和h
  9. Android 内存优化
  10. android sql