如何在使用IntentIntegrator时区分两个扫码按钮的返回结果?
区分两个扫码按钮的请求结果(IntentIntegrator版)
嘿,这个场景我做项目时也碰到过!其实IntentIntegrator早就提供了自定义请求码的方法,只是默认没显式用而已,咱们改几处代码就能搞定:
第一步:给两个按钮的扫码请求分配不同请求码
把原来的无参scan()调用改成带请求码的,比如第一个按钮传1,第二个传2:
ibBinScan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { scan(1); // 对应ibBinScan的请求码 } }); ibNumberScan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { scan(2); // 对应ibNumberScan的请求码 } });
第二步:修改扫码方法,绑定自定义请求码
把你的scanNow()改成带参数的方法,核心是调用IntentIntegrator.setRequestCode()传入咱们的自定义码:
public void scan(int requestCode) { IntentIntegrator integrator = new IntentIntegrator(InboundActivity.this); integrator.setCaptureActivity(Portait.class); integrator.setOrientationLocked(false); integrator.setBeepEnabled(false); integrator.setBarcodeImageEnabled(false); integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES); integrator.setPrompt("Scan Barcode"); integrator.setRequestCode(requestCode); // 关键:给当前扫码请求打上唯一标识 integrator.initiateScan(); }
第三步:在onActivityResult里区分处理结果
现在就能通过requestCode精准判断是哪个按钮发起的扫码了,同时别忘了用IntentIntegrator.parseActivityResult()先验证是不是扫码的结果:
@SuppressLint("SetTextI18n") @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { if (result.getContents() == null) { // 扫码被取消的情况,可加提示 Toast.makeText(this, "扫码已取消", Toast.LENGTH_SHORT).show(); } else { // 根据请求码分情况处理 if (requestCode == 1) { // 处理ibBinScan按钮的扫码结果 String scannedBinCode = result.getContents(); // 比如赋值给对应的输入框:etBin.setText(scannedBinCode); } else if (requestCode == 2) { // 处理ibNumberScan按钮的扫码结果 String scannedNumberCode = result.getContents(); // etNumber.setText(scannedNumberCode); } } } else { // 非扫码请求的结果,交给父类处理 super.onActivityResult(requestCode, resultCode, data); } }
本质就是给每个扫码请求绑定唯一的请求码标记,在回调里通过这个标记区分来源,完全不需要改动IntentIntegrator的底层逻辑~
内容的提问来源于stack exchange,提问作者rav
相关产品推荐
相关产品推荐

