diff --git a/src/org/briarproject/qrtest/CameraView.java b/src/org/briarproject/qrtest/CameraView.java
index 0fb0a9351b871eb8482cb5a0c3d26868fadd4bff..dbf50d5963ea71cd471546b93cc63ddd21f4ab86 100644
--- a/src/org/briarproject/qrtest/CameraView.java
+++ b/src/org/briarproject/qrtest/CameraView.java
@@ -161,6 +161,7 @@ AutoFocusCallback {
 	public void surfaceDestroyed(SurfaceHolder holder) {
 		Log.d(TAG, "Surface destroyed");
 		surfaceExists = false;
+		holder.removeCallback(this);
 	}
 
 	public void onAutoFocus(boolean success, final Camera camera) {
diff --git a/src/org/briarproject/qrtest/QrTestActivity.java b/src/org/briarproject/qrtest/QrTestActivity.java
index 3373f782d70c33962b45d55fbddde8df5d3fce02..39a3a909bc9aa25ad81ceab9d10e00126a20e494 100644
--- a/src/org/briarproject/qrtest/QrTestActivity.java
+++ b/src/org/briarproject/qrtest/QrTestActivity.java
@@ -115,10 +115,12 @@ implements QrCodeDecoder.ResultCallback {
 		runOnUiThread(new Runnable() {
 			public void run() {
 				Log.d(TAG, "Got result from decoder");
-				cameraBorder.setVisibility(GONE);
-				tickView.setVisibility(VISIBLE);
-				if(!gotResult) releaseCamera();
-				gotResult = true;
+				if(!gotResult) {
+					gotResult = true;
+					cameraBorder.setVisibility(GONE);
+					tickView.setVisibility(VISIBLE);
+					releaseCamera();
+				}
 			}
 		});
 	}