转载自 裂缝中的阳光dg 的博客
    
     http://blog.csdn.net/andrexpert/article/details/78324181
    
   
      
       AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)开发,该项目对USB Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱动。主要功能包括
      
      :
     
      (1)支持USB Camera设备检测,画面实时预览;
      
      (2)支持本地录制mp4格式视频,支持实时获取音视频数据流;
      
      (3)支持jpg格式图片抓拍;
      
      (4)支持获取camera支持的分辨率,和分辨率切换;
      
      (5)支持屏蔽声音,重启Camera;
      
      (6)支持相机自动对焦;
      
      (7)支持调整对比度和亮度
      
       如何使用AndroidUSBCamera项目
      
      
      
     
      
      
       1. 添加依赖到本地工程
      
      第一步 添加JitPack仓库到工程gradle
      
      Step 1. Add the JitPack repository to your build file
      
      Add it in your root build.gradle at the end of repositories:
     
- allprojects {
- repositories {
- …
- 
        maven { url
 
 ’http://raw.github.com/saki4510t/libcommon/master/repository/’
 
 }
- 
        maven { url
 
 ’https://jitpack.io’
 
 }
- }
- }
allprojects {
repositories {
...
maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }
maven { url 'https://jitpack.io' }
}
}
     第二步 添加依赖到app Module的gradle
     
     Step 2. Add the dependency
- dependencies {
- 
        compile
 
 ’com.github.jiangdongguo:AndroidUSBCamera:1.3.8’
 
- }
dependencies {
compile 'com.github.jiangdongguo:AndroidUSBCamera:1.3.8'
} 
      
       2. 初始化引擎,注册USB设备事件监听器
      
      
      Init AndroidUSBCamera engine,register the USB device event listener
- 
        private USBCameraManager.OnMyDevConnectListener
 
 listener
 
 =
 
 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(“连接失败,请检查分辨率参数是否正确”);
- 
        
 isPreview
 
 =
 
 false
 
 ;
- }else{
- 
        
 isPreview
 
 =
 
 true
 
 ;
- }
- }
- // 与USB设备断开连接
- @Override
- public void onDisConnectDev(UsbDevice device) {
- showShortMsg(“连接失败”);
- }
- };
- 
        
 mUVCCameraView
 
 = (CameraViewInterface) mTextureView;
- mUVCCameraView.setCallback(new CameraViewInterface.Callback() {
- @Override
- public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
- if(!isPreview && mUSBManager.isCameraOpened()) {
- mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCameraHandler.OnPreViewResultListener() {
- @Override
- public void onPreviewResult(boolean result) {
- }
- });
- 
        
 isPreview
 
 =
 
 true
 
 ;
- }
- }
- @Override
- public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {
- }
- @Override
- public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
- if(isPreview && mUSBManager.isCameraOpened()) {
- mUSBManager.stopPreview();
- 
        
 isPreview
 
 =
 
 false
 
 ;
- }
- }
- });
- // 初始化引擎
- 
        
 mUSBManager
 
 =
 
 USBCameraManager
 
 .getInstance();
- mUSBManager.initUSBMonitor(this,listener);
- mUSBManager.createUVCCamera(mUVCCameraView);
   private USBCameraManager.OnMyDevConnectListener listener = 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("连接失败,请检查分辨率参数是否正确");
                isPreview = false;
            }else{
                isPreview = true;
            }
        }
        // 与USB设备断开连接
        @Override
        public void onDisConnectDev(UsbDevice device) {
            showShortMsg("连接失败");
        }
    };
    mUVCCameraView = (CameraViewInterface) mTextureView;
    mUVCCameraView.setCallback(new CameraViewInterface.Callback() {
        @Override
        public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
            if(!isPreview && mUSBManager.isCameraOpened()) {
                 mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCameraHandler.OnPreViewResultListener() {
                 @Override
                 public void onPreviewResult(boolean result) {
                 }
              });
              isPreview = true;
              }
         }
            @Override
            public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {
            }
            @Override
            public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
                if(isPreview && mUSBManager.isCameraOpened()) {
                    mUSBManager.stopPreview();
                    isPreview = false;
                }
            }
        });
        // 初始化引擎
        mUSBManager = USBCameraManager.getInstance();
        mUSBManager.initUSBMonitor(this,listener);
        mUSBManager.createUVCCamera(mUVCCameraView);
     
      3. 注册USB设备广播事件监听器,开始Camera预览
     
     
     Register the USB device broadcast event listener and start the Camera Preview
- 
        
 // 注册USB事件广播监听器
 
- 
        
 if
 
 (mUSBManager !=
 
 null
 
 ){
- mUSBManager.registerUSB();
- }
- 
        
 // 恢复Camera预览
 
- 
        
 if
 
 (mUVCCameraView !=
 
 null
 
 ){
- mUVCCameraView.onResume();
- }
// 注册USB事件广播监听器
if(mUSBManager != null){
      mUSBManager.registerUSB();
}
// 恢复Camera预览
 if(mUVCCameraView != null){
      mUVCCameraView.onResume();
 }     
      
      4. 注销USB设备广播事件监听器,停止Camera预览
     
     
     Unregister the USB device broadcast event listener and stop the Camera Preview
- 
        
 // 注销USB事件广播监听器
 
- 
        
 if
 
 (mUSBManager !=
 
 null
 
 ){
- mUSBManager.unregisterUSB();
- }
- 
        
 // 暂停Camera预览
 
- 
        
 if
 
 (mUVCCameraView !=
 
 null
 
 ){
- mUVCCameraView.onPause();
- }
// 注销USB事件广播监听器
 if(mUSBManager != null){
         mUSBManager.unregisterUSB();
  }
 // 暂停Camera预览
 if(mUVCCameraView != null){
         mUVCCameraView.onPause();
 }
     
      5. 图片抓拍
     
     
     Picture capturing
- 
        
 if
 
 (mUSBManager ==
 
 null
 
 || ! mUSBManager.isCameraOpened()){
- 
        showShortMsg(
 
 ”抓拍异常,摄像头未开启”
 
 );
- 
        
 return
 
 ;
- }
- 
        mUSBManager.capturePicture(picPath,
 
 new
 
 AbstractUVCCameraHandler.OnCaptureListener() {
- 
        
 @Override
 
- 
        
 public
 
 
 void
 
 onCaptureResult(String path) {
- 
        showShortMsg(
 
 ”保存路径:”
 
 +path);
- }
- });
if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
          showShortMsg("抓拍异常,摄像头未开启");
          return;
 }
 mUSBManager.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
          @Override
          public void onCaptureResult(String path) {
               showShortMsg("保存路径:"+path);
          }
 });
     
      6. 本地录制(可实时获取音视频数据流)
     
     
     recoring mp4,and get media real-stream
     
- 
        
 if
 
 (mUSBManager ==
 
 null
 
 || ! mUSBManager.isCameraOpened()){
- 
        showShortMsg(
 
 ”录制异常,摄像头未开启”
 
 );
- 
        
 return
 
 ;
- }
- 
        
 if
 
 (! mUSBManager.isRecording()){
- String videoPath = USBCameraManager.ROOT_PATH+System.currentTimeMillis();
- 
        FileUtils.createfile(FileUtils.ROOT_PATH+
 
 ”test666.h264”
 
 );
- 
        RecordParams params =
 
 new
 
 RecordParams();
- params.setRecordPath(videoPath);
- 
        params.setRecordDuration(
 
 0
 
 );
 
 // 设置为0,不分割保存
 
- 
        params.setVoiceClose(
 
 false
 
 );
 
 // 不屏蔽声音
 
- 
        mUSBManager.startRecording(params,
 
 new
 
 AbstractUVCCameraHandler.OnEncodeResultListener() {
- 
        
 @Override
 
- 
        
 public
 
 
 void
 
 onEncodeResult(
 
 byte
 
 [] data,
 
 int
 
 offset,
 
 int
 
 length,
 
 long
 
 timestamp,
 
 int
 
 type) {
- 
        
 // type = 0,aac格式音频流
 
- 
        
 // type = 1,h264格式视频流
 
- 
        
 if
 
 (type ==
 
 1
 
 ){
- FileUtils.putFileStream(data,offset,length);
- }
- }
- 
        
 @Override
 
- 
        
 public
 
 
 void
 
 onRecordResult(String videoPath) {
- showShortMsg(videoPath);
- }
- });
- 
        
 // 停止录制
 
- mUSBManager.stopRecording();
if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
           showShortMsg("录制异常,摄像头未开启");
           return;
 }
if(! mUSBManager.isRecording()){
                    String videoPath = USBCameraManager.ROOT_PATH+System.currentTimeMillis();
                    FileUtils.createfile(FileUtils.ROOT_PATH+"test666.h264");
                    RecordParams params = new RecordParams();
                    params.setRecordPath(videoPath);
                    params.setRecordDuration(0);    // 设置为0,不分割保存
                    params.setVoiceClose(false);    // 不屏蔽声音
                    mUSBManager.startRecording(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
                        @Override
                        public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
                            // type = 0,aac格式音频流
                            // type = 1,h264格式视频流
                            if(type == 1){
                                FileUtils.putFileStream(data,offset,length);
                            }
                        }
                        @Override
                        public void onRecordResult(String videoPath) {
                            showShortMsg(videoPath);
                        }
                    });
// 停止录制
mUSBManager.stopRecording();
     
      7. 切换分辨率
     
     
     update Resulotion
- 
        mUSBManager.updateResolution(
 
 this
 
 , mUVCCameraView,
 
 320
 
 ,
 
 240
 
 ,
 
 new
 
 USBCameraManager.OnPreviewListener() {
- 
        
 @Override
 
- 
        
 public
 
 
 void
 
 onPreviewResult(
 
 boolean
 
 isSuccess) {
- 
        
 if
 
 (! isSuccess) {
- 
        showShortMsg(
 
 ”预览失败,不支持该分辨率”
 
 );
- 
        }
 
 else
 
 {
- 
        showShortMsg(
 
 ”以切换到分辨率为320×240”
 
 );
- }
- }
- });
- 
        
 // 获取Camera支持得分辨率
 
- List<Size> list = mUSBManager.getSupportedPreviewSizes();
- 
        
 // Camera自动对焦
 
- mUSBManager.startCameraFoucs();
mUSBManager.updateResolution(this, mUVCCameraView, 320, 240, new USBCameraManager.OnPreviewListener() {
             @Override
             public void onPreviewResult(boolean isSuccess) {
                    if(! isSuccess) {
                            showShortMsg("预览失败,不支持该分辨率");
                        }else {
                            showShortMsg("以切换到分辨率为320x240");
                        }
                    }
      });  
 // 获取Camera支持得分辨率  
 List<Size> list = mUSBManager.getSupportedPreviewSizes();
 // Camera自动对焦  
 mUSBManager.startCameraFoucs();
     
      8. 释放引擎资源
     
     
     release resource
     
- 
        
 // 释放资源
 
- 
        
 if
 
 (mUSBManager !=
 
 null
 
 ){
- mUSBManager.release();
- }
// 释放资源
if(mUSBManager != null){
       mUSBManager.release();
 }     
      9. 添加权限
     
     
     add permissions
     
- 
        <uses-permission android:name=
 
 “android.permission.WRITE_EXTERNAL_STORAGE”
 
 />
- 
        <uses-permission android:name=
 
 ”android.permission.RECORD_AUDIO”
 
 />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
     
      USBCameraManager  API (Other)
     
     
- 
        (
 
 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实例;
- 
        (
 
 7
 
 ) mUSBManager.setModelValue(USBCameraManager.MODE_CONTRAST,contrast++); 调整对比度
- 
        (
 
 8
 
 ) mUSBManager.setModelValue(USBCameraManager.MODE_BRIGHTNESS,brightness++);调整亮度
(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实例;
(7) mUSBManager.setModelValue(USBCameraManager.MODE_CONTRAST,contrast++); 调整对比度
(8) mUSBManager.setModelValue(USBCameraManager.MODE_BRIGHTNESS,brightness++);调整亮度
      
       注:在使用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以表支持~谢谢^_^!)
     
                </div>
 
