Android Studio中调用USB摄像头
在 Android Studio 中调用 USB 摄像头,通常要借助 Android 的 USB Host API 或第三方 UVC(USB Video Class)库。下面是一个基于开源 UVCCamera 项目的示例流程和代码(Java):
1. 添加依赖
在 app/build.gradle
中加入 UVCCamera 库(以 saki4510t 的 UVCCamera 为例):
dependencies { // UVCCamera 核心库 implementation \'com.serenegiant:common:2.1.5\' // 可根据最新版本号调整 implementation \'com.serenegiant:uvccamera:2.1.5\'}
并在同一个文件的 android {}
节中启用 USB Host 特性:
android { defaultConfig { ... minSdkVersion 21 targetSdkVersion 33 } ...}
2. 在 AndroidManifest.xml 中申请权限
...
3. 布局文件(res/layout/activity_usb_camera.xml)
4. USB 授权广播接收器(UsbReceiver.java)
package com.example.usbcamera;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.hardware.usb.UsbManager;public class UsbReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // 可在此处自动启动 Activity 或请求权限 } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // 处理设备拔出 } }}
5. 调用 USB 摄像头的 Activity(UsbCameraActivity.java)
package com.example.usbcamera;import android.app.Activity;import android.hardware.usb.UsbDevice;import android.hardware.usb.UsbManager;import android.os.Bundle;import android.view.SurfaceView;import android.view.ViewGroup;import android.widget.Toast;import com.serenegiant.usb.CameraDialog;import com.serenegiant.usb.USBMonitor;import com.serenegiant.usb.UVCCamera;public class UsbCameraActivity extends Activity { private USBMonitor mUSBMonitor; private UVCCamera mUVCCamera; private SurfaceView mSurfaceView; private final USBMonitor.OnDeviceConnectListener mOnDeviceConnectListener = new USBMonitor.OnDeviceConnectListener() { @Override public void onAttach(UsbDevice device) { // 设备插入时自动弹出选择对话框 CameraDialog.showDialog(UsbCameraActivity.this, mUSBMonitor); } @Override public void onConnect(UsbDevice device, USBMonitor.UsbControlBlock ctrlBlock, boolean createNew) { // 打开摄像头并开始预览 mUVCCamera = new UVCCamera(); mUVCCamera.open(ctrlBlock); mUVCCamera.setPreviewSize(640, 480, UVCCamera.FRAME_FORMAT_MJPEG); mUVCCamera.startPreview(mSurfaceView.getHolder()); } @Override public void onDisconnect(UsbDevice device, USBMonitor.UsbControlBlock ctrlBlock) { stopCamera(); } @Override public void onDettach(UsbDevice device) { } @Override public void onCancel(UsbDevice device) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_usb_camera); mSurfaceView = findViewById(R.id.camera_view); // 注意:CameraViewInterface 实际可能是 SurfaceView 或 TextureView 的实现 if (mSurfaceView instanceof SurfaceView) { ((SurfaceView)mSurfaceView).getHolder().addCallback(null); } mUSBMonitor = new USBMonitor(this, mOnDeviceConnectListener); } @Override protected void onStart() { super.onStart(); mUSBMonitor.register(); // 注册 USB 监控 } @Override protected void onStop() { super.onStop(); mUSBMonitor.unregister(); // 注销 USB 监控 stopCamera(); } private void stopCamera() { if (mUVCCamera != null) { mUVCCamera.stopPreview(); mUVCCamera.close(); mUVCCamera = null; } } @Override protected void onDestroy() { super.onDestroy(); mUSBMonitor.destroy(); // 销毁资源 }}
核心流程说明
-
检测 USB 设备:通过
USBMonitor
注册监听,当有设备插入时,弹出CameraDialog
让用户授权。 -
打开摄像头:用户授权后,在
onConnect()
中通过UsbControlBlock
打开 UVC 摄像头实例,并设置分辨率与预览格式。 -
开始预览:调用
startPreview()
,把图像输出到你的SurfaceView
或TextureView
。 -
生命周期管理:在
onStart/onStop/onDestroy
中正确注册、注销和销毁USBMonitor
及UVCCamera
。
这样,就可以在 Android Studio 的项目中,通过 USB Host API 调用并预览 USB 摄像头了。
如果需要拍照或录视频,只需进一步调用
mUVCCamera.captureStill()
或 mUVCCamera.startRecording()
等方法即可。