Skip to content
This repository has been archived by the owner on Nov 14, 2018. It is now read-only.

Camera2 Extension #472

Open
Muhannad508 opened this issue Mar 28, 2018 · 3 comments
Open

Camera2 Extension #472

Muhannad508 opened this issue Mar 28, 2018 · 3 comments

Comments

@Muhannad508
Copy link

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)
@kioba
Copy link

kioba commented Aug 14, 2018

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
    }

@Muhannad508
Copy link
Author

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

@kioba
Copy link

kioba commented Aug 14, 2018

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants