在 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 中申请权限
<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.CameraViewInterface
android: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 {
@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()
等方法即可。