android-ktx icon indicating copy to clipboard operation
android-ktx copied to clipboard

Camera2 Extension

Open Muhannad508 opened this issue 7 years ago • 3 comments

I'd like to propose an extension to get a camera by direction. the implementation would be something like that :

enum class FACING(val direction: Int) {
    FRONT_CAMERA(CameraCharacteristics.LENS_FACING_FRONT), REAR_CAMERA(CameraCharacteristics.LENS_FACING_BACK)
}

@RequiresApi(21)
fun CameraManager.getCameraByDirection(direction: FACING): Pair<String, CameraCharacteristics> {

    for (cameraId in this.cameraIdList) {
        val characteristics = this.getCameraCharacteristics(cameraId)

        val cameraDirection = characteristics.get(CameraCharacteristics.LENS_FACING)
        if (cameraDirection != null && cameraDirection == direction.direction) {
            return Pair(cameraId, characteristics)
        }
    }
    throw RuntimeException("Camera Not Found")
}

Usage :

val manager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
 val (cameraId, cameraCharacteristics) = manager.getCameraByDirection(REAR_CAMERA)

Muhannad508 avatar Mar 28 '18 20:03 Muhannad508

As far as I know, there could be multiple LENS_FACING and LENS_FACING_BACK hardware but we always return the first one. we have to also take LENS_FACING_EXTERNAL into consideration https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#LENS_FACING_EXTERNAL

The Pair return types indicate that we are doing too many at once.

I would suggest separating the implementation into two part.

  1. Get all the Characteristics and return them as a Sequence.
fun CameraManager.getCameraCharacteristics() : Sequence<CameraCharacteristics> =
  cameraIdList.asSequence().map{ getCameraCharacteristics(cameraId) }

Now anyone can use their own algorithm to find the best fitting camera for their usecase. And because Sequence is lazy evaluated it cost less to find the right element.

  1. Extend CameraCharacteristics with is* and isNot* properties. just one example:
val CameraCharacteristics.isFrontCamera: Boolean
    get() {
        val cameraDirection = get(CameraCharacteristics.LENS_FACING)
        return cameraDirection != null && cameraDirection == LENS_FACING_FRONT
    }

kioba avatar Aug 14 '18 07:08 kioba

Thanks @kioba for your inputs . But it seems hardware APIs go beyond the scope of android-ktx . as stated in the below link : #373

Muhannad508 avatar Aug 14 '18 11:08 Muhannad508

@Muhannad508 thanks for the link! That is good to know 👍

kioba avatar Aug 14 '18 12:08 kioba