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 21targetSdkVersion 33}...
}
2. 在 AndroidManifest.xml 中申请权限
<manifest ...><!-- 支持 USB Host --><uses-feature android:name="android.hardware.usb.host" /><!-- 访问 USB 设备权限 --><uses-permission android:name="android.permission.USB_PERMISSION" /><!-- 如果要保存或显示预览到文件/TextureView,可能还需要读写存储权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><application ...><!-- USB 设备连接广播接收器 --><receiver android:name=".UsbReceiver"><intent-filter><action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/><action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"/></intent-filter></receiver>...</application>
</manifest>
3. 布局文件(res/layout/activity_usb_camera.xml)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/preview_container"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 预览 SurfaceView 或 TextureView --><com.serenegiant.usb.widget.CameraViewInterfaceandroid:id="@+id/camera_view"android:layout_width="match_parent"android:layout_height="match_parent" />
</FrameLayout>
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 {@Overridepublic 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() {@Overridepublic void onAttach(UsbDevice device) {// 设备插入时自动弹出选择对话框CameraDialog.showDialog(UsbCameraActivity.this, mUSBMonitor);}@Overridepublic 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) { }};@Overrideprotected 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);}@Overrideprotected void onStart() {super.onStart();mUSBMonitor.register(); // 注册 USB 监控}@Overrideprotected void onStop() {super.onStop();mUSBMonitor.unregister(); // 注销 USB 监控stopCamera();}private void stopCamera() {if (mUVCCamera != null) {mUVCCamera.stopPreview();mUVCCamera.close();mUVCCamera = null;}}@Overrideprotected 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()
等方法即可。