ActivityResultLauncher<ScanOptions>

在Android开发中,ActivityResultLauncher<ScanOptions> 是与ActivityResultContractsActivityResultAPI相关的概念,这是从Android Jetpack的Activity Result APIs引入的,用于简化处理从其他Activity或Fragment返回结果的过程。

假设你正在使用zxing-android-embedded库进行二维码扫描,但你想使用新的ActivityResultAPI来管理扫描的结果,那么你可以创建一个自定义的ActivityResultContract或利用现有的ActivityResultContract(如果库已经为你提供了)来启动扫描并接收结果。

然而,zxing-android-embedded库可能并没有直接提供与ActivityResultAPI集成的功能。但你可以通过包装IntentIntegrator的调用来实现这一点。

以下是一个简化的示例,展示如何使用ActivityResultLauncher来启动二维码扫描:

  1. 定义ActivityResultContract(如果你没有现成的):

你可能需要定义一个自定义的ActivityResultContract,但在这个例子中,我们假设有一个名为ScanContract的假想Contract。

  1. 在Activity中设置ActivityResultLauncher

public class ScanActivity extends AppCompatActivity {  
  
    private ActivityResultLauncher<ScanOptions> scanLauncher;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_scan);  
  
        scanLauncher = registerForActivityResult(  
            new ScanContract(), // 假设的ScanContract  
            new ActivityResultCallback<ScanResult>() {  
                @Override  
                public void onActivityResult(ScanResult result) {  
                    if (result != null && result.hasContents()) {  
                        // 处理扫描结果  
                        String scanContent = result.getContents();  
                        // ...  
                    }  
                }  
            }  
        );  
  
        // 当你想要启动扫描时  
        ScanOptions options = new ScanOptions(); // 假设的ScanOptions类,用于传递扫描参数  
        scanLauncher.launch(options);  
    }  
  
    // ... 其他代码 ...  
}

注意:上面的代码是一个简化的示例,并没有真正与zxing-android-embedded集成。为了与zxing-android-embedded集成,你可能需要:

  • 创建一个自定义的ActivityResultContract,该Contract使用IntentIntegrator来启动扫描。
  • 在Contract的createIntent()方法中,配置并返回用于启动扫描的Intent。
  • 在Contract的parseResult()方法中,解析从扫描Activity返回的结果。

这可能需要一些额外的工作来确保与zxing-android-embedded的正确集成。如果你只是想要一个简单的解决方案,直接使用IntentIntegrator和传统的onActivityResult()方法可能更为简单和直接。

现在已有自定义扫描界面package com.example.tcu_ble; import com.journeyapps.barcodescanner.CaptureActivity; public class ScanActivity extends CaptureActivity{ } 希望在主程序 qr_bt.setOnClickListener(view ->{ ScanOptions options = new ScanOptions(); options.setDesiredBarcodeFormats(ScanOptions.QR_CODE); // 只扫描二维码 options.setPrompt("将二维码放入框内"); // 提示信息 options.setCameraId(0); // 使用后置摄像头 options.setBeepEnabled(true); // 扫描成功时播放声音 options.setBarcodeImageEnabled(true); // 保存扫描的图片 options.setOrientationLocked(true); // 锁定方向 options.setCaptureActivity(ScanActivity.class);// 强制竖屏 scanLauncher.launch(options); //启动扫描 }); @SuppressLint("MissingPermission") final ActivityResultLauncher<ScanOptions> scanLauncher = registerForActivityResult(new ScanContract(), result -> { if (result.getContents() != null) { // 扫描成功,获取结果 String scanResult = result.getContents(); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); BluetoothDevice device = adapter.getRemoteDevice( scanResult); //跳转页面 Intent intent = new Intent(this,DataActivity.class); intent.putExtra("device",device); startActivity(intent); if (bluetoothGatt != null) { bluetoothGatt.disconnect(); bluetoothGatt.close(); // 关键:释放资源 bluetoothGatt = null; // 置空避免重复使用 } bluetoothGatt = device.connectGatt(this, false, new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { switch (newState) { case BluetoothProfile.STATE_CONNECTED://连接成功 isConnected = true; Log.d(TAG, "连接成功"); runOnUiThread(() -> { // layConnectingLoading.setVisibility(View.GONE); showMsg("连接成功"); }); break; case BluetoothProfile.STATE_DISCONNECTED://断开连接 isConnected = false; Log.d(TAG, "断开连接"); runOnUiThread(() -> { // layConnectingLoading.setVisibility(View.GONE); showMsg("断开连接"); }); break; default: break; } } }); //Toast.makeText(LoginActivity.this, "扫描结果: " + scanResult, Toast.LENGTH_LONG).show(); // 这里可以处理扫描结果,比如显示在界面上或者发送到服务器等 } });中应用到自定义的扫描界面,主程序代码做出修改
11-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值