Android USB Camera & Jetpack Compose 示例
在 build.gradle 中添加依赖:
implementation(" com.herohan:UVCAndroid:1.0.9" )
使用
@Composable
fun AndroidUsbCamera (usbDevice : UsbDevice ? , modifier : Modifier = Modifier ) {
if (usbDevice == null ) return
val context = LocalContext .current
val surfaceView = remember { SurfaceView (context) }
DisposableEffect (usbDevice) {
val mCameraHelper = CameraHelper ()
mCameraHelper.setStateCallback(object : ICameraHelper .StateCallback {
override fun onAttach (device : UsbDevice ? ) {}
override fun onDeviceOpen (device : UsbDevice ? , isFirstOpen : Boolean ) {}
override fun onCameraOpen (device : UsbDevice ? ) {}
override fun onCameraClose (device : UsbDevice ? ) {}
override fun onDeviceClose (device : UsbDevice ? ) {}
override fun onDetach (device : UsbDevice ? ) {}
override fun onCancel (device : UsbDevice ? ) {}
})
mCameraHelper.selectDevice(usbDevice)
mCameraHelper.openCamera()
mCameraHelper.addSurface(surfaceView.holder.surface, false )
mCameraHelper.startPreview()
onDispose {
mCameraHelper.removeSurface(surfaceView.holder.surface)
mCameraHelper.release()
}
}
AndroidView ({ surfaceView }, modifier)
}
@Composable
fun AndroidUsbCameraDemo (modifier : Modifier = Modifier ) {
val context = LocalContext .current
val mCameraHelper = CameraHelper ()
var usbDevice by remember { mutableStateOf<UsbDevice ?>(null ) }
DisposableEffect (Unit ) {
//
fun setUsbDevice () {
val deviceList = mCameraHelper.deviceList.filter { it.productName == " USB Video" }
usbDevice = deviceList.getOrNull(0 )
}
setUsbDevice()
// 息屏后 亮屏前对应的USB设备的deviceName会发生改变 所以监听亮屏广播 重新获取设备列表
val receiver = object : BroadcastReceiver () {
override fun onReceive (context : Context , intent : Intent ) {
if (intent.action == Intent .ACTION_SCREEN_ON ) {
MainScope ().launch {
delay(2000 )// 亮屏后 重新获取usb设备需要时间
setUsbDevice()
}
}
}
}
context.registerReceiver(receiver, IntentFilter (Intent .ACTION_SCREEN_ON ))
onDispose {
context.unregisterReceiver(receiver)
mCameraHelper.release()
}
}
AndroidUsbCamera (usbDevice, modifier)
}