这是一个USB摄像头APP,基于UVCCamera和AndroidUSBCamera。实现了外接USB摄像头的预览与图片保存功能,同时解决了原项目中一些bug和问题。照片会保存到手机根目录下的USBCamera文件夹下,同时也会保存到相册。
项目地址:USBCamera
下载地址:Github、fir.im、蒲公英,密码:1234
此版本弃用了AndroidUSBCamera中的UVCCameraHelper类,只保留了UVCCamera中的核心功能,对无关的代码均做了精简。
其中libusbcamera相机库基于UVCCamera,并添加了USBCameraHelper类简化调用。此外去除了原库中与UI相关的代码,去除了AndoridX依赖。提供了USB相机的连接、预览与图片保存接口。
增加了图像镜像、向左向右旋转,以及预设的四个摄像头角度等功能,适配了外部硬件拍照按钮,同时增加了程序崩溃检测、USB接入设备检测等功能。
此版本基于AndroidUSBCamera,对代码中的一些问题进行了改正,开发了一个拥有分辨率选择、对焦、预览与拍照等功能的实例APP。
将项目源码中的libusbcamera库添加到工程中即可,根据不同的依赖,build.gradle可设置为:
AndroidX依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api "com.serenegiant:common:4.1.1"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
AppCompat依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api "com.serenegiant:common:2.12.4"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
在Activity中添加如下代码,同时在Layout中设置对应的TextureView。
private UVCCameraTextureView mUVCCameraView;
private USBCameraHelper mUSBCameraHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUVCCameraView = (UVCCameraTextureView)findViewById(R.id.camera_view);
mUSBCameraHelper = new USBCameraHelper(this, mUVCCameraView);
}
@Override
protected void onDestroy() {
mUSBCameraHelper.destory();
super.onDestroy();
}
@Override
protected void onStart() {
super.onStart();
mUSBCameraHelper.start();
}
@Override
protected void onStop() {
mUSBCameraHelper.stop();
super.onStop();
}
保存图片使用如下的API即可,调用后会自动在手机Picture目录下USBCamera文件夹,并将图片以时间名保存,同时存储到相册中。
mUSBCameraHelper.saveCapturePicture();
机型 | 系统版本 | 安卓版本 | 是否可用 | 问题描述 |
---|---|---|---|---|
红米Note4x | Lineage16 | Android9 | 是 | 无 |
小米8 | MIUI11 | Android10 | 是 | 无 |
小米9 | MIUI11 | Android10 | 是 | 无 |
荣耀Note10 | EMUI9.1 | Android9 | 是 | 无 |
荣耀V9 | EMUI9.1 | Android9 | 是 | 无 |
荣耀V10 | EMUI9.1 | Android9 | 是 | 无 |
荣耀V20 | MagicUI2.1 | Android9 | 是 | 无 |
荣耀Magic2 | MagicUI2.1 | Android9 | 是 | 无 |
华为MateS | EMUI4.0 | Android6 | 否 | 可检测到摄像头插入,但点击连接后无显示。调试后发现调用SO库时报错,暂未定位到问题 |
华为Mate30 | EMUI10.0 | Android10 | 是 | 无 |
华为M3 | EMUI5.0.4 | Android7 | 是 | 无 |
一加6T | - | Android9 | 是 | 无 |
VIVO X21i | FuntouchOS | Android9 | 否 | 在设置选项中打开OTG后可检测到摄像头,可正确获取分辨率设置,但无画面显示 |
VIVO X23 | FuntouchOS | Android9 | 是 | 需要在设置内找到OTG选项并打开 |
OPPO K5 | ColorOS6.1 | Android9 | 是 | 需要在设置内找到OTG连接选项并打开 |
- 在部分Android9以上版本无法使用
此问题是由于Android9中部分设备的UVC摄像头的ID等信息发生了变化,原作者在源码中已修复此问题。
- 需要手动选择USB设备才可使用
目前构建的APP,可自动寻找USB摄像头并打开。
- Android9中在程序运行时拔出摄像头会导致程序崩溃
根据Github Pull Request #454,重新编译后问题已解决。
- JNI库中存在的内存泄露问题
根据Github Issue #259已修改SO库中的空指针错误,重新编译后问题已解决。
- 解决新版NDK对ABI支持的变动导致JNI编译失败的问题
- 将项目迁移到AndroidX
- 解决Issues #244
- 目前编译的目标SDK版本不能超过27,否则会无法正确获取USB摄像头权限,此问题是由于Android9的API特性更改导致的。如果需要支持,可能需要较多修改。 可参考Pull Request #480