How can i wait until the moment imageCapture is initialized, i tried using while (imageCapture == null) {}
, but it just crashes the application, using a delay isn’t an option too as i want to take a pic with the back cam too, and it would take too long as sometime it can take some time to initialize
Heres my current code
class MainActivity : AppCompatActivity() {
private var imageCapture: ImageCapture? = null
private lateinit var viewBinding: ActivityMainBinding
private lateinit var outputDirectory: File
private lateinit var cameraExecutor: ExecutorService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
supportActionBar?.hide()
startCamera()
takePhoto()
startCameraBack()
takePhoto()
outputDirectory = getOutputDirectory()
cameraExecutor = Executors.newSingleThreadExecutor()
}
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build()
preview.setSurfaceProvider(findViewById<PreviewView>(R.id.viewFinder).surfaceProvider)
val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
imageCapture = ImageCapture.Builder().build()
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
}, ContextCompat.getMainExecutor(this))
}
private fun takePhoto() {
val imageCapture = imageCapture ?: return
val photoFile = File(
outputDirectory,
SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + ".jpg"
)
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
imageCapture.takePicture(
outputOptions,
ContextCompat.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
var savedUri: Uri = Uri.fromFile(photoFile)
Toast.makeText(this@MainActivity,"Saved to $savedUri", Toast.LENGTH_LONG).show()
}
})
}
private fun getOutputDirectory(): File {
val mediaDir = externalMediaDirs.firstOrNull()?.let {
File(it, resources.getString(R.string.app_name)).apply { mkdirs() }
}
return if (mediaDir != null && mediaDir.exists())
mediaDir else filesDir
}
companion object {
private const val TAG = "CameraXGFG"
private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
}
override fun onDestroy() {
super.onDestroy()
cameraExecutor.shutdown()
}
New contributor
Ryfter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.