diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/CameraView.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/CameraView.java
index b3d1b9345c6b7e21f15cc1860bdb791227d13527..3b0003fa82b55eb1c3ac252d442b349c8b8c167d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/CameraView.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/CameraView.java
@@ -13,6 +13,7 @@ import android.util.AttributeSet;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
+import android.view.View;
 
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
@@ -38,18 +39,21 @@ import static java.util.logging.Level.WARNING;
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
 public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
-		AutoFocusCallback {
+		AutoFocusCallback, View.OnClickListener {
 
 	private static final int AUTO_FOCUS_RETRY_DELAY = 5000; // Milliseconds
 	private static final Logger LOG =
 			Logger.getLogger(CameraView.class.getName());
 
+	private final Runnable autoFocusRetry = this::retryAutoFocus;
+
 	@Nullable
 	private Camera camera = null;
 	private PreviewConsumer previewConsumer = null;
 	private Surface surface = null;
 	private int displayOrientation = 0, surfaceWidth = 0, surfaceHeight = 0;
-	private boolean previewStarted = false, autoFocus = false;
+	private boolean previewStarted = false;
+	private boolean autoFocusSupported = false, autoFocusRunning = false;
 
 	public CameraView(Context context) {
 		super(context);
@@ -74,6 +78,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
 		super.onAttachedToWindow();
 		setKeepScreenOn(true);
 		getHolder().addCallback(this);
+		setOnClickListener(this);
 	}
 
 	@Override
@@ -157,27 +162,41 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
 	@UiThread
 	private void startConsumer() throws CameraException {
 		if (camera == null) throw new CameraException("Camera is null");
-		if (autoFocus) {
+		startAutoFocus();
+		previewConsumer.start(camera);
+	}
+
+	@UiThread
+	private void startAutoFocus() throws CameraException {
+		if (camera != null && autoFocusSupported && !autoFocusRunning) {
 			try {
+				removeCallbacks(autoFocusRetry);
 				camera.autoFocus(this);
+				autoFocusRunning = true;
 			} catch (RuntimeException e) {
 				throw new CameraException(e);
 			}
 		}
-		previewConsumer.start(camera);
 	}
 
 	@UiThread
 	private void stopConsumer() throws CameraException {
 		if (camera == null) throw new CameraException("Camera is null");
-		if (autoFocus) {
+		cancelAutoFocus();
+		previewConsumer.stop();
+	}
+
+	@UiThread
+	private void cancelAutoFocus() throws CameraException {
+		if (camera != null && autoFocusSupported && autoFocusRunning) {
 			try {
+				removeCallbacks(autoFocusRetry);
 				camera.cancelAutoFocus();
+				autoFocusRunning = false;
 			} catch (RuntimeException e) {
 				throw new CameraException(e);
 			}
 		}
-		previewConsumer.stop();
 	}
 
 	@UiThread
@@ -325,7 +344,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
 
 	@UiThread
 	private void enableAutoFocus(String focusMode) {
-		autoFocus = FOCUS_MODE_AUTO.equals(focusMode) ||
+		autoFocusSupported = FOCUS_MODE_AUTO.equals(focusMode) ||
 				FOCUS_MODE_MACRO.equals(focusMode);
 	}
 
@@ -427,16 +446,23 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
 
 	@Override
 	public void onAutoFocus(boolean success, Camera camera) {
-		LOG.info("Auto focus succeeded: " + success);
-		postDelayed(this::retryAutoFocus, AUTO_FOCUS_RETRY_DELAY);
+		if (LOG.isLoggable(INFO))
+			LOG.info("Auto focus succeeded: " + success);
+		autoFocusRunning = false;
+		postDelayed(autoFocusRetry, AUTO_FOCUS_RETRY_DELAY);
 	}
 
 	@UiThread
 	private void retryAutoFocus() {
 		try {
-			if (camera != null) camera.autoFocus(this);
-		} catch (RuntimeException e) {
-			LOG.log(WARNING, "Error retrying auto focus", e);
+			startAutoFocus();
+		} catch (CameraException e) {
+			LOG.log(WARNING, e.toString(), e);
 		}
 	}
+
+	@Override
+	public void onClick(View v) {
+		retryAutoFocus();
+	}
 }
\ No newline at end of file