I’m trying to create a simple camera app on android, I was following this this (medium.com) guide, but my preview doesn’t load, I only get an empty screen.
Error in logcat:
Unable to configure camera Camera@1931e03[id=0]
java.util.concurrent.TimeoutException: Future[androidx.camera.core.impl.utils.futures.ListFuture@4319722] is not done within 5000 ms.
at androidx.camera.core.impl.utils.futures.Futures.lambda$makeTimeoutFuture$1(Futures.java:437)
at androidx.camera.core.impl.utils.futures.Futures$$ExternalSyntheticLambda7.call(D8$$SyntheticClass:0)
at androidx.camera.core.impl.utils.executor.HandlerScheduledExecutorService$HandlerScheduledFuture.run(HandlerScheduledExecutorService.java:243)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.os.HandlerThread.run(HandlerThread.java:67)
My Main Activity looks like this:
package hu.automatx.android.connect4
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.core.content.ContextCompat
import hu.automatx.android.connect4.ui.theme.Connect4Theme
import hu.automatx.android.connect4.vision.Camera
class MainActivity : ComponentActivity() {
private val cameraPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestPermission()){ isGranted ->
if(isGranted){
setCameraPreview()
} else {
Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
when(PackageManager.PERMISSION_GRANTED){
ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) -> {
setCameraPreview()
} else -> {
cameraPermissionRequest.launch(Manifest.permission.CAMERA)
}
}
enableEdgeToEdge()
}
private fun setCameraPreview(){
setContent {
Connect4Theme {
Surface(modifier = Modifier.fillMaxSize()) {
Camera().CameraPreview()
}
}
}
}
}
My Camera class looks like this:
package hu.automatx.android.connect4.vision
import android.content.Context
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.core.content.ContextCompat
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class Camera(){
@Composable
fun CameraPreview() {
val lensFacing = CameraSelector.LENS_FACING_BACK
val lifecycleOwner = LocalLifecycleOwner.current
val context = LocalContext.current
val preview = Preview.Builder().build()
val previewView = remember{
PreviewView(context)
}
val cameraxSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
LaunchedEffect(lensFacing) {
val cameraProvider = context.getCameraProvider()
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(lifecycleOwner, cameraxSelector, preview)
preview.setSurfaceProvider { previewView.surfaceProvider }
}
}
private suspend fun Context.getCameraProvider(): ProcessCameraProvider =
suspendCoroutine { continuation ->
ProcessCameraProvider.getInstance(this).also{ cameraProvider ->
cameraProvider.addListener({
continuation.resume(cameraProvider.get())
}, ContextCompat.getMainExecutor(this))
}
}
}
I tried changing the CameraX libary versions back to an earlier version, but it didn’t help.
What could be causing this error?
New contributor
zsigmons is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.