0

After switching to front camera, It's not switching to back camera. Then, If I capture using frontCamera without switching It's opening the back camera. I'm looking for the exact for past 2 weeks.

  private val surfaceTextureListener = object : TextureView.SurfaceTextureListener {
  override fun onSurfaceTextureAvailable(texture: SurfaceTexture, width: Int, height: Int) {
        openCamera(width, height,cameraId)

    }

    override fun onSurfaceTextureSizeChanged(texture: SurfaceTexture, width: Int, height: Int) {
        configureTransform(width, height)
    }

    override fun onSurfaceTextureDestroyed(texture: SurfaceTexture) = true

    override fun onSurfaceTextureUpdated(texture: SurfaceTexture) = Unit

}

private lateinit var cameraId: String

private lateinit var cameraManager: CameraManager

private var isFrontCamera: Boolean = false

  private lateinit var textureView: AutoFitTextureView
  
  private val stateCallback = object : CameraDevice.StateCallback() {

    override fun onOpened(cameraDevice: CameraDevice) {
        cameraOpenCloseLock.release()
        this@ReceiptCaptureFragment.cameraDevice = cameraDevice
        createCameraPreviewSession()

    }

    override fun onDisconnected(cameraDevice: CameraDevice) {
        cameraOpenCloseLock.release()
        cameraDevice.close()
        this@ReceiptCaptureFragment.cameraDevice = null
    }

    override fun onError(cameraDevice: CameraDevice, error: Int) {
        onDisconnected(cameraDevice)
        this@ReceiptCaptureFragment.activity?.finish()
    }

}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    activity?.let {

        file = File(it.cacheDir, PIC_FILE_NAME)
        if (!file.exists()) {
            // Create the new file
            file.createNewFile()
        }
        cameraId = getCameraId()
    }
}

private fun getCameraId(): String {
    cameraManager = requireContext().getSystemService(Context.CAMERA_SERVICE) as CameraManager
    val cameraIds = cameraManager.cameraIdList // get a list of available camera IDs
    for (id in cameraIds) {
        val cameraCharacteristics = cameraManager.getCameraCharacteristics(id)
        val facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)
        if (facing == CameraCharacteristics.LENS_FACING_BACK) {
            return id // return the ID of the first rear-facing camera device
        }
    }
    throw RuntimeException("Unable to find a rear-facing camera device.")
}

private fun openCamera(width: Int , height: Int,cameraId: String) {

    viewModel.hideProgressSpinnerDialog()
    val currentActivity = activity ?: return
    val permission =
        ContextCompat.checkSelfPermission(currentActivity, Manifest.permission.CAMERA)
    if (permission != PackageManager.PERMISSION_GRANTED) {
        requestCameraPermission()
        return
    }

    setUpCameraOutputs(width, height)
    configureTransform(width, height)
    val manager = currentActivity.getSystemService(Context.CAMERA_SERVICE) as CameraManager
    try {
        // Wait for camera to open - 2.5 seconds is sufficient
        if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
            throw RuntimeException("Time out waiting to lock camera opening.")
        }
       manager.openCamera(cameraId, stateCallback, backgroundHandler)
        Log.d(TAG, "current camera device: $cameraId")
    }
    catch(e: CameraAccessException) {
            Timber.e(e.toString())
    }
    catch(e: InterruptedException) {
            throw RuntimeException("Interrupted while trying to lock camera opening.", e)
    }

}

private fun switchCamera() {
    var rearCameraId: String? = null
    var frontCameraId: String? = null

    cameraManager = requireContext().getSystemService(Context.CAMERA_SERVICE) as CameraManager
    val cameraIds = cameraManager.cameraIdList

    for (id in cameraIds) {
        val characteristics = cameraManager.getCameraCharacteristics(id)
        val facing = characteristics.get(CameraCharacteristics.LENS_FACING)
        if (facing == CameraCharacteristics.LENS_FACING_FRONT) {
            frontCameraId = id
        } else if (facing == CameraCharacteristics.LENS_FACING_BACK) {
            rearCameraId = id
        }
        Log.d(TAG, "Camera $id, facing $facing")
    }
    cameraId = if (cameraId == frontCameraId) rearCameraId.toString() else frontCameraId.toString()
    Log.d(TAG, "Front camera id: $frontCameraId, Rear camera id: $rearCameraId")

    // If the current camera is the front camera, switch to the back camera, and vice versa
    if (cameraId != null) {
        closeCamera()
        openCamera(textureView.width, textureView.height, cameraId)
    }
}

These are few importants methods others all existing code & I have checked everything It's working fine.

Vani
  • 1
  • 1

0 Answers0