diff src/uk/co/ibboard/acetorch/AceTorchActivity.java @ 0:4a66834572d1

First commit of "Ace Torch" project
author IBBoard <dev@ibboard.co.uk>
date Mon, 29 Oct 2012 11:23:36 +0000
parents
children de6a63e771dc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/uk/co/ibboard/acetorch/AceTorchActivity.java	Mon Oct 29 11:23:36 2012 +0000
@@ -0,0 +1,113 @@
+//  This file (AceTorchActivity.java) is a part of the AceTorch project and is copyright 2012 IBBoard
+// 
+// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU GPL, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.
+
+package uk.co.ibboard.acetorch;
+
+import android.app.Activity;
+import android.hardware.Camera;
+import android.hardware.Camera.Parameters;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Toast;
+import android.widget.ToggleButton;
+
+public class AceTorchActivity extends Activity {
+	private Camera _camera;
+
+	/** Called when the activity is first created. */
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.main);
+	}
+
+	public void onToggleClicked(View view) {
+		setLightState();
+	}
+
+	private boolean desiredTorchStateIsOn() {
+		View view = findViewById(R.id.toggleTorch);
+		return ((ToggleButton) view).isChecked();
+	}
+
+	private void setLightState() {
+		if (desiredTorchStateIsOn()) {
+			enableLight();
+		} else {
+			disableLight();
+		}
+	}
+
+	// Correct ordering of the following API calls was a combination of
+	//  1) Pedro Rainho's post (http://stackoverflow.com/a/9751674/283242 - initial "flash mode on" trick)
+	//  2) Sham's post (http://stackoverflow.com/a/10253946/283242 - auto-focus just after start preview)
+	//  3) A reasonable amount of trial and error
+	private void enableLight() {
+
+		initCamera();
+		if (_camera == null) {
+
+			Toast.makeText(this, "Unable to get camera", Toast.LENGTH_LONG);
+			return;
+		}
+
+		_camera.startPreview();
+
+		Parameters params = _camera.getParameters();
+		params.setFlashMode(Parameters.FLASH_MODE_ON);
+		params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
+		_camera.setParameters(params);
+		
+		_camera.startPreview();
+
+		_camera.autoFocus(null/*new AutoFocusCallback() {
+			public void onAutoFocus(boolean success, Camera camera) {
+				// Do nothing, just be a handler
+			}
+		}*/);
+
+		params = _camera.getParameters();
+		params.setFlashMode(Parameters.FLASH_MODE_OFF);
+		_camera.setParameters(params);
+	}
+
+	private void disableLight() {
+		if (_camera != null) {
+			_camera.stopPreview();
+			_camera.release();
+			_camera = null;
+		}
+	}
+
+	@Override
+	protected void onPause() {
+		super.onPause();
+		disableLight();
+	}
+
+	@Override
+	protected void onResume() {
+		setLightState();
+		super.onResume();
+	}
+
+	private void initCamera() {
+		if (_camera == null) {
+			_camera = getCameraInstance();
+		}
+	}
+
+	/** A safe way to get an instance of the Camera object. 
+	 * (Taken from Google documentation) */
+	private static Camera getCameraInstance() {
+		Camera c = null;
+		try {
+			c = Camera.open(); // attempt to get a Camera instance
+		} catch (Exception e) {
+			// Camera is not available (in use or does not exist)
+		}
+		return c; // returns null if camera is unavailable
+	}
+
+}
\ No newline at end of file