QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。
这里的二维码和书本的条形码是不一样的。
这里的二维码样式:
这里使用网络框架,github上的依赖,只要使用几句话就能生成一个二维码的图像显示在页面上,并且使用他做好的其他类还能扫描二维码,进行自己的操作。
依赖语句:
compile 'com.google.zxing:core:3.2.1'
compile 'cn.bingoogolapple:bga-qrcodecore:1.1.4@aar'
compile 'cn.bingoogolapple:bga-zxing:1.1.4@aar'
然后点击同步。稍等一下就可以只要他创建的类和方法来操作了。
Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode("https://www.baidu.com", 400);
第一个参数是一个任意字符串,第二个参数是产生的BitMap图片对象的大小,创建bitMap对象后就可以把它放在我们页面的ImageView中显示。
一般使用时的代码块:
/**
* 因为产生二维码是耗时操作所以要在子线程中操作
*/
private void newCodeImage() {
//开启线程
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode("https://www.baidu.com", 400);
//把产生的Bitmap赋值到ImageView中,但是要在主线程中运行
runOnUiThread(new Runnable() {
@Override
public void run() {
iv.setImageBitmap(bitmap);
}
});
}
}).start();
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<cn.bingoogolapple.qrcode.zxing.ZXingView
android:id="@+id/zxingview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:qrcv_animTime="1000"
app:qrcv_borderColor="@android:color/white"
app:qrcv_borderSize="1dp"
app:qrcv_cornerColor="@color/colorPrimaryDark"
app:qrcv_cornerLength="20dp"
app:qrcv_cornerSize="3dp"
app:qrcv_maskColor="#33FFFFFF"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_scanLineSize="1dp"
app:qrcv_topOffset="90dp" />
LinearLayout>
//定义显示能扫描二维码的摄像头的View-->ZXingView,实例化
ZXingView zXingView = (ZXingView) findViewById(R.id.zxingview);
//设置摄像头的监事件,来监听扫描成功和失败结果
zXingView.setDelegate(this);//让本类对象实现监听
//开启摄像头的扫描功能
zXingView.startCamera();
//开始扫描
zXingView.startSpot();
/**
* 扫描二维码成功后返回一个字符串的回调方法
*/
@Override
public void onScanQRCodeSuccess(String result) {
//做相应的数据处理。。。
//停止扫描
zXingView.stopCamera();
//关闭页面
finish();
}
/**
* 扫描二维码失败后的回调方法
*/
@Override
public void onScanQRCodeOpenCameraError() {
Toast.makeText(this, "不能识别到二维码", Toast.LENGTH_SHORT).show();
}
程序运行后的界面:
点击扫描后,显示扫描界面:
扫描自己生成的二维码可以跳转到百度网络页面,
关闭网页后显示的结果:
可以看到,能都拿到二维码中藏有的字符串信息!
下面是设计的主要步骤
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="check"
android:text="去扫描秒二维码" />
<ImageView
android:id="@+id/main_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/main_tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="扫描后返回的结果!" />
LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<cn.bingoogolapple.qrcode.zxing.ZXingView
android:id="@+id/zxingview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:qrcv_animTime="1000"
app:qrcv_borderColor="@android:color/white"
app:qrcv_borderSize="1dp"
app:qrcv_cornerColor="@color/colorPrimaryDark"
app:qrcv_cornerLength="20dp"
app:qrcv_cornerSize="3dp"
app:qrcv_maskColor="#33FFFFFF"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_scanLineSize="1dp"
app:qrcv_topOffset="90dp" />
LinearLayout>
package com.lwz.qr_code;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import cn.bingoogolapple.qrcode.zxing.QRCodeEncoder;
public class MainActivity extends AppCompatActivity {
//定义一个显示二维码的图形
ImageView iv;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化
iv = (ImageView) findViewById(R.id.main_iv);
textView = (TextView) findViewById(R.id.main_tv_result);
newCodeImage();
}
/**
* 因为产生二维码是耗时操作所以要在子线程中操作
*/
private void newCodeImage() {
//开启线程
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode("https://www.baidu.com", 400);
//把产生的Bitmap赋值到ImageView中,但是要在主线程中运行
runOnUiThread(new Runnable() {
@Override
public void run() {
iv.setImageBitmap(bitmap);
}
});
}
}).start();
}
/***
* 扫描二维码
* 需要操作摄像头,加权限
* 需要跳转到另一个页面
*/
public void check(View view) {
startActivityForResult(new Intent(this, Scanner.class), 1);
}
/**
* 结果码的返回,扫描完成后,把扫描到的信息显示在页面上
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 2) {
String result = data.getStringExtra("result");
textView.setText(result);
//在实际运用中一般都是判断扫描得到的内容再做相应的行为
if (result.startsWith("http://")||result.startsWith("https://")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(result));
startActivity(intent);
} else if (result.startsWith("firend://")) {
//app加好友的方法
//调用服务器接口
} else if (result.startsWith("pay://")) {
//启动支付宝
}
}
}
}
package com.lwz.qr_code;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import cn.bingoogolapple.qrcode.core.QRCodeView;
import cn.bingoogolapple.qrcode.zxing.ZXingView;
/**
* 这是扫描二维码页面的类
* 里面要有一个摄像头的View
* 扫描完毕后还要,返回数据
*/
public class Scanner extends Activity implements QRCodeView.Delegate {
//定义显示能扫描二维码的摄像头的View-->ZXingView
ZXingView zXingView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scanner);
//实例化
zXingView = (ZXingView) findViewById(R.id.zxingview);
//设置摄像头的监事件,来监听扫描成功和失败结果
zXingView.setDelegate(this);
}
@Override
protected void onStart() {
super.onStart();
//开启摄像头的扫描功能
zXingView.startCamera();
//开始扫描
zXingView.startSpot();
}
/**
* 扫描二维码成功后返回一个字符串的回调方法
*/
@Override
public void onScanQRCodeSuccess(String result) {
Intent data=getIntent();
data.putExtra("result",result);
setResult(2,data);
//停止扫描
zXingView.stopCamera();
//关闭页面
finish();
}
/**
* 扫描二维码失败后的回调方法
*/
@Override
public void onScanQRCodeOpenCameraError() {
Toast.makeText(this, "不能识别到二维码", Toast.LENGTH_SHORT).show();
}
}
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<activity android:name=".Scanner" />
弄完就可以实现一个简单的二维码生成和扫描的功能的软件了。这里能实现跳转到网页(如果二维码的数据是网页的字符串),如果二维码的信息数据是普通的字符串也能获取到。支付功能和添加好友等其他的功能代码暂时没有去实现,这个需要很多其他软件提供的信息。
这里提供一个github的源码文件的地址:
https://github.com/bingoogolapple/BGAQRCode-Android
里面还还有二维码生成的其他各种处理。而且还有实时跟新的依赖数据,里面也有简单的使用步骤。