Android使用zxing-android-embedded(由zxing开发)实现二维码生成和扫描
16lz
2021-01-23
前言:
目前二维码(条形码)的使用非常广泛,所以啊,就想去实现以下嘛,最简单的方法就是选择开源库了。
在网上一查开源库还是很多的,介绍使用最多的就是zxing,所以这里也就是用zxing了。但是由于zxing开源库太大了,有很多不是Android要用的,所以网上很多都是介绍将zxing库中Android用到内容重新封装使用。
但是对于新手来说还是不太好操作的,我看了下,大部分都是拷贝原工程的一部分代码,然后再进行一系列的修改,最终成功使用。
我这里介绍的是直接使用zxing-android-embedded开源库(其实差不多,但是方便,简单),对于需要快速实现该功能的项目来说还是很好的。
zxing-android-embedded 官方介绍
准备工作
首先添加依赖(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,结束
更多相关文章
- Android中的Permission权限机制介绍
- 扫描二维码下载app,判断是Android还是ios,并跳转到不同的下载地址
- Android安卓开发集成微信第三方扫描二维码登录-超级无敌具详细
- Android各版本查询和开启悬浮窗权限
- Android 基于Zxing扫码实现(三)、从相册选取二维码
- Android 手机跳转到权限管理界面汇总
- Android使用通讯录的权限问题
- Android文件读写权限