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)支援調整對比度和亮度
(8) 支援480P、720P、1080P and higher
(9) 支援Android5.0,6.0,7.0,8.0,9.0
如何使用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' }
}
}
第二步 添加依賴到app Module的gradle
Step 2. Add the dependency
dependencies {
compile 'com.github.jiangdongguo:AndroidUSBCamera:1.3.8'
}
注:最新版為2,3,0
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);
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();
}
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();
}
5. 圖檔抓拍
Picture capturing
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();
7. 切換分辨率
update Resulotion
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();
}
9. 添權重限
add permissions
<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++);調整亮度
注:在使用Android Studio移植UVCCamera時,很多朋友可能會遇到"open(“/dev/bus/usb/001/002”, O_RDWR, 0),報錯,Permission denied"問題,這是由于Android Studio使用的ndk版本所緻,建議使用ndk-r14即可。解決方法:local.properties-->指定ndk.dir版本。(注:這裡使用的是離線方式)
最新版為2.3.0,更新時間為2019年6月17日,使用方法請移步Github項目
GitHub源碼位址:https://github.com/jiangdongguo/AndroidUSBCamera(如果對您有用,歡迎star&fork以表支援~謝謝^_^!)
Download APK
In order to display the functions, I develop a simple released apk,which is based on version 2.3.1,and the build version is 28.0.3.Here is my configs and if you have any questions please issues to me ,I will follow it do my best.
ext {
javaSourceCompatibility = JavaVersion.VERSION_1_8
javaTargetCompatibility = JavaVersion.VERSION_1_8
compileSdkVersion = 28
buildToolsVersion = '28.0.3'
minSdkVersion = 21
targetSdkVersion = 28
commonLibVersion= '2.12.4'
}
下載下傳APP:
displaying:
————————————————