android UVCCamera close后再次open无图像问题

android UVCCamera close后再次open无图像问题


android usb摄像头使用开源库 UVCCamera部分型号摄像头在使用过程中出现close后再次open预览无图像问题,但退出整个app重新打开app又能正常出图
跟踪测试发现

private final USBMonitor.OnDeviceConnectListener mOnDeviceConnectListener = new USBMonitor.OnDeviceConnectListener() {
        @Override
        public void onAttach(final UsbDevice device) {
            if(device.getDeviceSubclass() == 2)
                new LogTools(TAG,"onAttach pid:" + device.getProductId() + " vid:" + device.getVendorId(),debug);
        }

        @Override
        public void onConnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock, final boolean createNew) {
            //new LogTools(TAG,"onConnect:" + device.toString(),debug);
            int pid = device.getProductId();
            int vid = device.getVendorId();
            new LogTools(TAG,"onConnect pid:" + pid + " vid:" + vid,debug);
            if((pid == CAM_ONE_PID) && (vid == CAM_ONE_VID)) {
                //ctrlBlock.close();
                usbControlBlocks.add(ctrlBlock);
                mCameraHandler.open(ctrlBlock);
                startPreview();
            }

            if((pid == CAM_TWO_PID) && (vid == CAM_TWO_VID)) {
                //ctrlBlock.close();
                usbControlBlocks.add(ctrlBlock);
                mCameraHandler1.open(ctrlBlock);
                startPreview1();
            }
        }

        @Override
        public void onDisconnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock) {
            int pid = device.getProductId();
            int vid = device.getVendorId();
            new LogTools(TAG,"onDisconnect pid:" + pid + " vid:" + vid,debug);
        }
        @Override
        public void onDettach(final UsbDevice device) {
            //Toast.makeText(Main2.this, "USB_DEVICE_DETACHED", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel(final UsbDevice device) {
        }
    };

在OnDeviceConnectListener中的onConnect函数中增加对UsbControlBlock的close操作后能正常出图,但在onConnect中直接调用ctrlBlock.close()会导致其它问题,所以先把ctrlBlock保存下来,在预览结束时进行close,这样处理,close后等至少5秒再次open基本上每次都能正常出图

                if(usbControlBlocks.size() > 0) {
                    for (USBMonitor.UsbControlBlock usbControlBlock: usbControlBlocks) {
                        usbControlBlock.close();
                    }
                    usbControlBlocks.clear();
                }
                mCameraHandler.stopRecording();
                mCameraHandler.close();
                mCameraHandler1.stopRecording();
                mCameraHandler1.close();

如果有其它的解决办法,欢迎讨论.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用AppCompatImageView控件显示UVCCamera实时图像的例子: 首先,在XML布局文件中添加一个AppCompatImageView控件: ```xml <androidx.appcompat.widget.AppCompatImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后在Activity中获取该控件的引用,并初始化UVCCamera: ```java private AppCompatImageView imageView; private UVCCamera mUVCCamera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); mUVCCamera = new UVCCamera(); mUVCCamera.open(0, new UVCCamera.OnOpenListener() { @Override public void onOpen() { mUVCCamera.setPreviewSize(640, 480, UVCCamera.FRAME_FORMAT_MJPEG); mUVCCamera.setFrameCallback(new UVCCamera.OnFrameCallback() { @Override public void onFrame(ByteBuffer frame) { final Bitmap bitmap = BitmapFactory.decodeByteArray(frame.array(), 0, frame.remaining()); runOnUiThread(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); } }, UVCCamera.PIXEL_FORMAT_YUV420SP); mUVCCamera.startPreview(); } @Override public void onError(int code) { // 打开摄像头失败 } }); } ``` 在onCreate()方法中,首先获取AppCompatImageView控件的引用,然后初始化UVCCamera,并设置预览尺寸和帧回调函数。在帧回调函数中,将帧数据转换为Bitmap对象,并在UI线程中调用imageView.setImageBitmap()方法更新AppCompatImageView控件的显示。 最后,在Activity销毁时,需要释放UVCCamera资源: ```java @Override protected void onDestroy() { super.onDestroy(); mUVCCamera.stopPreview(); mUVCCamera.close(); } ``` 在onDestroy()方法中,停止UVCCamera预览并释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值