diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 8a4543f079eb..c6cd0b6e8be7 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -759,6 +759,7 @@ void CameraDevice::close()
 
 void CameraDevice::stop()
 {
+	MutexLocker cameraLock(cameraMutex_);
 	if (state_ == CameraStopped)
 		return;
 
@@ -1915,17 +1916,21 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 	if (!isValidRequest(camera3Request))
 		return -EINVAL;
 
-	/* Start the camera if that's the first request we handle. */
-	if (state_ == CameraStopped) {
-		worker_.start();
+	{
+		MutexLocker cameraLock(cameraMutex_);
 
-		int ret = camera_->start();
-		if (ret) {
-			LOG(HAL, Error) << "Failed to start camera";
-			return ret;
-		}
+		/* Start the camera if that's the first request we handle. */
+		if (state_ == CameraStopped) {
+			worker_.start();
 
-		state_ = CameraRunning;
+			int ret = camera_->start();
+			if (ret) {
+				LOG(HAL, Error) << "Failed to start camera";
+				return ret;
+			}
+
+			state_ = CameraRunning;
+		}
 	}
 
 	/*
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 30b364decaab..f263fdae472a 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -120,6 +120,7 @@ private:
 
 	CameraWorker worker_;
 
+	libcamera::Mutex cameraMutex_; /* Protects access to the camera state. */
 	State state_;
 
 	std::shared_ptr<libcamera::Camera> camera_;
