上干货: 项目链接地址
第一步: 编译生成aar ( 项目里面有 aar 可以直接引用 ABI架构可以根据实际情况调整 减少aar大小)


第二步:引入aar
api(name: "libusbcamera-release", ext: 'aar')

第三步:调用实现
1 ) 注册USB监听广播

2)具体处理根据自己实际业务场景处理

3)具体调用实现
具体实现: 监听USB 热插拔进行处理 监听插入后UsbDevice 的 vid pid 为我们需要设置的相机设备 则进行设置 否者不做处理

调用代码:
private var mCameraHelper: UVCCameraHelper? =null
private var mUVCCameraView: CameraViewInterface? =null
// Usb 热插拔回调
private val onUSBNotifyChannel = androidx.lifecycle.Observer{
setCameraParameter(it.insert)
}
private fun setHdmiNotifyChannel() {
LiveDataBus.get().of(QEventCallBack::class.java).onUSBNotifyChannel()
.observeForever(onUSBNotifyChannel)
}
/**
*
* @description 监听Usb插拔 判断usbdevice 是否为 enheylig相机 是该相机则设置 对比度饱和度
* @param insert 是否为插入
* @return
* @author as752497576@gmail.com
* @time 2023/2/16 17:23
*/
private var insertTime: Long =0
private fun setCameraParameter(insert: Boolean) {
if (mCameraHelper !=null) {// 释放
mCameraHelper?.release()
mCameraHelper =null
}
AppLog.getInstance()
.i("setCameraParameter = fail to connect,please check onAttachDev localClassName = ${ActivityUtil.getInstance().current.localClassName} localClassName = ${this.localClassName} ")
if (!TextUtils.equals(// 仅 在当前界面做操作
ActivityUtil.getInstance().current.localClassName,
this.localClassName
)
)return
if (!insert) {// 拔不做操作
return
}
if (abs(insertTime - System.currentTimeMillis()) <1000) {
// 1s 间隔 目前硬件USB 热插拔回调慢 可不判断
return
}
insertTime = System.currentTimeMillis()
if (mCameraHelper ==null) {
mUVCCameraView = camera_view;
mUVCCameraView?.setCallback(this)
mCameraHelper = UVCCameraHelper.getInstance(1920, 1080);
mCameraHelper?.setDefaultFrameFormat(UVCCameraHelper.FRAME_FORMAT_MJPEG)
mCameraHelper?.initUSBMonitor(
this,
mUVCCameraView,
object : UVCCameraHelper.OnMyDevConnectListener {
override fun onAttachDev(device: UsbDevice?) {
if (device?.productId ==51202 && device?.vendorId ==41224) {//是否为 enheylig相机
// 请求开启相机
AppLog.getInstance()
.i("setCameraParameter = fail to connect,please check onAttachDev device?.requestPermission = ${ mCameraHelper?.requestPermission(0)} ")
}
AppLog.getInstance()
.i("setCameraParameter = fail to connect,please check onAttachDev device?.productId = ${device?.productId} device?.vendorId = ${device?.vendorId} ")
}
override fun onDettachDev(device: UsbDevice?) {
AppLog.getInstance()
.i("setCameraParameter = fail to connect,please check onDettachDev")
mCameraHelper?.closeCamera()
}
override fun onConnectDev(device: UsbDevice?, isConnected: Boolean) {
AppLog.getInstance()
.i("setCameraParameter =fail to connect,please check onConnectDev $isConnected")
if (device?.productId ==51202 && device?.vendorId ==41224) {//是否为 enheylig相机 作者邮箱:752497576@qq.com
setCamera()
}
}
override fun onDisConnectDev(device: UsbDevice?) {
}
})
mCameraHelper?.registerUSB()
}
}
/**
*
* @description 设置相机 饱和度 对比度
* @author as752497576@gmail.com
* @time 2023/2/16 17:22
*/
private fun setCamera() {
tv_create.postDelayed({
AppLog.getInstance()
.i("setCameraParameter = fail to connect, setCameraParameter ${mCameraHelper?.isCameraOpened} ")
if (mCameraHelper !=null &&mCameraHelper?.isCameraOpened ==true) {
mCameraHelper?.setModelValue(// 72 = 145
UVCCameraHelper.MODE_CONTRAST, 72
)
mCameraHelper?.setModelValue(// 59 = 150
UVCCameraHelper.PU_SATURATION, 59
)
}
if (mCameraHelper !=null) {
mCameraHelper?.release()
mCameraHelper =null
}
}, 1000)
}
第四步 : 注意事项 (PS:重要 !!!!)
1) 设置饱和度对比度 需要依赖 UVCCameraTextureView 的渲染 mCameraHelper?.isCameraOpened 目前我们做的处理是绘制到屏幕外面 有更好方案欢迎留言交流
<FrameLayout
android:layout_marginTop="-1500dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.serenegiant.usb.widget.UVCCameraTextureView
android:id="@+id/camera_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout>
2)关于对比度饱和度设置 (PS: 如需设置其它值 请参照 该设置去 源码: UVCCameraHelper中 定义枚举值 在AbstractUVCCameraHandler类 setValue方法中定义需要设置的具体参数 实在不知可联系作者:752497576@qq.com )
具体设置方法如下:
mCameraHelper?.setModelValue(// 72 = 145UVCCameraHelper.MODE_CONTRAST, 72
)
mCameraHelper?.setModelValue(// 59 = 150
UVCCameraHelper.PU_SATURATION, 59
)
3)设置具体数值换算 :


4) release 打包混淆 需注意 混淆代码如下:
#uvc 混淆
-dontwarncom.serenegiant.**
-keep public class com.serenegiant.**{*;}
-dontwarncom.jiangdg.**
-keep public class com.jiangdg.**{*;}
-dontwarnorg.easydarwin.**
-keep public class org.easydarwin.**{*;}
-keepclassmembers class com.serenegiant.usb.USBMonitor {
public *;
private *;
}
创作不易 ,有助于您,还请点赞支持,谢谢。
网友评论