使用 SDK
基于默认的 UI 界面接入
扫码组件提供一个公共扫码页面,可以直接调用。
Intent intent = QrCodeActivity.from(this)
.enableAutoFlash(autoFlash) //设置是否自动在暗处开启闪光灯,默认不开启
.enableAlbum(true) //设置是否展示从相册选择二维码入口,默认展示
.enableMultiCodeSelection(true) //设置是否支持多码选择,默认支持
.setFilters(mKeywords) //设置过滤二维码关键字
.getIntent();
startActivityForResult(intent, REQUEST_CODE_START_CAMERA);
复写 Activity 的 onActivityResult 方法处理扫码结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_START_CAMERA && resultCode == RESULT_OK && data != null) {
// list 为返回的扫码结果列表
List<ScanResult> list = data.getParcelableArrayListExtra(QrCodeActivity.KEY_RESULT);
for (ScanResult result : list) {
// ScanResult.data 为解析出来的二维码字符串
Log.d(TAG, result.data);
...
}
}
}
基于自定义 View 接入
布局中配置扫码 View 控件。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
>
<com.tencent.tmf.scan.api.QrCodeScanView
android:id="@+id/scanview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true" />
</RelativeLayout>
Activity 中获取扫码 View 并回调生命周期。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_qr_code_activity);
mScanView = findViewById(R.id.scanview);
mScanView.onCreate();
mScanView.setResultCallback(this);//设置扫码结果回调 ValuesCallback
}
@Override
protected void onStart() {
super.onStart();
mScanView.onStart();
}
@Override
protected void onResume() {
super.onResume();
mScanView.onResume();
}
@Override
public void onPause() {
super.onPause();
mScanView.onPause();
}
@Override
protected void onStop() {
super.onStop();
mScanView.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
mScanView.onDestroy();
}
实现 ValuesCallback,接收解码数据。
ValuesCallback mScanCallback = new ValuesCallback() {
@Override
public void onResults(final List<ScanResult> values) {
if(values == null){
return;
}
MainThreadUtils.post(new Runnable() {
@Override
public void run() {
ToastUtils.show(getApplicationContext(), values.toString(),
Toast.LENGTH_LONG);
}
});
}
};