From 65093916b78e0a207fb6e005fb6d7d7f23aefea7 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 13 Mar 2024 16:16:43 +0100 Subject: [PATCH 1/2] USB Camera: Use vendor/product, not serial, like pretixPRINT, to avoid permission issues --- .../eu/pretix/libpretixui/android/PhotoCaptureActivity.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt b/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt index 766cb54..3b6092b 100644 --- a/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt +++ b/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt @@ -78,7 +78,9 @@ class PhotoCaptureActivity : CameraDialog.CameraDialogParent, AppCompatActivity( private val onDeviceConnectListener = object : USBMonitor.OnDeviceConnectListener { override fun onAttach(device: UsbDevice) { try { - if (requestedCameraString == "usb:${device.serialNumber}") { + if ("usb:${Integer.toHexString(device.vendorId)}:${Integer.toHexString(device.productId)}" == requestedCameraString) { + usbMonitor!!.requestPermission(device) + } else if (requestedCameraString == "usb:${device.serialNumber}") { // backwards compatibility usbMonitor!!.requestPermission(device) } } catch (e: SecurityException) { @@ -90,7 +92,7 @@ class PhotoCaptureActivity : CameraDialog.CameraDialogParent, AppCompatActivity( override fun onConnect(device: UsbDevice, ctrlBlock: USBMonitor.UsbControlBlock, createNew: Boolean) { releaseUVCCamera() - if (requestedCameraString == "usb:${device.serialNumber}") { + if (requestedCameraString == "usb:${Integer.toHexString(device.vendorId)}:${Integer.toHexString(device.productId)}" || requestedCameraString == "usb:${device.serialNumber}") { runOnUiThread { binding.viewFinder.visibility = View.GONE binding.uvcTexture.visibility = View.VISIBLE @@ -433,7 +435,7 @@ class PhotoCaptureActivity : CameraDialog.CameraDialogParent, AppCompatActivity( override fun onDialogResult(canceled: Boolean, usbDevice: UsbDevice?) { if (!canceled) { - requestedCameraString = "usb:${usbDevice!!.serialNumber}" + requestedCameraString = "usb:${Integer.toHexString(usbDevice!!.vendorId)}:${Integer.toHexString(usbDevice.productId)}" cameraProvider?.unbindAll() } } From 1c57e81c78829e8d9915cf363ccef5af3827ba13 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 15 Mar 2024 16:55:42 +0100 Subject: [PATCH 2/2] Use different hex function --- .../pretix/libpretixui/android/PhotoCaptureActivity.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt b/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt index 3b6092b..96cb85a 100644 --- a/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt +++ b/libpretixui-android/src/main/java/eu/pretix/libpretixui/android/PhotoCaptureActivity.kt @@ -74,11 +74,15 @@ class PhotoCaptureActivity : CameraDialog.CameraDialogParent, AppCompatActivity( private var uvcBitmapCallback: ((Bitmap) -> Unit)? = null val executorService = Executors.newFixedThreadPool(3) + private fun usbDeviceId(device: UsbDevice): String { + return "usb:${String.format("%04x", device.vendorId)}:${String.format("%04x", device.productId)}" + } + private val onDeviceConnectListener = object : USBMonitor.OnDeviceConnectListener { override fun onAttach(device: UsbDevice) { try { - if ("usb:${Integer.toHexString(device.vendorId)}:${Integer.toHexString(device.productId)}" == requestedCameraString) { + if (usbDeviceId(device) == requestedCameraString) { usbMonitor!!.requestPermission(device) } else if (requestedCameraString == "usb:${device.serialNumber}") { // backwards compatibility usbMonitor!!.requestPermission(device) @@ -92,7 +96,7 @@ class PhotoCaptureActivity : CameraDialog.CameraDialogParent, AppCompatActivity( override fun onConnect(device: UsbDevice, ctrlBlock: USBMonitor.UsbControlBlock, createNew: Boolean) { releaseUVCCamera() - if (requestedCameraString == "usb:${Integer.toHexString(device.vendorId)}:${Integer.toHexString(device.productId)}" || requestedCameraString == "usb:${device.serialNumber}") { + if (requestedCameraString == usbDeviceId(device) || requestedCameraString == "usb:${device.serialNumber}") { runOnUiThread { binding.viewFinder.visibility = View.GONE binding.uvcTexture.visibility = View.VISIBLE @@ -435,7 +439,7 @@ class PhotoCaptureActivity : CameraDialog.CameraDialogParent, AppCompatActivity( override fun onDialogResult(canceled: Boolean, usbDevice: UsbDevice?) { if (!canceled) { - requestedCameraString = "usb:${Integer.toHexString(usbDevice!!.vendorId)}:${Integer.toHexString(usbDevice.productId)}" + requestedCameraString = usbDeviceId(usbDevice!!) cameraProvider?.unbindAll() } }