三、AndroidUSBCamera开源项目
AndroidUSBCamera基于
saki4510t/UVCCamera
开发,该项目对USB Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱动。主要功能包括:
(1) 支持USB Camera设备检测,画面实时预览;
(2) 支持本地录制mp4格式视频,支持实时获取音视频数据流;
(3) 支持jpg格式图片抓拍;
(4) 支持获取支持的分辨率类型,和分辨率切换;
(5) 支持屏蔽声音;
(6)支持自动对焦
如何使用AndroidUSBCamera项目
![](https://img-blog.csdn.net/20171025213631816?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQW5kckV4cGVydA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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();
-
-
- CameraViewInterface mUVCCameraView = (CameraViewInterface) mTextureView;
-
- mUSBManager.init(this, mUVCCameraView, new USBCameraManager.OnMyDevConnectListener() {
-
- @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);
- }
- }
- }
-
-
-
- @Override
- public void onDettachDev(UsbDevice device) {
- if(isRequest){
-
- isRequest = false;
- mUSBManager.closeCamera();
- showShortMsg(device.getDeviceName()+"已拨出");
- }
- }
-
-
-
- @Override
- public void onConnectDev(UsbDevice device,boolean isConnected) {
- if(! isConnected) {
- showShortMsg("连接失败,请检查分辨率参数是否正确");
- }
- }
-
-
-
- @Override
- public void onDisConnectDev(UsbDevice device) {
-
-
- }
- };
3. 注册USB设备广播事件监听器
-
- if(mUSBManager != null){
- mUSBManager.registerUSB();
- }
4. 注销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) {
-
- });
- }
-
- 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();
-
- 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以表支持~谢谢^_^!)