android设备调用usb外置摄像头方法及案例

android调用内置摄像头的方法相对比较简单,参考实例也比较多,但是针对调用外置摄像头的方法介绍比较少,本篇对现有的 资料进行汇总,并给出相关案例如下:

https://blog.csdn.net/fengshiguang2012/article/details/79569280

https://blog.csdn.net/andrexpert/article/details/78324181

https://blog.csdn.net/CrazyMo_/article/details/58139934

https://blog.csdn.net/qq_31939617/article/details/82348796

开源项目:

https://github.com/saki4510t/UVCCamera

https://github.com/jiangdongguo/AndroidUSBCamera

重点总结:

查找资料过程中,可以发现目前调用外置usb摄像头的方法基本上都是基于UVCCamera这个开源项目,原理是android设备具备otg功能,通过检测android设备是否有usb设备连接,进一步采集usb摄像头所采集到的图像数据。

    // ********** 显示摄像头采集的图像结果 *************
    private void startPreview() {
		synchronized (mSync) {
			if (mCameraHandler != null) {
                final SurfaceTexture st = mUVCCameraView.getSurfaceTexture();
				mCameraHandler.setPreviewCallback(mIFrameCallback);
                mCameraHandler.startPreview(new Surface(st));
			}
		}
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
            }
        });
        updateItems();
    }

这里对图像的显示方法进行总结,图像显示主要有两种方法,一种是:

final SurfaceTexture st = mUVCCameraView.getSurfaceTexture();
mCameraHandler.startPreview(new Surface(st));

另外一种是:

    mCameraHandler.setPreviewCallback(mIFrameCallback);
    //*************** IFrameCallback ***************
    private final IFrameCallback mIFrameCallback = new IFrameCallback() {
        @Override
        public void onFrame(final ByteBuffer frame) {
            frame.clear();
            if(!isActive() || isInCapturing){
                return;
            }
            if(bitmap == null){
                Toast.makeText(MainActivity.this, "错误:Bitmap为空", Toast.LENGTH_SHORT).show();
                return;
            }
            synchronized (bitmap) {
                srcBitmap.copyPixelsFromBuffer(frame);
                WarnText = "";

                if(bitmap.getWidth() != srcBitmap.getWidth() || bitmap.getHeight() !=  srcBitmap.getHeight()){
                    bitmap = Bitmap.createBitmap(srcBitmap.getWidth(),  srcBitmap.getHeight(), Bitmap.Config.RGB_565);
                }
                Mat src = new Mat ();
                Utils.bitmapToMat(srcBitmap,src);
                calculate(srcBitmap.getNativeObjAddr(), mLeft, mTop,  mWidth,  mHeight);
                Utils.matToBitmap(srcBitmap,bitmap);                   
            }
            mImageView.post(mUpdateImageTask);
        }
    };

调用opencv时,需注意在程序中加入:

   private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded successfully");
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };

其他,像usb 设备的连接,断开等,可以参见程序部分:

   private final OnDeviceConnectListener mOnDeviceConnectListener = new OnDeviceConnectListener() {
        @Override
        public void onAttach(final UsbDevice device) {
            Toast.makeText(MainActivity.this, "USB_DEVICE_ATTACHED", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onConnect(final UsbDevice device, final UsbControlBlock ctrlBlock, final boolean createNew) {
            if (DEBUG) Log.v(TAG, "onConnect:");
            synchronized (mSync) {
                if (mCameraHandler != null) {
	                mCameraHandler.open(ctrlBlock);
	                startPreview();
	                updateItems();
				}
            }
        }

        @Override
        public void onDisconnect(final UsbDevice device, final UsbControlBlock ctrlBlock) {
            if (DEBUG) Log.v(TAG, "onDisconnect:");
            synchronized (mSync) {
                if (mCameraHandler != null) {
                    queueEvent(new Runnable() {
                        @Override
                        public void run() {
                            try{
                                // maybe throw java.lang.IllegalStateException: already released
                                mCameraHandler.setPreviewCallback(null);
                            }
                            catch(Exception e){
                                e.printStackTrace();
                            }
                            mCameraHandler.close();
                        }
                    }, 0);
				}
            }
			setCameraButton(false);
        }
        @Override
        public void onDettach(final UsbDevice device) {
            Toast.makeText(MainActivity.this, "USB_DEVICE_DETACHED", Toast.LENGTH_SHORT).show();
        }

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

后期经过我的优化,已经做出具备图像实时处理功能的app。有类似需求者,可以联系我。

### 回答1: Android系统通过USB OTG(On-The-Go)标准支持USB摄像头USB摄像头将其视频流捕获,通过USB连接发送到Android设备。为了预览USB摄像头,我们需要使用Android的Camera2 API。 首先,我们需要获取USB摄像头的权限,即声明USB设备权限和请求USB权限。例如,我们可以在AndroidManifest.xml文件中添加以下权限声明: ``` <uses-feature android:name="android.hardware.usb.host" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-feature android:name="android.hardware.camera2.full" /> <uses-feature android:name="android.hardware.usb.camera" /> ``` 然后,我们可以使用UsbManager类来检测和访问USB设备。我们需要获取USB摄像头的Vendor ID和Product ID,并通过UsbDeviceConnection类来打开设备并与之通信。 接下来,我们需要创建一个用于预览的SurfaceView。我们可以使用CameraManager类来检测可用的摄像头摄像头特性。我们可以选择前置或后置摄像头,并在预览之前配置摄像头参数,例如设置分辨率和帧率。 最后,我们可以使用CameraCaptureSession和CaptureRequest类来启动预览,并使用SurfaceView显示在屏幕上。我们还可以通过CaptureCallback类来监听预览中的事件,并进行捕获、存储和编辑。 总体来说,通过上述步骤,我们可以轻松调用USB摄像头预览并增强Android应用程序的功能。 ### 回答2: Android系统作为全球智能手机市场的主流系统之一,已经在很多领域展现出了其强大的应用和开发能力。在使用Android开发USB摄像头预览功能时,需要进行以下步骤: 1. 获取USB设备列表:在Android设备上通过USB调用USB设备的列表,以便查询并选择需连接的设备。一般情况下使用USB接口,可调用系统API—UsbManager类,具有getDeviceList()和openDevice()等方法。 2. 请求USB访问权限:获得USB设备列表后,需要获取USB访问权限,以便Android设备可以与USB设备之间进行数据通信。可调用UsbManager类的requestPermission()请求权限。 3. 配置USB摄像头:查找和连接USB设备后,需要进行USB摄像头的配置调整。这些配置参数包括Handler、格式、分辨率、图像尺寸、帧速率等。Android平台提供了MediaRecorder工具类,可用于捕捉视频和音频数据流。 4. 预览和录像:通过USB摄像头获取到的数据需要进行相应的处理,比如进行数据压缩、数据传输、图像处理和帧率控制等操作。此时可利用Android中的SurfaceView等控件进行预览和录像。 总结来说,USB摄像头预览功能需要进行一系列的调用和配置,涉及到USB设备的列表、权限申请、配置参数的设置、数据预览和录像等方面。因此,Android开发需要掌握这些操作和API,才能更好地实现该功能。 ### 回答3: 在Android调用USB摄像头进行预览的过程,需要进行如下的步骤: 1、检查设备是否支持USB摄像头调用功能 不是所有的Android设备都支持USB摄像头调用功能,因此首先要检查设备是否支持该功能。可以通过在AndroidManifest.xml文件中添加特殊权限“android.permission.USB_CAMERA”来检查设备是否支持。 2、连接USB摄像头并获取设备ID 将USB摄像头插入Android设备,检测到USB摄像头后可以通过USBManager来获取设备ID。需要注意的是,设备ID通常是在设备列表中按顺序排列的,因此需要确保获取正确的设备ID。 3、设置摄像头参数 在使用USB摄像头进行预览前,需要设置摄像头的一些参数,如预览分辨率、帧率等。可以通过CameraManager和CameraCharacteristics类进行设置。 4、创建预览窗口 在Android中,预览可以通过SurfaceView或TextureView来进行。需要创建一个预览窗口并将其与摄像头进行连接。 5、开启预览并显示画面 通过CameraDevice和CameraCaptureSession类,可以开启预览并显示画面。需要注意的是,在预览过程中还需要设置响应函数来处理图像帧的回调。 总之,在Android调用USB摄像头进行预览需要完成以上几个步骤,每一步都要仔细处理,使得设备能够正常地进行预览操作。
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值