华为Scan Kit是华为提供的一种统一扫码服务,它提供便捷的条形码和二维码扫描、解析、生成能力,帮助用户快速构建应用内的扫码功能。
Scan Kit的优点在于它支持多种码制式,包括一维码和二维码,如EAN-8、EAN-13、UPC-A、UPC-E、Codabar、Code 39、Code 93、Code 128、ITF、QR Code、Data Matrix、PDF417、Aztec等。同时,Scan Kit针对远距离码或小型码的检测和自动放大做了优化,并对常见复杂扫码场景(如反光、暗光、污损、模糊、柱面)做了针对性识别优化,提升了扫码成功率与用户体验。
在调用模式上,Scan Kit提供了四种模式:Default View Mode模式、Customized View Mode模式、Bitmap Mode模式和MultiProcessor Mode模式。其中,Default View Mode模式和Customized View Mode模式针对扫码流程和扫码界面处理方式不同,Bitmap Mode模式和MultiProcessor Mode模式同样如此。
在解析结果方面,Scan Kit不仅可以返回码的原始内容,还可以针对使用特定内容格式编码的二维码/条码进行分析并提取结构化数据,帮助开发者快速构建关联服务。支持的场景包括联系人信息、Wi-Fi连接信息、网页、日历日程、ID卡、短信、电话、邮件、地理位置、商品条码、ISBN等。
另外,Scan Kit还支持生成码,可以将字符串转换为一维码或二维码,目前支持的码制式包括EAN-8、EAN-13、UPC-A、UPC-E、Codabar、Code 39、Code 93、Code 128、ITF、QR Code、Data Matrix、PDF417、Aztec等。
以下是一个使用华为Scan Kit进行二维码扫描的示例代码:
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.huawei.hms.plugin.scan.Scan;
import com.huawei.hms.plugin.scan.model.ScanResult;
import com.huawei.hms.plugin.scan.model.options.decoder.BarcodeFormat;
import com.huawei.hms.plugin.scan.model.options.decoder.DecodeRequestedOptions;
import com.huawei.hms.plugin.scan.model.options.decoder.QrCodeDecoderOption;
import com.huawei.hms.plugin.scan.ui.ScanActivity;
import com.huawei.hms.plugin.scan.ui.ScanFragment;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_SCAN = 10001;
private Button mButtonScan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonScan = findViewById(R.id.button_scan);
mButtonScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission
.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity .this, new String[]{Manifest
.permission .CAMERA}, REQUEST_CODE_SCAN);
} else {
startScan();
}
}
});
}
private void startScan() {
// 创建扫描请求对象,并设置扫描模式为连续扫描
final Scan scan = new Scan(ScanFragment.class);
QrCodeDecoderOption qrCodeDecoderOption = new QrCodeDecoderOption();
qrCodeDecoderOption .setBarcodeFormats(BarcodeFormat .QR_CODE); // 设置需要识别的码制式,这里只识别二维码。 可以通过 | 运算符添加多个需要识别的码制式,例如:BarcodeFormat .QR_CODE | BarcodeFormat .EAN_13。默认识别的码制式为 BarcodeFormat .EAN_13 | BarcodeFormat .QR_CODE。 默认识别所有支持的码制式。 如果设置了该参数,则只识别对应的码制式。 可以通过查询华为开发者联盟官网获取支持的码制式类型。 例如:BarcodeFormat .EAN_13、BarcodeFormat .QR_CODE等。
// 设置扫描请求对象的解码选项
scan.setRequestedOptions(qrCodeDecoderOption);
// 启动扫描活动
startActivityForResult(scan.getOpenIntent(), REQUEST_CODE_SCAN);
}
// 处理扫描结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
if (data != null && data.hasExtra(ScanActivity.SCAN_RESULT)) {
// 获取扫描结果
String result = data.getStringExtra(ScanActivity.SCAN_RESULT);
// 处理扫描结果,例如解析二维码内容
ParseQRCodeResult parseResult = ScanKit.getInstance().parseQRCode(result);
if (parseResult != null && parseResult.getContent() != null) {
String content = parseResult.getContent();
// 处理二维码内容,例如展示在界面上或者进行其他操作
Toast.makeText(MainActivity.this, content, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "无法解析二维码", Toast.LENGTH_SHORT).show();
}
}
}
}