三、AndroidUSBCamera开源项目 AndroidUSBCamera基于saki4510t/UVCCamera开发,该项目对USB
Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱动。主要功能包括: (1) 支持USB Camera设备检测,画面实时预览; (2) 支持本地录制mp4格式视频,支持实时获取音视频数据流; (3) 支持jpg格式图片抓拍; (4) 支持获取支持的分辨率类型,和分辨率切换;
(5) 支持屏蔽声音;
(6)支持自动对焦
如何使用AndroidUSBCamera项目

1.添加依赖到本地工程第一步 添加JitPack仓库到工程gradle :
-
allprojects {
-
repositories {
-
...
-
maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }
-
maven { url 'https://jitpack.io' }
-
}
-
}
第二步 添加依赖到app Module的gradle
-
dependencies {
-
compile 'com.github.jiangdongguo:AndroidUSBCamera:v1.2.2'
-
}
2.初始化引擎,注册USB设备事件监听器
-
USBCameraManager mUSBManager = USBCameraManager.getInstance();
-
// mTextureView为UVCCameraTextureView实例,继承于TextureView
-
// 用于渲染图像,需要在xml文件中定义
-
CameraViewInterface mUVCCameraView = (CameraViewInterface) mTextureView;
-
// 初始化引擎,注册事件监听器
-
mUSBManager.init(this, mUVCCameraView, new USBCameraManager.OnMyDevConnectListener() {
-
// 插入USB设备
-
@Override
-
public void onAttachDev(UsbDevice device) {
-
if(mUSBManager == null || mUSBManager.getUsbDeviceCount() == 0){
-
showShortMsg("未检测到USB摄像头设备");
-
return;
-
}
-
// 请求打开摄像头
-
if(! isRequest){
-
isRequest = true;
-
if(mUSBManager != null){
-
mUSBManager.requestPermission(0);
-
}
-
}
-
}
-
-
-
// 拔出USB设备
-
@Override
-
public void onDettachDev(UsbDevice device) {
-
if(isRequest){
-
// 关闭摄像头
-
isRequest = false;
-
mUSBManager.closeCamera();
-
showShortMsg(device.getDeviceName()+"已拨出");
-
}
-
}
-
-
-
// 连接USB设备成功
-
@Override
-
public void onConnectDev(UsbDevice device,boolean isConnected) {
-
if(! isConnected) {
-
showShortMsg("连接失败,请检查分辨率参数是否正确");
-
}
-
}
-
-
-
// 与USB设备断开连接
-
@Override
-
public void onDisConnectDev(UsbDevice device) {
-
-
-
}
-
};
3. 注册USB设备广播事件监听器
-
// 注册USB事件广播监听器
-
if(mUSBManager != null){
-
mUSBManager.registerUSB();
-
}
4. 注销USB设备广播事件监听器
-
// 注销USB事件广播监听器
-
if(mUSBManager != null){
-
mUSBManager.unregisterUSB();
-
}
5. 图片抓拍
-
if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
-
showShortMsg("抓拍异常,摄像头未开启");
-
return;
-
}
-
mUSBManager.capturePicture(picPath);
6. 本地录制(可实时获取音视频数据流)
-
if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
-
showShortMsg("录制异常,摄像头未开启");
-
return;
-
}
-
// 开始录制
-
if( !mUSBManager.isRecording()){
-
mUSBManager.startRecording(videoPath, new AbstractUVCCameraHandler.OnEncodeResultListener() {
-
@Override
-
public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
-
// type=0为音频流,type=1为视频流
-
});
-
}
-
// 停止录制
-
mUSBManager.stopRecording();
7. 切换分辨率
-
mUSBManager.updateResolution(this, mUVCCameraView, 320, 240, new USBCameraManager.OnPreviewListener() {
-
@Override
-
public void onPreviewResult(boolean isSuccess) {
-
if(! isSuccess) {
-
showShortMsg("预览失败,不支持该分辨率");
-
}else {
-
showShortMsg("以切换到分辨率为320x240");
-
}
-
}
-
});
-
List<Size> list = mUSBManager.getSupportedPreviewSizes();
-
// Camera自动对焦
-
mUSBManager.startCameraFoucs();
8. 释放引擎资源
-
// 释放资源
-
if(mUSBManager != null){
-
mUSBManager.release();
-
}
9. 其他API
-
(1) void requestPermission(int index):请求授予开启USB摄像头权限;
-
(2) int getUsbDeviceCount():返回查询到的可用USB Camera数目;
-
(3) boolean isRecording():判断是否正在录制视频;
-
(4) boolean isCameraOpened():判断USB摄像头是否正常打开;
-
(5) void release():释放资源
-
(6) USBMonitor getUSBMonitor():返回USBMonitor实例;
注:在使用Android Studio移植UVCCamera时,很多朋友可能会遇到"open(“/dev/bus/usb/001/002”, O_RDWR, 0),报错,Permission denied"问题,这是由于Android Studio使用的ndk版本所致,建议使用ndk-r14即可。解决方法:local.properties-->指定ndk.dir版本。(注:这里使用的是离线方式)
GitHub源码地址:https://github.com/jiangdongguo/AndroidUSBCamera(如果对您有用,欢迎star&fork以表支持~谢谢^_^!)