Android:简单粗暴的二维码生成与扫描
- 之前写项目的时候有需求要生成和扫描二维码,我想弄的简单点,在网上找了好久终于在一个大佬的博客里找到了我所期待的简单粗暴,在这里记录一下。
- 在app目录下的build.gradle文件中添加:
implementation 'cn.yipianfengye.android:zxing-library:2.2'
- 在AndroidManifest.xml文件中添加:
<uses-permission android:name="android.permission.CAMERA" /> <!-- 权限:调用相机 -->
<uses-permission android:name="android.permission.VIBRATE" /><!-- 权限:振动 -->
- 在Activity或Fragment中执行初始化操作:
ZXingLibrary.initDisplayOpinion(this); //初始化ZXingLibrary
- 向用户申请调用相机的权限 (android 6.0以上需要动态申请相机的调用权限)
//获取相机拍摄的权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//版本>=6.0 ?
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//向用户申请调用相机的权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
}
}
- 生成二维码
String codeStr = “hello world !”;
Bitmap bitmap = CodeUtils.createImage(codeStr, 250, 250, null); //设置二维码的内容、宽、高、是否带有logo
- 启动CaptureActivity扫描二维码(二维码的扫描界面用户可以自行设计,这里使用默认界面扫描二维码)。注意要把QRCodeActivity换成自己的Context。
//启动CaptureActivity扫描二维码
startActivityForResult(new Intent(QRCodeActivity.this, CaptureActivity.class), CAPTURE_REQUEST_CODE);
- 在onActivityResult()方法中获取扫描二维码得到的信息
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//用户没有进行有效的设置操作,返回
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplication(), "取消", Toast.LENGTH_SHORT).show();
return;
}
switch (requestCode) {
case CAPTURE_REQUEST_CODE: {
if (data != null) {
Bundle bundle = data.getExtras();
if (bundle == null) {
Log.d(TAG, "onActivityResult: bundle==null");
return;
}
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
String result = bundle.getString(CodeUtils.RESULT_STRING);
Log.d(TAG, "onActivityResult: 解析结果:"+result);
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
Log.d(TAG, "onActivityResult: 解析失败!");
}
} else {
Log.d(TAG, "onActivityResult: data==null");
}
break;
}
}
我的部分代码:
QRCodeActivity.java
package com.example.test3project;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.uuzuche.lib_zxing.activity.CaptureActivity;
import com.uuzuche.lib_zxing.activity.CodeUtils;
import com.uuzuche.lib_zxing.activity.ZXingLibrary;
public class QRCodeActivity extends AppCompatActivity {
private ImageView imageQRCode;
private EditText editCreateQRCode;
private Button buttonCreateQRCode;
private Button buttonScanQRCode;
private TextView textQRCodeResult;
private static final String TAG = "QRCodeActivity";
private static final int CAPTURE_REQUEST_CODE = 789;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrcode);
ZXingLibrary.initDisplayOpinion(this); //初始化ZXingLibrary
//获取相机拍摄的权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//版本>=6.0 ?
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//向用户申请调用相机的权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
}
}
imageQRCode = findViewById(R.id.imageQRCode);
editCreateQRCode = findViewById(R.id.editCreateQRCode);
buttonCreateQRCode = findViewById(R.id.buttonCreateQRCode);
buttonScanQRCode = findViewById(R.id.buttonScanQRCode);
textQRCodeResult = findViewById(R.id.textQRCodeResult);
buttonCreateQRCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String codeStr = editCreateQRCode.getText().toString();
Bitmap bitmap = CodeUtils.createImage(codeStr, 250, 250, null); //设置二维码的内容、宽、高、是否带有logo
imageQRCode.setImageBitmap(bitmap);
}
});
buttonScanQRCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动CaptureActivity扫描二维码
startActivityForResult(new Intent(QRCodeActivity.this, CaptureActivity.class), CAPTURE_REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//用户没有进行有效的设置操作,返回
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplication(), "取消", Toast.LENGTH_SHORT).show();
return;
}
switch (requestCode) {
case CAPTURE_REQUEST_CODE: {
if (data != null) {
Bundle bundle = data.getExtras();
if (bundle == null) {
Log.d(TAG, "onActivityResult: bundle==null");
return;
}
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
String result = bundle.getString(CodeUtils.RESULT_STRING);
textQRCodeResult.setText("解析结果:" + result);
Log.d(TAG, "onActivityResult: 解析结果:"+result);
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
textQRCodeResult.setText("解析二维码失败!");
Log.d(TAG, "onActivityResult: 解析失败!");
}
} else {
Log.d(TAG, "onActivityResult: data==null");
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
activity_qrcode.xml
<?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:orientation="vertical"
tools:context=".QRCodeActivity">
<ImageView
android:id="@+id/imageQRCode"
android:layout_margin="10dp"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_gravity="center_horizontal"/>
<EditText
android:hint="输入文字"
android:gravity="center"
android:id="@+id/editCreateQRCode"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/buttonCreateQRCode"
android:text="生成二维码"
android:layout_gravity="center_horizontal"
android:layout_margin="5dp"
android:layout_width="240dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/buttonScanQRCode"
android:text="扫描二维码"
android:layout_gravity="center_horizontal"
android:layout_margin="5dp"
android:layout_width="240dp"
android:layout_height="wrap_content" />
<TextView
android:layout_margin="10dp"
android:hint="扫描结果"
android:gravity="center"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textQRCodeResult"
/>
</LinearLayout>