Is there any official Android library to access an external USB camera?
I have gone through all the Android camera samples, but I couldn’t get my external USB camera to be detected or listed with the following code. I also checked other libraries like saki4510t/UVCCamera and jiangdongguo/AndroidUSBCamera, but they are either outdated or not working. The official Android documentation on external USB cameras does not provide a proper way to implement it in Kotlin or Java. I couldn’t find the latest documentation on this.
I tried integrating it myself, but it’s not working. Here’s the code I used:
private fun requestUsbPermissions() {
val usbManager = getSystemService(Context.USB_SERVICE) as UsbManager
val deviceList = usbManager.deviceList
val deviceIterator = deviceList.values.iterator()
while (deviceIterator.hasNext()) {
val device = deviceIterator.next()
if (!usbManager.hasPermission(device)) {
val permissionIntent = PendingIntent.getBroadcast(
this, 0, Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE
)
usbManager.requestPermission(device, permissionIntent)
} else {
listAvailableCameras()
}
}
}
private val usbReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
if (ACTION_USB_PERMISSION == action) {
synchronized(this) {
val device = intent.getParcelableExtra<UsbDevice>(UsbManager.EXTRA_DEVICE)
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
device?.let {
listAvailableCameras() // Refresh camera listing
}
} else {
}
}
} else if (UsbManager.ACTION_USB_DEVICE_ATTACHED == action) {
requestUsbPermissions()
} else if (UsbManager.ACTION_USB_DEVICE_DETACHED == action) {
}
}
}
private fun listAvailableCameras() {
try {
val cameraIdList = cameraManager.cameraIdList
for (cameraId in cameraIdList) {
val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val facing = characteristics.get(CameraCharacteristics.LENS_FACING)
logCameraCharacteristics(characteristics, cameraId)
if (facing == CameraCharacteristics.LENS_FACING_EXTERNAL) {
selectedCameraId = cameraId
return
}
}
// Default to internal camera
selectedCameraId = cameraIdList.firstOrNull() ?: throw CameraAccessException(CameraAccessException.CAMERA_ERROR)
} catch (e: CameraAccessException) {
e.printStackTrace()
}
}
private fun logCameraCharacteristics(characteristics: CameraCharacteristics, cameraId: String) {
val facing = characteristics.get(CameraCharacteristics.LENS_FACING)
val facingStr = when (facing) {
CameraCharacteristics.LENS_FACING_FRONT -> "FRONT"
CameraCharacteristics.LENS_FACING_BACK -> "BACK"
CameraCharacteristics.LENS_FACING_EXTERNAL -> "EXTERNAL"
else -> "UNKNOWN"
}
val outputFormats = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)?.outputFormats
val fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES)
}
private fun openCamera(cameraId: String) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return
}
try {
cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) {
cameraDevice = camera
startCameraPreview()
}
override fun onDisconnected(camera: CameraDevice) {
camera.close()
}
override fun onError(camera: CameraDevice, error: Int) {
camera.close()
}
}, backgroundHandler)
} catch (e: CameraAccessException) {
e.printStackTrace()
}
}
This is the error I am getting:
2024-07-01 13:51:09.578 27203-27373 Perf com.aditya.androidcamera E getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2024-07-01 13:51:09.580 27203-27373 Perf com.aditya.androidcamera E Fail to get file list com.aditya.androidcamera
2024-07-01 13:51:09.580 27203-27373 Perf com.aditya.androidcamera E getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2024-07-01 13:51:09.630 27203-27203 AppCompatDelegate com.aditya.androidcamera D Checking for metadata for AppLocalesMetadataHolderService : Service not found
2024-07-01 13:51:09.685 27203-27203 a.androidcamer com.aditya.androidcamera W Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
2024-07-01 13:51:09.689 27203-27203 MainActivity com.aditya.androidcamera I Listing available cameras...
2024-07-01 13:51:09.690 27203-27203 CameraManagerGlobal com.aditya.androidcamera I Connecting to camera service
2024-07-01 13:51:09.698 27203-27203 MainActivity com.aditya.androidcamera I Camera ID: 0, Facing: BACK
2024-07-01 13:51:09.736 27203-27203 MainActivity com.aditya.androidcamera I Supported FPS Ranges: [1, 10], [10, 10], [1, 15], [15, 15], [1, 30], [30, 30]
2024-07-01 13:51:09.737 27203-27203 MainActivity com.aditya.androidcamera I Supported Output Formats: 256, 34, 35
2024-07-01 13:51:09.739 27203-27203 MainActivity com.aditya.androidcamera I Camera ID: 1, Facing: FRONT
2024-07-01 13:51:09.740 27203-27203 MainActivity com.aditya.androidcamera I Supported FPS Ranges: [1, 10], [10, 10], [1, 15], [15, 15], [1, 30], [30, 30]
2024-07-01 13:51:09.740 27203-27203 MainActivity com.aditya.androidcamera I Supported Output Formats: 256, 34, 35
2024-07-01 13:51:09.740 27203-27203 MainActivity com.aditya.androidcamera I Selected internal camera: 0
2024-07-01 13:51:09.787 27203-27376 AdrenoGLES com.aditya.androidcamera I PFP: 0x016ee187, ME: 0x00000000
2024-07-01 13:51:09.788 27203-27376 AdrenoUtils com.aditya.androidcamera W <ReadGpuID_from_sysfs:194>: Failed to open /sys/class/kgsl/kgsl-3d0/gpu_model
2024-07-01 13:51:09.788 27203-27376 AdrenoUtils com.aditya.androidcamera W <ReadGpuID:218>: Failed to read chip ID from gpu_model. Fallback to use the GSL path
2024-07-01 13:51:09.799 27203-27203 MainActivity com.aditya.androidcamera I Opening camera with ID: 0
2024-07-01 13:51:09.803 27203-27203 libc com.aditya.androidcamera E Access denied finding property "persist.vendor.camera.privapp.list"
Questions:
-
Is there any official or recommended library to handle USB cameras in Android?
-
Why isn’t my external USB camera being detected or listed with the above code? Am I missing any specific permissions or configurations?
-
Are there any comprehensive guides or up-to-date libraries for integrating external USB cameras in Android?
Aditya Kumar Singh is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.