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.