二维码
可以通过开源框架快速集成, zxing是一款Google推出的强大的二维码扫描库,支持多个平台,我们只需要Android核心代码,故依赖大神提取核心包即可。
二维码扫描示例
1. 依赖zxing
在对应模块build.gradle
添加
// 添加这两行
implementation 'com.google.zxing:core:3.2.1' //zxing核心依赖
implementation 'com.journeyapps:zxing-android-embedded:3.3.0' //生成二维码依赖
2. 二维码生成
ZxingUtil
public class ZxingUtil {
/**
* 生成二维码bitmap
*/
public static Bitmap createBitmap(String str) {
Bitmap bitmap = null;
BitMatrix result = null;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
try {
result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 400, 400);
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
bitmap = barcodeEncoder.createBitmap(result);
} catch (WriterException e) {
e.printStackTrace();
} catch (IllegalArgumentException iae) {
return null;
}
return bitmap;
}
}
3. 二维码扫描
- 为了简便开发使用到ButterKnife框架
在对应模块的build.gradle
添加
//添加这两行
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
可能出现如下错误
all com.android.support libraries must use the exact same version specification
这是由于引用的第三方库的支持库版本低于(或者不一致)app build.gradle中的支持库版本
改三方库版本太过麻烦故直接在对应模块中的build.gradle中配置,强制使用推荐版本即可
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '25.3.0' // 笔者studio推荐版本为25.3.0
}
}
}
}
- 定义自己的扫描界面
ScanActivity
import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.KeyEvent;
import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import butterknife.BindView;
import butterknife.ButterKnife;
public class ScanActivity extends Activity {
@BindView(R.id.dbv)
DecoratedBarcodeView mDBV;
private CaptureManager captureManager; //捕获管理器
@Override
protected void onPause() {
super.onPause();
captureManager.onPause();
}
@Override
protected void onResume() {
super.onResume();
captureManager.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
captureManager.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
captureManager.onSaveInstanceState(outState);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return mDBV.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
ButterKnife.bind(this);
captureManager = new CaptureManager(this, mDBV);
captureManager.initializeFromIntent(getIntent(), savedInstanceState);
captureManager.decode();
}
}
扫描界面布局
activity_scan
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.zxingtest.activity.ScanActivity">
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/dbv"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:zxing_framing_rect_height="200dp"
app:zxing_framing_rect_width="200dp"
app:zxing_preview_scaling_strategy="fitXY"
app:zxing_use_texture_view="true"></com.journeyapps.barcodescanner.DecoratedBarcodeView>
</RelativeLayout>
4. onActivityResult接收二维码扫描结果
public class MainActivity extends Activity {
public static final String TAG = "wangyannan";
@BindView(R.id.iv_qrcode)
ImageView mImageView;
@BindView(R.id.tv_string)
TextView mTvString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick({R.id.btn_create, R.id.btn_scan})
public void click(View view) {
switch (view.getId()) {
case R.id.btn_create:
Bitmap bitmap = ZxingUtil.createBitmap("https://www.baidu.com");
mImageView.setImageBitmap(bitmap);
break;
case R.id.btn_scan:
Log.i(TAG, "click: btnscan");
new IntentIntegrator(this)
.setOrientationLocked(false)
.setCaptureActivity(ScanActivity.class) // 设置自定义的activity是ScanActivity
.initiateScan(); // 初始化扫描
break;
}
}
// 通过onActivityResult接受二维码扫描结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (intentResult != null) {
if (intentResult.getContents() == null) {
Toast.makeText(this, "内容为空", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "扫描成功", Toast.LENGTH_LONG).show();
// ScanResult 为 获取到的字符串
String ScanResult = intentResult.getContents();
mTvString.setText(ScanResult);
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
大功告成:)