前言
Android开发里二维码开发经常用到,这里简单的介绍下Android开发里的二维码.
最广泛使用的二维码库zxing
zxing是最广泛的二维码库各个平台都可以适用它,但是Android平台使用它好像需要进行JNI处理.但是,github上大神已经帮我们做好了,下面我会介绍一个好用的二维码框架.这里提zxing是让你知道很多二维码框架的封装源头都是它.
github地址: https://github.com/zxing/zxing
QRCodeReaderView 第三方二维码框架
github地址:https://github.com/dlazaro66/QRCodeReaderView
这个框架已经将zxing打包封装好了,你直接使用即可,甚至还能使用依赖它后独立使用zxing的功能.(比如生成二维码图片)
ps: 这个框架也支持条形码
依赖
dependencies{ compile 'com.dlazaro66.qrcodereaderview:qrcodereaderview:2.0.3' }
扫码识别内容
这里偷懒引用作者的代码...
xml里
<com.dlazaro66.qrcodereaderview.QRCodeReaderView android:id="@+id/qrdecoderview" android:layout_width="match_parent" android:layout_height="match_parent" />
activity里
public class DecoderActivity extends Activity implements OnQRCodeReadListener { private TextView resultTextView; private QRCodeReaderView qrCodeReaderView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_decoder); qrCodeReaderView = (QRCodeReaderView) findViewById(R.id.qrdecoderview); qrCodeReaderView.setOnQRCodeReadListener(this); // 使用此功能启用/禁用解码 qrCodeReaderView.setQRDecodingEnabled(true); // 使用此功能更改自动对焦间隔(默认为5秒) qrCodeReaderView.setAutofocusInterval(2000L); // 使用此功能启用/禁用手电筒 qrCodeReaderView.setTorchEnabled(true); // 使用此功能设置前置摄像头预览 qrCodeReaderView.setFrontCamera(); // 使用此功能设置后置相机预览 qrCodeReaderView.setBackCamera(); } // QR解码后调用 // “text”: QR编码的文字 // "points" :在视图中放置QR控制点的点 @Override public void onQRCodeRead(String text, PointF[] points) { //二维码读取回调 resultTextView.setText(text); } @Override protected void onResume() { super.onResume(); qrCodeReaderView.startCamera(); } @Override protected void onPause() { super.onPause(); qrCodeReaderView.stopCamera(); } }
生成二维码图片
/** * 二维码工具类 * @version 创建时间:2014年12月5日 下午5:15:47 */ public class QrCodeUtils { /** * 传入字符串生成二维码 * @param str * @return * @throws WriterException */ public static Bitmap Create2DCode(String str) throws WriterException { // 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败 BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, 300, 300); int width = matrix.getWidth(); int height = matrix.getHeight(); // 二维矩阵转为一维像素数组,也就是一直横着排了 int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (matrix.get(x, y)) { pixels[y * width + x] = 0xff000000; }else{ pixels[y * width + x] = 0xffffffff; } } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // 通过像素数组生成bitmap,具体参考api bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } }