二维码认识及Android快速接入
2018-02-22 本文已影响514人
奔跑吧李博
什么是二维码?
二维码又称QR Code,QR全称Quick Response。是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;
二维码是一种比一维码更高级的条码格式。一维码只能在一个方向(一般是水平方向)上表达信息,而二维码在水平和垂直方向都可以存储信息。一维码只能由数字和字母组成,而二维码能存储汉字、数字和图片等信息,因此二维码的应用领域要广得多。
常用功能
- 信息获取(名片、地图、WIFI密码、资料)
- 网站跳转(跳转到微博、手机网站、网站)
- 广告推送(用户扫码,直接浏览商家推送的视频、音频广告)
- 手机电商(用户扫码、手机直接购物下单)
- 防伪溯源(用户扫码、即可查看生产地;同时后台可以获取最终消费地)
- 优惠促销(用户扫码,下载电子优惠券,抽奖)
- 会员管理(用户手机上获取电子会员信息、VIP服务)
- 手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付)
更专业的讲解来自于一位知乎的朋友(https://www.zhihu.com/question/28062200)
制作效果:
giphy.gif来自哪个库?
二维码使用功能在我们App中使用相当常见。本文章推荐使用库android-zxingLibrary。
使用步骤:
- 引用库
compile 'cn.yipianfengye.android:zxing-library:2.2'
- 在项目Application类的onCreate方法中初始化
ZXingLibrary.initDisplayOpinion(this);
- 生成二维码图片方式,createImage()方法最后一个参数传图片就让二维码带有图标。
String codeStr = etInput.getText().toString();
Bitmap bitmap = CodeUtils.createImage(codeStr,200,200,null);
ivShow.setImageBitmap(bitmap);
- 启动默认扫描界面,启动库自带CaptureActivity类:
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent,REQUEST_CODE);
- 在Activity的onActivityResult方法中接收扫描结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE){
if(null != data){
Bundle bundle = data.getExtras();
if(bundle == null){
return;
}
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
String result = bundle.getString(CodeUtils.RESULT_STRING);
Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
}
}
}
}
默认扫描界面样式:
image.png
自定义扫描界面,创建MyCaptureActivity类。
- 初始化CaptureFragment类,是该库自带的扫描的Fragment。
private void init() {
CaptureFragment captureFragment = new CaptureFragment();
//定制化扫描框UI
CodeUtils.setFragmentArgs(captureFragment,R.layout.view_qrcode_scan);
//分析结果回调
captureFragment.setAnalyzeCallback(analyzeCallback);
getSupportFragmentManager().beginTransaction().replace(R.id.fl_scan,captureFragment).commit();
}
CaptureFragment代码
- 定制化UI view_qrcode_scan.xml布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SurfaceView
android:id="@+id/preview_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.uuzuche.lib_zxing.view.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:inner_width="250dp"
app:inner_height="250dp"
app:inner_margintop="130dp"
app:inner_corner_color="#fff"
app:inner_corner_length="30dp"
app:inner_corner_width="4dp"
app:inner_scan_speed="12"
app:inner_scan_iscircle="false" />
</FrameLayout>
扫描框自定义属性:
<declare-styleable name="innerrect">
<attr name="inner_width" format="dimension"/><!-- 控制扫描框的宽度 -->
<attr name="inner_height" format="dimension"/><!-- 控制扫描框的高度 -->
<attr name="inner_margintop" format="dimension" /><!-- 控制扫描框距离顶部的距离 -->
<attr name="inner_corner_color" format="color" /><!-- 控制扫描框四角的颜色 -->
<attr name="inner_corner_length" format="dimension" /><!-- 控制扫描框四角的长度 -->
<attr name="inner_corner_width" format="dimension" /><!-- 控制扫描框四角的宽度 -->
<attr name="inner_scan_bitmap" format="reference" /><!-- 控制扫描图 -->
<attr name="inner_scan_speed" format="integer" /><!-- 控制扫描速度 -->
<attr name="inner_scan_iscircle" format="boolean" /><!-- 控制小圆点是否展示 -->
</declare-styleable>
- analyzeCallback是我们定义的扫描回调函
CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
@Override
public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
bundle.putString(CodeUtils.RESULT_STRING, result);
resultIntent.putExtras(bundle);
setResult(RESULT_OK, resultIntent);
finish();
}
@Override
public void onAnalyzeFailed() {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
bundle.putString(CodeUtils.RESULT_STRING, "");
resultIntent.putExtras(bundle);
setResult(RESULT_OK, resultIntent);
finish();
}
};
好了,打完收工。