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: 安裝密碼 12345678
displaying: