二维码的生成与解析
二维码的原理简介:二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。二维码中的黑白色表示二进制的0和1,所以信息可以通过一定的编码方式,将信息编入进二维码中。二维码具有多种编码,常用的有:PDF417、QR Code、Code 49、Code 16K、Code One等。
效果图
以下是二维码生成代码:
界面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="vertical"
tools:context="www.weshared.demo2.MainActivity">
<EditText
android:id="@+id/edit_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入信息" />
<Button
android:id="@+id/btn_get_erweima"
android:layout_width="match_parent"
android:text="生成二维码"
android:layout_height="wrap_content" />
<ImageView
android:layout_marginTop="100dp"
android:layout_gravity="center"
android:id="@+id/iv_erweima"
android:layout_width="200dp"
android:layout_height="200dp" />
</LinearLayout>
MainActivity中代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnLongClickListener {
private EditText editText;
private Button btn;
private ImageView imageView;
private boolean isShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
initListener();
}
private void init() {
editText = (EditText) findViewById(R.id.edit_url);
btn = (Button) findViewById(R.id.btn_get_erweima);
imageView = (ImageView) findViewById(R.id.iv_erweima);
}
private void initListener() {
btn.setOnClickListener(this);
imageView.setOnLongClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_get_erweima:
getErWeiMa();
isShow = true;
break;
}
}
@Override
public boolean onLongClick(View view) {
scanErWeiMa();
return true;
}
private void scanErWeiMa() {
if (isShow) {
BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] row = new int[w * h];
bitmap.getPixels(row, 0, w, 0, 0, w, h);//获取bitmap的像素点
Hashtable<DecodeHintType, String> table = new Hashtable<>();
table.put(DecodeHintType.CHARACTER_SET, "utf-8");//设置编码格式
QRCodeReader reader = new QRCodeReader();
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new RGBLuminanceSource(w, h, row)));
try {
Result result = reader.decode(binaryBitmap, table);
String content = result.getText();
Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
} catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
}
}
public void getErWeiMa() {
String content = editText.getText().toString().trim();
if (TextUtils.isEmpty(content)) return;
Bitmap bitmap = createErWeiMa(content);
if (bitmap == null) return;
imageView.setImageBitmap(bitmap);
}
private Bitmap createErWeiMa(String content) {
QRCodeWriter writer = new QRCodeWriter();
try {
BitMatrix matrix = writer.encode(content,
BarcodeFormat.QR_CODE, //二维码的编码格式,与‘QRCodeWriter’对应
imageView.getMeasuredWidth(),
imageView.getMeasuredHeight());
return matrixChangeBitmap(matrix);
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
private Bitmap matrixChangeBitmap(BitMatrix matrix) {
if (matrix == null) throw new NullPointerException("matrix is null");
int width = matrix.getWidth();
int height = matrix.getHeight();
int[] row = new int[width * height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int color = Color.WHITE;
if (matrix.get(i, j)) {
color = Color.BLACK;
}
row[i + j * width] = color;
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(row, 0, width, 0, 0, width, height);
return bitmap;
}
}