Camera.java revision bfcbeffc54e93b1c2e2d95fdc301786df4376d6f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.hardware; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Liimport java.util.ArrayList; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Liimport java.util.List; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.StringTokenizer; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder; 29a696f5d667227365da732481770767dcb330dd23Mathias Agopianimport android.graphics.ImageFormat; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 35bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * The Camera class is used to set image capture settings, start/stop preview, 36bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * snap pictures, and retrieve frames for encoding for video. This class is a 37bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * client for the Camera service, which manages the actual camera hardware. 38df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * 39bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>To access the device camera, you must declare the 407478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * {@link android.Manifest.permission#CAMERA} permission in your Android 41df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * Manifest. Also be sure to include the 42df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><uses-feature></a> 43bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * manifest element to declare camera features used by your application. 447478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * For example, if you use the camera and auto-focus feature, your Manifest 45df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * should include the following:</p> 46df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * <pre> <uses-permission android:name="android.permission.CAMERA" /> 47df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * <uses-feature android:name="android.hardware.camera" /> 48df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * <uses-feature android:name="android.hardware.camera.autofocus" /></pre> 49df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * 50bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>To take pictures with this class, use the following steps:</p> 51bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 52bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <ol> 53bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>Obtain an instance of Camera from {@link #open()}. 54bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 55bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>Get existing (default) settings with {@link #getParameters()}. 56bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 57bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>If necessary, modify the returned {@link Camera.Parameters} object and call 58bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setParameters(Camera.Parameters)}. 59bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 60bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>If desired, call {@link #setDisplayOrientation(int)}. 61bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 62bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li><b>Important</b>: Pass a fully initialized {@link SurfaceHolder} to 63bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setPreviewDisplay(SurfaceHolder)}. Without a surface, the camera 64bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * will be unable to start the preview. 65bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 66bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li><b>Important</b>: Call {@link #startPreview()} to start updating the 67bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * preview surface. Preview must be started before you can take a picture. 68bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 69bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>When you want, call {@link #takePicture(Camera.ShutterCallback, 70bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)} to 71bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * capture a photo. Wait for the callbacks to provide the actual image data. 72bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 73bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>After taking a picture, preview display will have stopped. To take more 74bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * photos, call {@link #startPreview()} again first. 75bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 76bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>Call {@link #stopPreview()} to stop updating the preview surface. 77bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 78bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li><b>Important:</b> Call {@link #release()} to release the camera for 79bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * use by other applications. Applications should release the camera 80bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * immediately in {@link android.app.Activity#onPause()} (and re-{@link #open()} 81bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * it in {@link android.app.Activity#onResume()}). 82bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * </ol> 83bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 84bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>To quickly switch to video recording mode, use these steps:</p> 85bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 86bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <ol> 87bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>Obtain and initialize a Camera and start preview as described above. 88bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 89bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>Call {@link #unlock()} to allow the media process to access the camera. 90bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 91bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>Pass the camera to {@link android.media.MediaRecorder#setCamera(Camera)}. 92bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * See {@link android.media.MediaRecorder} information about video recording. 93bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 94bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>When finished recording, call {@link #reconnect()} to re-acquire 95bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * and re-lock the camera. 96bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 97bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>If desired, restart preview and take more photos or videos. 98bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 99bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <li>Call {@link #stopPreview()} and {@link #release()} as described above. 100bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * </ol> 101bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 102bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>This class is not thread-safe, and is meant for use from one event thread. 103bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Most long-running operations (preview, focus, photo capture, etc) happen 104bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * asynchronously and invoke callbacks as necessary. Callbacks will be invoked 105bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * on the event thread {@link #open()} was called from. This class's methods 106bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * must never be called from multiple threads at once.</p> 107bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 108df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * <p class="caution"><strong>Caution:</strong> Different Android-powered devices 109df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * may have different hardware specifications, such as megapixel ratings and 110df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * auto-focus capabilities. In order for your application to be compatible with 1117478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * more devices, you should not make assumptions about the device camera 112df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * specifications.</p> 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Camera { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "Camera"; 1169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 117c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks // These match the enums in frameworks/base/include/ui/Camera.h 118da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_ERROR = 0x001; 119da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_SHUTTER = 0x002; 120da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_FOCUS = 0x004; 121da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_ZOOM = 0x008; 122da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_PREVIEW_FRAME = 0x010; 123da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_VIDEO_FRAME = 0x020; 124da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_POSTVIEW_FRAME = 0x040; 125da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_RAW_IMAGE = 0x080; 126da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_COMPRESSED_IMAGE = 0x100; 127da83f4674a564007baac03db062a289c8158d940Benny Wong private static final int CAMERA_MSG_ALL_MSGS = 0x1FF; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNativeContext; // accessed by native methods 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private EventHandler mEventHandler; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ShutterCallback mShutterCallback; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PictureCallback mRawImageCallback; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PictureCallback mJpegCallback; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PreviewCallback mPreviewCallback; 135e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks private PictureCallback mPostviewCallback; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AutoFocusCallback mAutoFocusCallback; 1373f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li private OnZoomChangeListener mZoomListener; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ErrorCallback mErrorCallback; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOneShot; 14094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp private boolean mWithBuffer; 1419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 143bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Creates a new Camera object. 144bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 145bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>You must call {@link #release()} when you are done using the camera, 146bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * otherwise it will remain locked and be unavailable to other applications. 147bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 148bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>Your application should only have one Camera object active at a time. 149bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 150bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>Callbacks from other methods are delivered to the event loop of the 151bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * thread which called open(). If this thread has no event loop, then 152bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * callbacks are delivered to the main application event loop. If there 153bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * is no main application event loop, callbacks are not delivered. 154bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 155bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p class="caution"><b>Caution:</b> On some devices, this method may 156bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * take a long time to complete. It is best to call this method from a 157bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * worker thread (possibly using {@link android.os.AsyncTask}) to avoid 158bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * blocking the main application UI thread. 159bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 160bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @return a new Camera object, connected, locked and ready for use. 161bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @throws RuntimeException if connection to the camera service fails (for 162bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * example, if the camera is in use by another process). 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static Camera open() { 1659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return new Camera(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Camera() { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShutterCallback = null; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawImageCallback = null; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mJpegCallback = null; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreviewCallback = null; 173e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks mPostviewCallback = null; 1743f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li mZoomListener = null; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper looper; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((looper = Looper.myLooper()) != null) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEventHandler = new EventHandler(this, looper); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((looper = Looper.getMainLooper()) != null) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEventHandler = new EventHandler(this, looper); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEventHandler = null; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_setup(new WeakReference<Camera>(this)); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 1889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li protected void finalize() { 1899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li native_release(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_setup(Object camera_this); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_release(); 1949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disconnects and releases the Camera object resources. 198bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 199bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>You must call this as soon as you're done with the Camera object.</p> 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public final void release() { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_release(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 206bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Unlocks the camera to allow another process to access it. 207bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Normally, the camera is locked to the process with an active Camera 208bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * object until {@link #release()} is called. To allow rapid handoff 209bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * between processes, you can call this method to release the camera 210bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * temporarily for another process to use; once the other process is done 211bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * you can call {@link #reconnect()} to reclaim the camera. 212bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 213bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>This must be done before calling 214bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link android.media.MediaRecorder#setCamera(Camera)}. 215bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 216bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>If you are not recording video, you probably do not need this method. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 218bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @throws RuntimeException if the camera cannot be unlocked. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 220bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor public native final void unlock(); 2219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 223bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Re-locks the camera to prevent other processes from accessing it. 224bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Camera objects are locked by default unless {@link #unlock()} is 225bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * called. Normally {@link #reconnect()} is used instead. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 227bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>If you are not recording video, you probably do not need this method. 228bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 229bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @throws RuntimeException if the camera cannot be re-locked (for 230bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * example, if the camera is still in use by another process). 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 232ffe1cf251a4f8469695b8acfa37270684dc1b70cWu-cheng Li public native final void lock(); 2339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 235bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Reconnects to the camera service after another process used it. 236bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * After {@link #unlock()} is called, another process may use the 237bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * camera; when the process is done, you must reconnect to the camera, 238bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * which will re-acquire the lock and allow you to continue using the 239bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * camera. 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 241bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>This must be done after {@link android.media.MediaRecorder} is 242bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * done recording if {@link android.media.MediaRecorder#setCamera(Camera)} 243bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * was used. 244bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 245bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>If you are not recording video, you probably do not need this method. 246bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 247bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @throws IOException if a connection cannot be re-established (for 248bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * example, if the camera is still in use by another process). 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 250bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor public native final void reconnect() throws IOException; 2519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 253bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Sets the {@link Surface} to be used for live preview. 254bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * A surface is necessary for preview, and preview is necessary to take 255bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * pictures. The same surface can be re-set without harm. 2569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 257bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>The {@link SurfaceHolder} must already contain a surface when this 258bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * method is called. If you are using {@link android.view.SurfaceView}, 259bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * you will need to register a {@link SurfaceHolder.Callback} with 260bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link SurfaceHolder#addCallback(SurfaceHolder.Callback)} and wait for 261bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link SurfaceHolder.Callback#surfaceCreated(SurfaceHolder)} before 262bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * calling setPreviewDisplay() or starting preview. 263bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 264bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>This method must be called before {@link #startPreview()}. The 265bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * one exception is that if the preview surface is not set (or set to null) 266bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * before startPreview() is called, then this method may be called once 267bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * with a non-null parameter to set the preview surface. (This allows 268bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * camera setup and surface creation to happen in parallel, saving time.) 269bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * The preview surface may not otherwise change while preview is running. 270bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 271bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param holder containing the Surface on which to place the preview, 272bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * or null to remove the preview surface 273bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @throws IOException if the method fails (for example, if the surface 274bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * is unavailable or unsuitable). 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setPreviewDisplay(SurfaceHolder holder) throws IOException { 277b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li if (holder != null) { 278b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li setPreviewDisplay(holder.getSurface()); 279b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li } else { 280b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li setPreviewDisplay((Surface)null); 281b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void setPreviewDisplay(Surface surface); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 287bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Callback interface used to deliver copies of preview frames as 288bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * they are displayed. 289bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 290bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #setPreviewCallback(Camera.PreviewCallback) 291bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #setOneShotPreviewCallback(Camera.PreviewCallback) 292bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #setPreviewCallbackWithBuffer(Camera.PreviewCallback) 293bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #startPreview() 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface PreviewCallback 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 298bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Called as preview frames are displayed. This callback is invoked 299bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * on the event thread {@link #open()} was called from. 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 301bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param data the contents of the preview frame in the format defined 302a696f5d667227365da732481770767dcb330dd23Mathias Agopian * by {@link android.graphics.ImageFormat}, which can be queried 303df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * with {@link android.hardware.Camera.Parameters#getPreviewFormat()}. 304da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main * If {@link android.hardware.Camera.Parameters#setPreviewFormat(int)} 3059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * is never called, the default will be the YCbCr_420_SP 3069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * (NV21) format. 307bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param camera the Camera service object. 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onPreviewFrame(byte[] data, Camera camera); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 313bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Starts capturing and drawing preview frames to the screen. 314bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Preview will not actually start until a surface is supplied with 315bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setPreviewDisplay(SurfaceHolder)}. 316bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 317bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>If {@link #setPreviewCallback(Camera.PreviewCallback)}, 318bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setOneShotPreviewCallback(Camera.PreviewCallback)}, or 319bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setPreviewCallbackWithBuffer(Camera.PreviewCallback)} were 320bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * called, {@link Camera.PreviewCallback#onPreviewFrame(byte[], Camera)} 321bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * will be called when preview data becomes available. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native final void startPreview(); 3249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 326bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Stops capturing and drawing preview frames to the surface, and 327bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * resets the camera for a future call to {@link #startPreview()}. 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native final void stopPreview(); 3309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return current preview state. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FIXME: Unhide before release 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native final boolean previewEnabled(); 3389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 340bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Installs a callback to be invoked for every preview frame in addition 341bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * to displaying them on the screen. The callback will be repeatedly called 342bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * for as long as preview is active. This method can be called at any time, 343bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * even while preview is live. Any other preview callbacks are overridden. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 345bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param cb a callback object that receives a copy of each preview frame, 346bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * or null to stop receiving callbacks. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setPreviewCallback(PreviewCallback cb) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreviewCallback = cb; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOneShot = false; 35194927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp mWithBuffer = false; 352a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // Always use one-shot mode. We fake camera preview mode by 353a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // doing one-shot preview continuously. 35494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp setHasPreviewCallback(cb != null, false); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 358bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Installs a callback to be invoked for the next preview frame in addition 359bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * to displaying it on the screen. After one invocation, the callback is 360bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * cleared. This method can be called any time, even when preview is live. 361bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Any other preview callbacks are overridden. 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 363bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param cb a callback object that receives a copy of the next preview frame, 364bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * or null to stop receiving callbacks. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setOneShotPreviewCallback(PreviewCallback cb) { 36794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp mPreviewCallback = cb; 36894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp mOneShot = true; 36994927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp mWithBuffer = false; 37094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp setHasPreviewCallback(cb != null, false); 37194927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp } 37294927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp 37394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp private native final void setHasPreviewCallback(boolean installed, boolean manualBuffer); 37494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp 37594927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp /** 376bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Installs a callback to be invoked for every preview frame, using buffers 377bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * supplied with {@link #addCallbackBuffer(byte[])}, in addition to 378bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * displaying them on the screen. The callback will be repeatedly called 379bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * for as long as preview is active and buffers are available. 380bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Any other preview callbacks are overridden. 38194927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp * 382bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>The purpose of this method is to improve preview efficiency and frame 383bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * rate by allowing preview frame memory reuse. You must call 384bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #addCallbackBuffer(byte[])} at some point -- before or after 385bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * calling this method -- or no callbacks will received. 38694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp * 387bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * The buffer queue will be cleared if this method is called with a null 388bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * callback, {@link #setPreviewCallback(Camera.PreviewCallback)} is called, 389bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * or {@link #setOneShotPreviewCallback(Camera.PreviewCallback)} is called. 39094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp * 391bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param cb a callback object that receives a copy of the preview frame, 392bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * or null to stop receiving callbacks and clear the buffer queue. 393bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #addCallbackBuffer(byte[]) 39494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp */ 39594927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp public final void setPreviewCallbackWithBuffer(PreviewCallback cb) { 39694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp mPreviewCallback = cb; 39794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp mOneShot = false; 39894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp mWithBuffer = true; 39994927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp setHasPreviewCallback(cb != null, true); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40294927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp /** 4033f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * Adds a pre-allocated buffer to the preview callback buffer queue. 4043f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * Applications can add one or more buffers to the queue. When a preview 405bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * frame arrives and there is still at least one available buffer, the 406bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * buffer will be used and removed from the queue. Then preview callback is 407bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * invoked with the buffer. If a frame arrives and there is no buffer left, 408bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * the frame is discarded. Applications should add buffers back when they 409bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * finish processing the data in them. 410c10275abd6a494c93a025f683dde104a5d4f2793Wu-cheng Li * 411bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>The size of the buffer is determined by multiplying the preview 412bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * image width, height, and bytes per pixel. The width and height can be 413bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * read from {@link Camera.Parameters#getPreviewSize()}. Bytes per pixel 414bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * can be computed from 415bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link android.graphics.ImageFormat#getBitsPerPixel(int)} / 8, 416bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * using the image format from {@link Camera.Parameters#getPreviewFormat()}. 41794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp * 418bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>This method is only necessary when 419bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setPreviewCallbackWithBuffer(PreviewCallback)} is used. When 420bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setPreviewCallback(PreviewCallback)} or 421bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #setOneShotPreviewCallback(PreviewCallback)} are used, buffers 422bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * are automatically allocated. 42394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp * 424bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param callbackBuffer the buffer to add to the queue. 425bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * The size should be width * height * bits_per_pixel / 8. 4265b9bcda3a26e9b1f9b1eff28a2be8853d69614f0Wu-cheng Li * @see #setPreviewCallbackWithBuffer(PreviewCallback) 42794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp */ 42894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp public native final void addCallbackBuffer(byte[] callbackBuffer); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class EventHandler extends Handler 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Camera mCamera; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public EventHandler(Camera c, Looper looper) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(looper); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCamera = c; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(msg.what) { 442c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks case CAMERA_MSG_SHUTTER: 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShutterCallback != null) { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShutterCallback.onShutter(); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 447c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks 448c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks case CAMERA_MSG_RAW_IMAGE: 449e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks if (mRawImageCallback != null) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawImageCallback.onPictureTaken((byte[])msg.obj, mCamera); 451e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 454c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks case CAMERA_MSG_COMPRESSED_IMAGE: 455e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks if (mJpegCallback != null) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mJpegCallback.onPictureTaken((byte[])msg.obj, mCamera); 457e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 460c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks case CAMERA_MSG_PREVIEW_FRAME: 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreviewCallback != null) { 462a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks PreviewCallback cb = mPreviewCallback; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOneShot) { 464a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // Clear the callback variable before the callback 465a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // in case the app calls setPreviewCallback from 466a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // the callback function 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreviewCallback = null; 46894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp } else if (!mWithBuffer) { 469a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // We're faking the camera preview mode to prevent 470a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // the app from being flooded with preview frames. 471a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks // Set to oneshot mode again. 47294927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp setHasPreviewCallback(true, false); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 474a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks cb.onPreviewFrame((byte[])msg.obj, mCamera); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 478e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks case CAMERA_MSG_POSTVIEW_FRAME: 479e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks if (mPostviewCallback != null) { 480e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks mPostviewCallback.onPictureTaken((byte[])msg.obj, mCamera); 481e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 482e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks return; 483e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks 484c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks case CAMERA_MSG_FOCUS: 485e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks if (mAutoFocusCallback != null) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAutoFocusCallback.onAutoFocus(msg.arg1 == 0 ? false : true, mCamera); 487e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 488e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks return; 489e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks 490e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks case CAMERA_MSG_ZOOM: 4913f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li if (mZoomListener != null) { 4923f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li mZoomListener.onZoomChange(msg.arg1, msg.arg2 != 0, mCamera); 493e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 496c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks case CAMERA_MSG_ERROR : 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Error " + msg.arg1); 498e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks if (mErrorCallback != null) { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mErrorCallback.onError(msg.arg1, mCamera); 500e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Unknown message type " + msg.what); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void postEventFromNative(Object camera_ref, 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int what, int arg1, int arg2, Object obj) 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Camera c = (Camera)((WeakReference)camera_ref).get(); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == null) 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.mEventHandler != null) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = c.mEventHandler.obtainMessage(what, arg1, arg2, obj); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.mEventHandler.sendMessage(m); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 524bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Callback interface used to notify on completion of camera auto focus. 525bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 5267478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * <p>Devices that do not support auto-focus will receive a "fake" 5277478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * callback to this interface. If your application needs auto-focus and 528df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * should not be installed on devices <em>without</em> auto-focus, you must 529df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * declare that your app uses the 5307478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * {@code android.hardware.camera.autofocus} feature, in the 531df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><uses-feature></a> 532df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * manifest element.</p> 533bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 534bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #autoFocus(AutoFocusCallback) 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface AutoFocusCallback 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Called when the camera auto focus completes. If the camera does not 540bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * support auto-focus and autoFocus is called, onAutoFocus will be 541bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * called immediately with success. 5429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param success true if focus was successful, false if otherwise 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param camera the Camera service object 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onAutoFocus(boolean success, Camera camera); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 550bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Starts camera auto-focus and registers a callback function to run when 551bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * the camera is focused. This method is only valid when preview is active 552bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * (between {@link #startPreview()} and before {@link #stopPreview()}). 553bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 554bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>Callers should check 555bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link android.hardware.Camera.Parameters#getFocusMode()} to determine if 556bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * this method should be called. If the camera does not support auto-focus, 557bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * it is a no-op and {@link AutoFocusCallback#onAutoFocus(boolean, Camera)} 55836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * callback will be called immediately. 559bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 560da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main * <p>If your application should not be installed 5617478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * on devices without auto-focus, you must declare that your application 5627478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * uses auto-focus with the 563df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><uses-feature></a> 564df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * manifest element.</p> 565bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 566068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * <p>If the current flash mode is not 567068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * {@link android.hardware.Camera.Parameters#FLASH_MODE_OFF}, flash may be 568bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * fired during auto-focus, depending on the driver and camera hardware.<p> 5697478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cb the callback to run 571bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #cancelAutoFocus() 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void autoFocus(AutoFocusCallback cb) 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAutoFocusCallback = cb; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_autoFocus(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_autoFocus(); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 581bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Cancels any auto-focus function in progress. 582bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Whether or not auto-focus is currently in progress, 583bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * this function will return the focus position to the default. 584244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang * If the camera does not support auto-focus, this is a no-op. 585bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 586bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #autoFocus(Camera.AutoFocusCallback) 587244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang */ 588244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang public final void cancelAutoFocus() 589244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang { 590244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang mAutoFocusCallback = null; 591244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang native_cancelAutoFocus(); 592244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang } 593244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang private native final void native_cancelAutoFocus(); 594244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang 595244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang /** 596bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Callback interface used to signal the moment of actual image capture. 597bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 598bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback) 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface ShutterCallback 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 603bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Called as near as possible to the moment when a photo is captured 604bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * from the sensor. This is a good opportunity to play a shutter sound 605bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * or give other feedback of camera operation. This may be some time 606bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * after the photo was triggered, but some time before the actual data 607bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * is available. 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onShutter(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 613bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Callback interface used to supply image data from a photo capture. 614bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 615bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback) 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface PictureCallback { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 619bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Called when image data is available after a picture is taken. 620bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * The format of the data depends on the context of the callback 621bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * and {@link Camera.Parameters} settings. 6229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data a byte array of the picture data 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param camera the Camera service object 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onPictureTaken(byte[] data, Camera camera); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 630bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Equivalent to takePicture(shutter, raw, null, jpeg). 63140057ce749c8c4d274db0352a2af4344bda92dbaWu-cheng Li * 632bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback) 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void takePicture(ShutterCallback shutter, PictureCallback raw, 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PictureCallback jpeg) { 636e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks takePicture(shutter, raw, null, jpeg); 637e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 638e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks private native final void native_takePicture(); 639e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks 640e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks /** 6419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Triggers an asynchronous image capture. The camera service will initiate 6429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * a series of callbacks to the application as the image capture progresses. 6439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * The shutter callback occurs after the image is captured. This can be used 6449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * to trigger a sound to let the user know that image has been captured. The 6459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * raw callback occurs when the raw image data is available (NOTE: the data 6469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * may be null if the hardware does not have enough memory to make a copy). 6479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * The postview callback occurs when a scaled, fully processed postview 6489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * image is available (NOTE: not all hardware supports this). The jpeg 6499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * callback occurs when the compressed image is available. If the 6509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * application does not need a particular callback, a null can be passed 6519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * instead of a callback method. 652e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks * 653bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>This method is only valid when preview is active (after 654bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link #startPreview()}). Preview will be stopped after the image is 655bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * taken; callers must call {@link #startPreview()} again if they want to 656bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * re-start preview or take more pictures. 65740057ce749c8c4d274db0352a2af4344bda92dbaWu-cheng Li * 658bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * <p>After calling this method, you must not call {@link #startPreview()} 659bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * or take another picture until the JPEG callback has returned. 660bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 661bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param shutter the callback for image capture moment, or null 662bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param raw the callback for raw (uncompressed) image data, or null 663e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks * @param postview callback with postview image data, may be null 664bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param jpeg the callback for JPEG image data, or null 665e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks */ 666e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks public final void takePicture(ShutterCallback shutter, PictureCallback raw, 667e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks PictureCallback postview, PictureCallback jpeg) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShutterCallback = shutter; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawImageCallback = raw; 670e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks mPostviewCallback = postview; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mJpegCallback = jpeg; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_takePicture(); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 675e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks /** 676bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Zooms to the requested value smoothly. The driver will notify {@link 6773f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * OnZoomChangeListener} of the zoom value and whether zoom is stopped at 6783f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * the time. For example, suppose the current zoom is 0 and startSmoothZoom 679bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * is called with value 3. The 680bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link Camera.OnZoomChangeListener#onZoomChange(int, boolean, Camera)} 681bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * method will be called three times with zoom values 1, 2, and 3. 682bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Applications can call {@link #stopSmoothZoom} to stop the zoom earlier. 683bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Applications should not call startSmoothZoom again or change the zoom 684bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * value before zoom stops. If the supplied zoom value equals to the current 685bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * zoom value, no zoom callback will be generated. This method is supported 686bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * if {@link android.hardware.Camera.Parameters#isSmoothZoomSupported} 687bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * returns true. 68836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 68936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @param value zoom value. The valid range is 0 to {@link 69036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * android.hardware.Camera.Parameters#getMaxZoom}. 6910ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li * @throws IllegalArgumentException if the zoom value is invalid. 6920ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li * @throws RuntimeException if the method fails. 693bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #setZoomChangeListener(OnZoomChangeListener) 69436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 69536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li public native final void startSmoothZoom(int value); 69636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 69736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 698bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Stops the smooth zoom. Applications should wait for the {@link 6993f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * OnZoomChangeListener} to know when the zoom is actually stopped. This 7003f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * method is supported if {@link 7018cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * android.hardware.Camera.Parameters#isSmoothZoomSupported} is true. 7020ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li * 7030ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li * @throws RuntimeException if the method fails. 70436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 70536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li public native final void stopSmoothZoom(); 70636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 70736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 708d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * Set the display orientation. This affects the preview frames and the 709d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * picture displayed after snapshot. This method is useful for portrait 710d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * mode applications. 711d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * 712d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * This does not affect the order of byte array passed in 713d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * {@link PreviewCallback#onPreviewFrame}. This method is not allowed to 714d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * be called during preview. 715d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * 716d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang * @param degrees the angle that the picture will be rotated clockwise. 717e7bd22a9d9441916aa9c67d80ee9f02a2d3e10e5Chih-Chung Chang * Valid values are 0, 90, 180, and 270. The starting 718e7bd22a9d9441916aa9c67d80ee9f02a2d3e10e5Chih-Chung Chang * position is 0 (landscape). 719d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang */ 720d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang public native final void setDisplayOrientation(int degrees); 721d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang 722d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang /** 723bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Callback interface for zoom changes during a smooth zoom operation. 724bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 725bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #setZoomChangeListener(OnZoomChangeListener) 726bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #startSmoothZoom(int) 727e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks */ 7283f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li public interface OnZoomChangeListener 729e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks { 730e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks /** 731bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Called when the zoom value has changed during a smooth zoom. 73236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 73336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @param zoomValue the current zoom value. In smooth zoom mode, camera 7343f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * calls this for every new zoom value. 73536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @param stopped whether smooth zoom is stopped. If the value is true, 73636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * this is the last zoom update for the application. 737e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks * @param camera the Camera service object 738e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks */ 7393f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li void onZoomChange(int zoomValue, boolean stopped, Camera camera); 740e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks }; 741e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks 742e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks /** 7433f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * Registers a listener to be notified when the zoom value is updated by the 74436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * camera driver during smooth zoom. 7458cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * 7463f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @param listener the listener to notify 7478cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * @see #startSmoothZoom(int) 748e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks */ 7493f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li public final void setZoomChangeListener(OnZoomChangeListener listener) 750e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks { 7513f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li mZoomListener = listener; 752e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks } 7539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 754bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor // Error codes match the enum in include/ui/Camera.h 755bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor 756bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor /** 757bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Unspecified camera error. 758bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see Camera.ErrorCallback 759bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor */ 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CAMERA_ERROR_UNKNOWN = 1; 761bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor 762bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor /** 763bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Media server died. In this case, the application must release the 764bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Camera object and instantiate a new one. 765bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see Camera.ErrorCallback 766bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor */ 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CAMERA_ERROR_SERVER_DIED = 100; 7689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 770bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Callback interface for camera error notification. 771bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 772bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #setErrorCallback(ErrorCallback) 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface ErrorCallback 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback for camera errors. 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error error code: 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link #CAMERA_ERROR_UNKNOWN} 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link #CAMERA_ERROR_SERVER_DIED} 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param camera the Camera service object 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onError(int error, Camera camera); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Registers a callback to be invoked when an error occurs. 790bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @param cb The callback to run 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setErrorCallback(ErrorCallback cb) 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mErrorCallback = cb; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_setParameters(String params); 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final String native_getParameters(); 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 801bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Changes the settings for this Camera service. 8029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params the Parameters to use for this Camera service 804bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #getParameters() 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setParameters(Parameters params) { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_setParameters(params.flatten()); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 811bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Returns the current settings for this Camera service. 812bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * If modifications are made to the returned Parameters, they must be passed 813bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * to {@link #setParameters(Camera.Parameters)} to take effect. 814bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * 815bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * @see #setParameters(Camera.Parameters) 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Parameters getParameters() { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parameters p = new Parameters(); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s = native_getParameters(); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.unflatten(s); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 825bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Image size (width and height dimensions). 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class Size { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the dimensions for pictures. 8309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param w the photo width (pixels) 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h the photo height (pixels) 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Size(int w, int h) { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = w; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = h; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8384c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li /** 8394c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * Compares {@code obj} to this size. 8404c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * 8414c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * @param obj the object to compare this size with. 8424c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * @return {@code true} if the width and height of {@code obj} is the 8434c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * same as those of this size. {@code false} otherwise. 8444c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li */ 8454c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li @Override 8464c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li public boolean equals(Object obj) { 8474c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li if (!(obj instanceof Size)) { 8484c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li return false; 8494c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li } 8504c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li Size s = (Size) obj; 8514c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li return width == s.width && height == s.height; 8524c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li } 8534c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li @Override 8544c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li public int hashCode() { 8554c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li return width * 32713 + height; 8564c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** width of the picture */ 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int width; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** height of the picture */ 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int height; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 864bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * Camera service settings. 8659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 8669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * <p>To make camera parameters take effect, applications have to call 867bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link Camera#setParameters(Camera.Parameters)}. For example, after 868bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link Camera.Parameters#setWhiteBalance} is called, white balance is not 869bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * actually changed until {@link Camera#setParameters(Camera.Parameters)} 870bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * is called with the changed parameters object. 8719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 8729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * <p>Different devices may have different camera capabilities, such as 8739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * picture size or flash modes. The application should query the camera 8749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * capabilities before setting parameters. For example, the application 875bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * should call {@link Camera.Parameters#getSupportedColorEffects()} before 876bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * calling {@link Camera.Parameters#setColorEffect(String)}. If the 877bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * camera does not support color effects, 878bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor * {@link Camera.Parameters#getSupportedColorEffects()} will return null. 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class Parameters { 8819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Parameter keys to communicate with the camera driver. 8829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_PREVIEW_SIZE = "preview-size"; 8839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_PREVIEW_FORMAT = "preview-format"; 8849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_PREVIEW_FRAME_RATE = "preview-frame-rate"; 8859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_PICTURE_SIZE = "picture-size"; 8869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_PICTURE_FORMAT = "picture-format"; 8874c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li private static final String KEY_JPEG_THUMBNAIL_SIZE = "jpeg-thumbnail-size"; 8889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_JPEG_THUMBNAIL_WIDTH = "jpeg-thumbnail-width"; 8899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_JPEG_THUMBNAIL_HEIGHT = "jpeg-thumbnail-height"; 8909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_JPEG_THUMBNAIL_QUALITY = "jpeg-thumbnail-quality"; 8919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_JPEG_QUALITY = "jpeg-quality"; 8929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_ROTATION = "rotation"; 8939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_GPS_LATITUDE = "gps-latitude"; 8949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_GPS_LONGITUDE = "gps-longitude"; 8959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_GPS_ALTITUDE = "gps-altitude"; 8969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_GPS_TIMESTAMP = "gps-timestamp"; 897055c986ab841f8f758398841730f1e90313b132aRay Chen private static final String KEY_GPS_PROCESSING_METHOD = "gps-processing-method"; 8989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_WHITE_BALANCE = "whitebalance"; 8999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_EFFECT = "effect"; 9009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_ANTIBANDING = "antibanding"; 9019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_SCENE_MODE = "scene-mode"; 9029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String KEY_FLASH_MODE = "flash-mode"; 90336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li private static final String KEY_FOCUS_MODE = "focus-mode"; 9046c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li private static final String KEY_FOCAL_LENGTH = "focal-length"; 9056c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li private static final String KEY_HORIZONTAL_VIEW_ANGLE = "horizontal-view-angle"; 9066c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li private static final String KEY_VERTICAL_VIEW_ANGLE = "vertical-view-angle"; 907ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li private static final String KEY_EXPOSURE_COMPENSATION = "exposure-compensation"; 90824b326a8978bf78e3e560723dde221792784325bWu-cheng Li private static final String KEY_MAX_EXPOSURE_COMPENSATION = "max-exposure-compensation"; 90924b326a8978bf78e3e560723dde221792784325bWu-cheng Li private static final String KEY_MIN_EXPOSURE_COMPENSATION = "min-exposure-compensation"; 91024b326a8978bf78e3e560723dde221792784325bWu-cheng Li private static final String KEY_EXPOSURE_COMPENSATION_STEP = "exposure-compensation-step"; 9118cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li private static final String KEY_ZOOM = "zoom"; 9128cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li private static final String KEY_MAX_ZOOM = "max-zoom"; 9138cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li private static final String KEY_ZOOM_RATIOS = "zoom-ratios"; 9148cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li private static final String KEY_ZOOM_SUPPORTED = "zoom-supported"; 9158cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li private static final String KEY_SMOOTH_ZOOM_SUPPORTED = "smooth-zoom-supported"; 9169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Parameter key suffix for supported values. 9179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String SUPPORTED_VALUES_SUFFIX = "-values"; 9189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 9198cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li private static final String TRUE = "true"; 9208cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li 9219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Values for white balance settings. 9229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_AUTO = "auto"; 9239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_INCANDESCENT = "incandescent"; 9249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_FLUORESCENT = "fluorescent"; 9259b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_WARM_FLUORESCENT = "warm-fluorescent"; 9269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_DAYLIGHT = "daylight"; 9279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_CLOUDY_DAYLIGHT = "cloudy-daylight"; 9289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_TWILIGHT = "twilight"; 9299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String WHITE_BALANCE_SHADE = "shade"; 9309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 9319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Values for color effect settings. 9329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_NONE = "none"; 9339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_MONO = "mono"; 9349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_NEGATIVE = "negative"; 9359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_SOLARIZE = "solarize"; 9369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_SEPIA = "sepia"; 9379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_POSTERIZE = "posterize"; 9389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_WHITEBOARD = "whiteboard"; 9399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_BLACKBOARD = "blackboard"; 9409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String EFFECT_AQUA = "aqua"; 9419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 9429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Values for antibanding settings. 9439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String ANTIBANDING_AUTO = "auto"; 9449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String ANTIBANDING_50HZ = "50hz"; 9459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String ANTIBANDING_60HZ = "60hz"; 9469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String ANTIBANDING_OFF = "off"; 9479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 9489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Values for flash mode settings. 9499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 9509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Flash will not be fired. 9519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 9529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String FLASH_MODE_OFF = "off"; 95336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 9549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 955068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * Flash will be fired automatically when required. The flash may be fired 956068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * during preview, auto-focus, or snapshot depending on the driver. 9579b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 9589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String FLASH_MODE_AUTO = "auto"; 95936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 9609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 961068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * Flash will always be fired during snapshot. The flash may also be 962068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * fired during preview or auto-focus depending on the driver. 9639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 9649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String FLASH_MODE_ON = "on"; 96536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 9669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 9679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Flash will be fired in red-eye reduction mode. 9689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 9699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String FLASH_MODE_RED_EYE = "red-eye"; 97036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 97136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li /** 972068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * Constant emission of light during preview, auto-focus and snapshot. 973068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li * This can also be used for video recording. 97436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li */ 975068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li public static final String FLASH_MODE_TORCH = "torch"; 9769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 9779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Values for scene mode settings. 9789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_AUTO = "auto"; 9799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_ACTION = "action"; 9809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_PORTRAIT = "portrait"; 9819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_LANDSCAPE = "landscape"; 9829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_NIGHT = "night"; 9839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_NIGHT_PORTRAIT = "night-portrait"; 9849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_THEATRE = "theatre"; 9859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_BEACH = "beach"; 9869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_SNOW = "snow"; 9879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_SUNSET = "sunset"; 9889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_STEADYPHOTO = "steadyphoto"; 9899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_FIREWORKS = "fireworks"; 9909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_SPORTS = "sports"; 9919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_PARTY = "party"; 9929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public static final String SCENE_MODE_CANDLELIGHT = "candlelight"; 9939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 994c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li /** 995c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * Applications are looking for a barcode. Camera driver will be 996c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * optimized for barcode reading. 997c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li */ 998c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li public static final String SCENE_MODE_BARCODE = "barcode"; 999c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li 100036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li // Values for focus mode settings. 100136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li /** 100236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * Auto-focus mode. 100336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li */ 100436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li public static final String FOCUS_MODE_AUTO = "auto"; 100536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 100636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li /** 100736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * Focus is set at infinity. Applications should not call 100836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * {@link #autoFocus(AutoFocusCallback)} in this mode. 100936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li */ 101036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li public static final String FOCUS_MODE_INFINITY = "infinity"; 101136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li public static final String FOCUS_MODE_MACRO = "macro"; 101236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 101336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li /** 101436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * Focus is fixed. The camera is always in this mode if the focus is not 101536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * adjustable. If the camera has auto-focus, this mode can fix the 101636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * focus, which is usually at hyperfocal distance. Applications should 101736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * not call {@link #autoFocus(AutoFocusCallback)} in this mode. 101836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li */ 101936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li public static final String FOCUS_MODE_FIXED = "fixed"; 102036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li 1021c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li /** 1022c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * Extended depth of field (EDOF). Focusing is done digitally and 1023c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * continuously. Applications should not call {@link 1024c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * #autoFocus(AutoFocusCallback)} in this mode. 1025c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li */ 1026c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li public static final String FOCUS_MODE_EDOF = "edof"; 1027c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li 10289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Formats for setPreviewFormat and setPictureFormat. 10299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp"; 10309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp"; 1031eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang private static final String PIXEL_FORMAT_YUV422I = "yuv422i-yuyv"; 10329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String PIXEL_FORMAT_RGB565 = "rgb565"; 10339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private static final String PIXEL_FORMAT_JPEG = "jpeg"; 10349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private HashMap<String, String> mMap; 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Parameters() { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMap = new HashMap<String, String>(); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes the current Parameters to the log. 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump() { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "dump: size=" + mMap.size()); 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String k : mMap.keySet()) { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "dump: " + k + "=" + mMap.get(k)); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a single string with all the parameters set in 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this Parameters object. 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link #unflatten(String)} method does the reverse.</p> 10579b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a String with all values from this Parameters object, in 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * semi-colon delimited key-value pairs 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String flatten() { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder flattened = new StringBuilder(); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String k : mMap.keySet()) { 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flattened.append(k); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flattened.append("="); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flattened.append(mMap.get(k)); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flattened.append(";"); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // chop off the extra semicolon at the end 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flattened.deleteCharAt(flattened.length()-1); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return flattened.toString(); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Takes a flattened string of parameters and adds each one to 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this Parameters object. 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link #flatten()} method does the reverse.</p> 10789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 10799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param flattened a String of parameters (key-value paired) that 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are semi-colon delimited 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unflatten(String flattened) { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMap.clear(); 10849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringTokenizer tokenizer = new StringTokenizer(flattened, ";"); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (tokenizer.hasMoreElements()) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String kv = tokenizer.nextToken(); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = kv.indexOf('='); 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos == -1) { 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String k = kv.substring(0, pos); 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String v = kv.substring(pos + 1); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMap.put(k, v); 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void remove(String key) { 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMap.remove(key); 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets a String parameter. 11049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key the key name for the parameter 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the String value of the parameter 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(String key, String value) { 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (key.indexOf('=') != -1 || key.indexOf(';') != -1) { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Key \"" + key + "\" contains invalid character (= or ;)"); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.indexOf('=') != -1 || value.indexOf(';') != -1) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Value \"" + value + "\" contains invalid character (= or ;)"); 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMap.put(key, value); 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets an integer parameter. 11239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key the key name for the parameter 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the int value of the parameter 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(String key, int value) { 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMap.put(key, Integer.toString(value)); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the value of a String parameter. 11339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key the key name for the parameter 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the String value of the parameter 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String get(String key) { 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMap.get(key); 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the value of an integer parameter. 11439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key the key name for the parameter 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the int value of the parameter 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInt(String key) { 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Integer.parseInt(mMap.get(key)); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the dimensions for preview pictures. 11539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width of the pictures, in pixels 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the height of the pictures, in pixels 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPreviewSize(int width, int height) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String v = Integer.toString(width) + "x" + Integer.toString(height); 11599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_PREVIEW_SIZE, v); 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the dimensions setting for preview pictures. 11649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @return a Size object with the height and width setting 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for the preview picture 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Size getPreviewSize() { 11699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String pair = get(KEY_PREVIEW_SIZE); 11709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return strToSize(pair); 11719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 11749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported preview sizes. 11759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11763f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of Size object. This method will always return a list 11779c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li * with at least one element. 11789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 11799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<Size> getSupportedPreviewSizes() { 11809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_PREVIEW_SIZE + SUPPORTED_VALUES_SUFFIX); 11819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return splitSize(str); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11854c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * Sets the dimensions for EXIF thumbnail in Jpeg picture. If 11864c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * applications set both width and height to 0, EXIF will not contain 11874c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * thumbnail. 11889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width of the thumbnail, in pixels 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the height of the thumbnail, in pixels 11919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 11929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setJpegThumbnailSize(int width, int height) { 11939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_JPEG_THUMBNAIL_WIDTH, width); 11949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_JPEG_THUMBNAIL_HEIGHT, height); 11959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 11969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 11979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 11989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Returns the dimensions for EXIF thumbnail in Jpeg picture. 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @return a Size object with the height and width setting for the EXIF 12019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * thumbnails 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public Size getJpegThumbnailSize() { 12049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return new Size(getInt(KEY_JPEG_THUMBNAIL_WIDTH), 12059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li getInt(KEY_JPEG_THUMBNAIL_HEIGHT)); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12094c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * Gets the supported jpeg thumbnail sizes. 12104c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * 12113f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of Size object. This method will always return a list 12124c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * with at least two elements. Size 0,0 (no thumbnail) is always 12134c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li * supported. 12144c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li */ 12154c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li public List<Size> getSupportedJpegThumbnailSizes() { 12164c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li String str = get(KEY_JPEG_THUMBNAIL_SIZE + SUPPORTED_VALUES_SUFFIX); 12174c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li return splitSize(str); 12184c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li } 12194c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li 12204c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li /** 12219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets the quality of the EXIF thumbnail in Jpeg picture. 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param quality the JPEG quality of the EXIF thumbnail. The range is 1 12249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * to 100, with 100 being the best. 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setJpegThumbnailQuality(int quality) { 12279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_JPEG_THUMBNAIL_QUALITY, quality); 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Returns the quality setting for the EXIF thumbnail in Jpeg picture. 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @return the JPEG quality setting of the EXIF thumbnail. 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public int getJpegThumbnailQuality() { 12369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return getInt(KEY_JPEG_THUMBNAIL_QUALITY); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets Jpeg quality of captured picture. 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param quality the JPEG quality of captured picture. The range is 1 12439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * to 100, with 100 being the best. 12449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 12459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setJpegQuality(int quality) { 12469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_JPEG_QUALITY, quality); 12479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 12489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 12499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 12509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Returns the quality setting for the JPEG picture. 12519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 12529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @return the JPEG picture quality setting. 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public int getJpegQuality() { 12559b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return getInt(KEY_JPEG_QUALITY); 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1259a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li * Sets the rate at which preview frames are received. This is the 1260a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li * target frame rate. The actual frame rate depends on the driver. 12619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fps the frame rate (frames per second) 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPreviewFrameRate(int fps) { 12659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_PREVIEW_FRAME_RATE, fps); 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li * Returns the setting for the rate at which preview frames are 1270a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li * received. This is the target frame rate. The actual frame rate 1271a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li * depends on the driver. 12729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the frame rate setting (frames per second) 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPreviewFrameRate() { 12769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return getInt(KEY_PREVIEW_FRAME_RATE); 12779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 12789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 12799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 12809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported preview frame rates. 12819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 12823f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported preview frame rates. null if preview 12833f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * frame rate setting is not supported. 12849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 12859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<Integer> getSupportedPreviewFrameRates() { 12869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_PREVIEW_FRAME_RATE + SUPPORTED_VALUES_SUFFIX); 12879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return splitInt(str); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12917478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * Sets the image format for preview pictures. 1292da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main * <p>If this is never called, the default format will be 1293a696f5d667227365da732481770767dcb330dd23Mathias Agopian * {@link android.graphics.ImageFormat#NV21}, which 1294df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * uses the NV21 encoding format.</p> 12957478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * 1296df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main * @param pixel_format the desired preview picture format, defined 1297a696f5d667227365da732481770767dcb330dd23Mathias Agopian * by one of the {@link android.graphics.ImageFormat} constants. 1298a696f5d667227365da732481770767dcb330dd23Mathias Agopian * (E.g., <var>ImageFormat.NV21</var> (default), 1299a696f5d667227365da732481770767dcb330dd23Mathias Agopian * <var>ImageFormat.RGB_565</var>, or 1300a696f5d667227365da732481770767dcb330dd23Mathias Agopian * <var>ImageFormat.JPEG</var>) 1301a696f5d667227365da732481770767dcb330dd23Mathias Agopian * @see android.graphics.ImageFormat 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPreviewFormat(int pixel_format) { 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s = cameraFormatForPixelFormat(pixel_format); 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 13069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li throw new IllegalArgumentException( 13079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li "Invalid pixel_format=" + pixel_format); 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_PREVIEW_FORMAT, s); 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13143f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * Returns the image format for preview frames got from 13159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * {@link PreviewCallback}. 13167478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li * 13173f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return the preview format. 13183f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see android.graphics.ImageFormat 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPreviewFormat() { 13219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return pixelFormatForCameraFormat(get(KEY_PREVIEW_FORMAT)); 13229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 13239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 13249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 13259b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported preview formats. 13269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 13273f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported preview formats. This method will always 13283f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * return a list with at least one element. 13293f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see android.graphics.ImageFormat 13309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 13319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<Integer> getSupportedPreviewFormats() { 13329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_PREVIEW_FORMAT + SUPPORTED_VALUES_SUFFIX); 1333eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang ArrayList<Integer> formats = new ArrayList<Integer>(); 1334eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang for (String s : split(str)) { 1335eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang int f = pixelFormatForCameraFormat(s); 1336a696f5d667227365da732481770767dcb330dd23Mathias Agopian if (f == ImageFormat.UNKNOWN) continue; 1337eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang formats.add(f); 1338eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang } 1339eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang return formats; 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the dimensions for pictures. 13449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width for pictures, in pixels 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the height for pictures, in pixels 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPictureSize(int width, int height) { 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String v = Integer.toString(width) + "x" + Integer.toString(height); 13509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_PICTURE_SIZE, v); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the dimension setting for pictures. 13559b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 13569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @return a Size object with the height and width setting 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for pictures 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Size getPictureSize() { 13609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String pair = get(KEY_PICTURE_SIZE); 13619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return strToSize(pair); 13629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 13659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported picture sizes. 13669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 13673f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported picture sizes. This method will always 13683f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * return a list with at least one element. 13699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 13709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<Size> getSupportedPictureSizes() { 13719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_PICTURE_SIZE + SUPPORTED_VALUES_SUFFIX); 13729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return splitSize(str); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the image format for pictures. 13779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 13789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param pixel_format the desired picture format 1379a696f5d667227365da732481770767dcb330dd23Mathias Agopian * (<var>ImageFormat.NV21</var>, 1380a696f5d667227365da732481770767dcb330dd23Mathias Agopian * <var>ImageFormat.RGB_565</var>, or 1381a696f5d667227365da732481770767dcb330dd23Mathias Agopian * <var>ImageFormat.JPEG</var>) 1382a696f5d667227365da732481770767dcb330dd23Mathias Agopian * @see android.graphics.ImageFormat 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPictureFormat(int pixel_format) { 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s = cameraFormatForPixelFormat(pixel_format); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 13879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li throw new IllegalArgumentException( 13889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li "Invalid pixel_format=" + pixel_format); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_PICTURE_FORMAT, s); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the image format for pictures. 13969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 13973f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return the picture format 13983f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see android.graphics.ImageFormat 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPictureFormat() { 14019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return pixelFormatForCameraFormat(get(KEY_PICTURE_FORMAT)); 14029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 14039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 14049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 14059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported picture formats. 14069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 14073f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return supported picture formats. This method will always return a 14083f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * list with at least one element. 14093f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see android.graphics.ImageFormat 14109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 14119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<Integer> getSupportedPictureFormats() { 14129c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li String str = get(KEY_PICTURE_FORMAT + SUPPORTED_VALUES_SUFFIX); 14139c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li ArrayList<Integer> formats = new ArrayList<Integer>(); 14149c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li for (String s : split(str)) { 14159c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li int f = pixelFormatForCameraFormat(s); 1416a696f5d667227365da732481770767dcb330dd23Mathias Agopian if (f == ImageFormat.UNKNOWN) continue; 14179c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li formats.add(f); 14189c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li } 14199c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li return formats; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String cameraFormatForPixelFormat(int pixel_format) { 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(pixel_format) { 1424a696f5d667227365da732481770767dcb330dd23Mathias Agopian case ImageFormat.NV16: return PIXEL_FORMAT_YUV422SP; 1425a696f5d667227365da732481770767dcb330dd23Mathias Agopian case ImageFormat.NV21: return PIXEL_FORMAT_YUV420SP; 1426a696f5d667227365da732481770767dcb330dd23Mathias Agopian case ImageFormat.YUY2: return PIXEL_FORMAT_YUV422I; 1427a696f5d667227365da732481770767dcb330dd23Mathias Agopian case ImageFormat.RGB_565: return PIXEL_FORMAT_RGB565; 1428a696f5d667227365da732481770767dcb330dd23Mathias Agopian case ImageFormat.JPEG: return PIXEL_FORMAT_JPEG; 1429a696f5d667227365da732481770767dcb330dd23Mathias Agopian default: return null; 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int pixelFormatForCameraFormat(String format) { 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (format == null) 1435a696f5d667227365da732481770767dcb330dd23Mathias Agopian return ImageFormat.UNKNOWN; 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (format.equals(PIXEL_FORMAT_YUV422SP)) 1438a696f5d667227365da732481770767dcb330dd23Mathias Agopian return ImageFormat.NV16; 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (format.equals(PIXEL_FORMAT_YUV420SP)) 1441a696f5d667227365da732481770767dcb330dd23Mathias Agopian return ImageFormat.NV21; 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1443eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang if (format.equals(PIXEL_FORMAT_YUV422I)) 1444a696f5d667227365da732481770767dcb330dd23Mathias Agopian return ImageFormat.YUY2; 1445eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang 14469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (format.equals(PIXEL_FORMAT_RGB565)) 1447a696f5d667227365da732481770767dcb330dd23Mathias Agopian return ImageFormat.RGB_565; 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (format.equals(PIXEL_FORMAT_JPEG)) 1450a696f5d667227365da732481770767dcb330dd23Mathias Agopian return ImageFormat.JPEG; 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1452a696f5d667227365da732481770767dcb330dd23Mathias Agopian return ImageFormat.UNKNOWN; 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14559b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 1456e6bea600fe5600017a4824adb14752a5b915d164Wu-cheng Li * Sets the orientation of the device in degrees. For example, suppose 1457e6bea600fe5600017a4824adb14752a5b915d164Wu-cheng Li * the natural position of the device is landscape. If the user takes a 14589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * picture in landscape mode in 2048x1536 resolution, the rotation 14599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * should be set to 0. If the user rotates the phone 90 degrees 14609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * clockwise, the rotation should be set to 90. Applications can use 14619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * {@link android.view.OrientationEventListener} to set this parameter. 14629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 1463e6bea600fe5600017a4824adb14752a5b915d164Wu-cheng Li * The camera driver may set orientation in the EXIF header without 1464e6bea600fe5600017a4824adb14752a5b915d164Wu-cheng Li * rotating the picture. Or the driver may rotate the picture and 1465e6bea600fe5600017a4824adb14752a5b915d164Wu-cheng Li * the EXIF thumbnail. If the Jpeg picture is rotated, the orientation 1466e6bea600fe5600017a4824adb14752a5b915d164Wu-cheng Li * in the EXIF header will be missing or 1 (row #0 is top and column #0 1467e6bea600fe5600017a4824adb14752a5b915d164Wu-cheng Li * is left side). 14689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 14699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param rotation The orientation of the device in degrees. Rotation 14709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * can only be 0, 90, 180 or 270. 14719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @throws IllegalArgumentException if rotation value is invalid. 14729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @see android.view.OrientationEventListener 14739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 14749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setRotation(int rotation) { 14759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (rotation == 0 || rotation == 90 || rotation == 180 14769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li || rotation == 270) { 14779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_ROTATION, Integer.toString(rotation)); 14789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } else { 14799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li throw new IllegalArgumentException( 14809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li "Invalid rotation=" + rotation); 14819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 14829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 14839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 14849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 14859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets GPS latitude coordinate. This will be stored in JPEG EXIF 14869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * header. 14879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 14889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param latitude GPS latitude coordinate. 14899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 14909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setGpsLatitude(double latitude) { 14919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_GPS_LATITUDE, Double.toString(latitude)); 14929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 14939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 14949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 14959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets GPS longitude coordinate. This will be stored in JPEG EXIF 14969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * header. 14979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 14989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param longitude GPS longitude coordinate. 14999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 15009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setGpsLongitude(double longitude) { 15019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_GPS_LONGITUDE, Double.toString(longitude)); 15029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 15039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 15049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 15059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets GPS altitude. This will be stored in JPEG EXIF header. 15069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 15079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param altitude GPS altitude in meters. 15089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 15099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setGpsAltitude(double altitude) { 15109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_GPS_ALTITUDE, Double.toString(altitude)); 15119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 15129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 15139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 15149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets GPS timestamp. This will be stored in JPEG EXIF header. 15159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 15169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @param timestamp GPS timestamp (UTC in seconds since January 1, 15179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 1970). 15189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 15199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setGpsTimestamp(long timestamp) { 15209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_GPS_TIMESTAMP, Long.toString(timestamp)); 15219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 15229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 15239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 1524e208377fbab6b90f41e68699700942a81f4caaebRay Chen * Sets GPS processing method. It will store up to 32 characters 1525055c986ab841f8f758398841730f1e90313b132aRay Chen * in JPEG EXIF header. 1526055c986ab841f8f758398841730f1e90313b132aRay Chen * 1527055c986ab841f8f758398841730f1e90313b132aRay Chen * @param processing_method The processing method to get this location. 1528055c986ab841f8f758398841730f1e90313b132aRay Chen */ 1529055c986ab841f8f758398841730f1e90313b132aRay Chen public void setGpsProcessingMethod(String processing_method) { 1530055c986ab841f8f758398841730f1e90313b132aRay Chen set(KEY_GPS_PROCESSING_METHOD, processing_method); 1531055c986ab841f8f758398841730f1e90313b132aRay Chen } 1532055c986ab841f8f758398841730f1e90313b132aRay Chen 1533055c986ab841f8f758398841730f1e90313b132aRay Chen /** 15349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Removes GPS latitude, longitude, altitude, and timestamp from the 15359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * parameters. 15369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 15379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void removeGpsData() { 15389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li remove(KEY_GPS_LATITUDE); 15399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li remove(KEY_GPS_LONGITUDE); 15409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li remove(KEY_GPS_ALTITUDE); 15419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li remove(KEY_GPS_TIMESTAMP); 1542055c986ab841f8f758398841730f1e90313b132aRay Chen remove(KEY_GPS_PROCESSING_METHOD); 15439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 15449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 15459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 15469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the current white balance setting. 15479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 15483f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return current white balance. null if white balance setting is not 15493f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * supported. 15503f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_AUTO 15513f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_INCANDESCENT 15523f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_FLUORESCENT 15533f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_WARM_FLUORESCENT 15543f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_DAYLIGHT 15553f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_CLOUDY_DAYLIGHT 15563f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_TWILIGHT 15573f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #WHITE_BALANCE_SHADE 15583f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * 15599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 15609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public String getWhiteBalance() { 15619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return get(KEY_WHITE_BALANCE); 15629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 15639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 15649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 15659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets the white balance. 15669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 15673f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @param value new white balance. 15683f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getWhiteBalance() 15699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 15709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setWhiteBalance(String value) { 15719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_WHITE_BALANCE, value); 15729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 15739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 15749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 15759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported white balance. 15769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 15773f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported white balance. null if white balance 15783f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * setting is not supported. 15793f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getWhiteBalance() 15809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 15819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<String> getSupportedWhiteBalance() { 15829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_WHITE_BALANCE + SUPPORTED_VALUES_SUFFIX); 15839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return split(str); 15849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 15859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 15869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 15879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the current color effect setting. 15889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 15893f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return current color effect. null if color effect 15909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * setting is not supported. 15913f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_NONE 15923f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_MONO 15933f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_NEGATIVE 15943f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_SOLARIZE 15953f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_SEPIA 15963f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_POSTERIZE 15973f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_WHITEBOARD 15983f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_BLACKBOARD 15993f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #EFFECT_AQUA 16009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 16019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public String getColorEffect() { 16029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return get(KEY_EFFECT); 16039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 16049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 16069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets the current color effect setting. 16079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 16083f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @param value new color effect. 16093f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getColorEffect() 16109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 16119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setColorEffect(String value) { 16129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_EFFECT, value); 16139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 16149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 16169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported color effects. 16179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 16183f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported color effects. null if color effect 16199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * setting is not supported. 16203f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getColorEffect() 16219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 16229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<String> getSupportedColorEffects() { 16239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_EFFECT + SUPPORTED_VALUES_SUFFIX); 16249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return split(str); 16259b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 16269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 16299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the current antibanding setting. 16309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 16313f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return current antibanding. null if antibanding setting is not 16323f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * supported. 16333f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #ANTIBANDING_AUTO 16343f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #ANTIBANDING_50HZ 16353f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #ANTIBANDING_60HZ 16363f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #ANTIBANDING_OFF 16379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 16389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public String getAntibanding() { 16399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return get(KEY_ANTIBANDING); 16409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 16419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 16439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets the antibanding. 16449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 16453f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @param antibanding new antibanding value. 16463f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getAntibanding() 16479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 16489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setAntibanding(String antibanding) { 16499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_ANTIBANDING, antibanding); 16509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 16519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 16539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported antibanding values. 16549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 16553f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported antibanding values. null if antibanding 16563f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * setting is not supported. 16573f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getAntibanding() 16589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 16599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<String> getSupportedAntibanding() { 16609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_ANTIBANDING + SUPPORTED_VALUES_SUFFIX); 16619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return split(str); 16629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 16639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 16659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the current scene mode setting. 16669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 16679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * @return one of SCENE_MODE_XXX string constant. null if scene mode 16689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * setting is not supported. 16693f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_AUTO 16703f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_ACTION 16713f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_PORTRAIT 16723f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_LANDSCAPE 16733f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_NIGHT 16743f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_NIGHT_PORTRAIT 16753f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_THEATRE 16763f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_BEACH 16773f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_SNOW 16783f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_SUNSET 16793f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_STEADYPHOTO 16803f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_FIREWORKS 16813f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_SPORTS 16823f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_PARTY 16833f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #SCENE_MODE_CANDLELIGHT 16849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 16859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public String getSceneMode() { 16869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return get(KEY_SCENE_MODE); 16879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 16889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 16899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 1690c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * Sets the scene mode. Changing scene mode may override other 1691c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * parameters (such as flash mode, focus mode, white balance). For 1692c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * example, suppose originally flash mode is on and supported flash 1693c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * modes are on/off. In night scene mode, both flash mode and supported 1694c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li * flash mode may be changed to off. After setting scene mode, 16952988ab7c322aad7508df930204886f334216b65cWu-cheng Li * applications should call getParameters to know if some parameters are 16962988ab7c322aad7508df930204886f334216b65cWu-cheng Li * changed. 16979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 16983f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @param value scene mode. 16993f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getSceneMode() 17009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 17019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setSceneMode(String value) { 17029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_SCENE_MODE, value); 17039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 17049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 17059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 17069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported scene modes. 17079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 17083f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported scene modes. null if scene mode setting 17093f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * is not supported. 17103f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getSceneMode() 17119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 17129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<String> getSupportedSceneModes() { 17139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_SCENE_MODE + SUPPORTED_VALUES_SUFFIX); 17149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return split(str); 17159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 17169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 17179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 17189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the current flash mode setting. 17199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 17203f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return current flash mode. null if flash mode setting is not 17213f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * supported. 17223f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FLASH_MODE_OFF 17233f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FLASH_MODE_AUTO 17243f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FLASH_MODE_ON 17253f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FLASH_MODE_RED_EYE 17263f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FLASH_MODE_TORCH 17279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 17289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public String getFlashMode() { 17299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return get(KEY_FLASH_MODE); 17309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 17319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 17329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 17339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Sets the flash mode. 17349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 17353f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @param value flash mode. 17363f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getFlashMode() 17379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 17389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public void setFlashMode(String value) { 17399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li set(KEY_FLASH_MODE, value); 17409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 17419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 17429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li /** 17439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * Gets the supported flash modes. 17449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li * 17453f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported flash modes. null if flash mode setting 17463f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * is not supported. 17473f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getFlashMode() 17489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li */ 17499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li public List<String> getSupportedFlashModes() { 17509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String str = get(KEY_FLASH_MODE + SUPPORTED_VALUES_SUFFIX); 17519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return split(str); 17529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 17539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 175436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li /** 175536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * Gets the current focus mode setting. 175636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * 17573f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return current focus mode. If the camera does not support 17583f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * auto-focus, this should return {@link #FOCUS_MODE_FIXED}. If 17593f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * the focus mode is not FOCUS_MODE_FIXED or {@link 17603f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * #FOCUS_MODE_INFINITY}, applications should call {@link 17613f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * #autoFocus(AutoFocusCallback)} to start the focus. 17623f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FOCUS_MODE_AUTO 17633f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FOCUS_MODE_INFINITY 17643f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FOCUS_MODE_MACRO 17653f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #FOCUS_MODE_FIXED 176636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li */ 176736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li public String getFocusMode() { 176836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li return get(KEY_FOCUS_MODE); 176936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li } 177036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li 177136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li /** 177236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * Sets the focus mode. 177336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * 17743f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @param value focus mode. 17753f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getFocusMode() 177636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li */ 177736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li public void setFocusMode(String value) { 177836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li set(KEY_FOCUS_MODE, value); 177936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li } 178036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li 178136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li /** 178236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * Gets the supported focus modes. 178336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li * 17843f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @return a list of supported focus modes. This method will always 17853f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * return a list with at least one element. 17863f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li * @see #getFocusMode() 178736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li */ 178836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li public List<String> getSupportedFocusModes() { 178936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li String str = get(KEY_FOCUS_MODE + SUPPORTED_VALUES_SUFFIX); 179036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li return split(str); 179136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li } 179236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li 179336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 17946c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * Gets the focal length (in millimeter) of the camera. 17956c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * 17966c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * @return the focal length. This method will always return a valid 17976c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * value. 17986c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li */ 17996c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li public float getFocalLength() { 18006c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li return Float.parseFloat(get(KEY_FOCAL_LENGTH)); 18016c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li } 18026c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li 18036c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li /** 18046c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * Gets the horizontal angle of view in degrees. 18056c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * 18066c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * @return horizontal angle of view. This method will always return a 18076c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * valid value. 18086c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li */ 18096c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li public float getHorizontalViewAngle() { 18106c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li return Float.parseFloat(get(KEY_HORIZONTAL_VIEW_ANGLE)); 18116c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li } 18126c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li 18136c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li /** 18146c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * Gets the vertical angle of view in degrees. 18156c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * 18166c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * @return vertical angle of view. This method will always return a 18176c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li * valid value. 18186c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li */ 18196c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li public float getVerticalViewAngle() { 18206c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li return Float.parseFloat(get(KEY_VERTICAL_VIEW_ANGLE)); 18216c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li } 18226c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li 18236c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li /** 182424b326a8978bf78e3e560723dde221792784325bWu-cheng Li * Gets the current exposure compensation index. 1825ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li * 182624b326a8978bf78e3e560723dde221792784325bWu-cheng Li * @return current exposure compensation index. The range is {@link 182724b326a8978bf78e3e560723dde221792784325bWu-cheng Li * #getMinExposureCompensation} to {@link 182824b326a8978bf78e3e560723dde221792784325bWu-cheng Li * #getMaxExposureCompensation}. 0 means exposure is not 182924b326a8978bf78e3e560723dde221792784325bWu-cheng Li * adjusted. 1830ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li */ 1831ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li public int getExposureCompensation() { 183224b326a8978bf78e3e560723dde221792784325bWu-cheng Li return getInt(KEY_EXPOSURE_COMPENSATION, 0); 1833ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li } 1834ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li 1835ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li /** 183624b326a8978bf78e3e560723dde221792784325bWu-cheng Li * Sets the exposure compensation index. 1837ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li * 18380402e7da70715c96af90aa95c16d1bedc5199645Wu-cheng Li * @param value exposure compensation index. The valid value range is 18390402e7da70715c96af90aa95c16d1bedc5199645Wu-cheng Li * from {@link #getMinExposureCompensation} (inclusive) to {@link 184024b326a8978bf78e3e560723dde221792784325bWu-cheng Li * #getMaxExposureCompensation} (inclusive). 0 means exposure is 184124b326a8978bf78e3e560723dde221792784325bWu-cheng Li * not adjusted. Application should call 184224b326a8978bf78e3e560723dde221792784325bWu-cheng Li * getMinExposureCompensation and getMaxExposureCompensation to 184324b326a8978bf78e3e560723dde221792784325bWu-cheng Li * know if exposure compensation is supported. 1844ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li */ 1845ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li public void setExposureCompensation(int value) { 1846ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li set(KEY_EXPOSURE_COMPENSATION, value); 1847ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li } 1848ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li 1849ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li /** 185024b326a8978bf78e3e560723dde221792784325bWu-cheng Li * Gets the maximum exposure compensation index. 1851ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li * 185224b326a8978bf78e3e560723dde221792784325bWu-cheng Li * @return maximum exposure compensation index (>=0). If both this 185324b326a8978bf78e3e560723dde221792784325bWu-cheng Li * method and {@link #getMinExposureCompensation} return 0, 185424b326a8978bf78e3e560723dde221792784325bWu-cheng Li * exposure compensation is not supported. 185524b326a8978bf78e3e560723dde221792784325bWu-cheng Li */ 185624b326a8978bf78e3e560723dde221792784325bWu-cheng Li public int getMaxExposureCompensation() { 185724b326a8978bf78e3e560723dde221792784325bWu-cheng Li return getInt(KEY_MAX_EXPOSURE_COMPENSATION, 0); 185824b326a8978bf78e3e560723dde221792784325bWu-cheng Li } 185924b326a8978bf78e3e560723dde221792784325bWu-cheng Li 186024b326a8978bf78e3e560723dde221792784325bWu-cheng Li /** 186124b326a8978bf78e3e560723dde221792784325bWu-cheng Li * Gets the minimum exposure compensation index. 186224b326a8978bf78e3e560723dde221792784325bWu-cheng Li * 186324b326a8978bf78e3e560723dde221792784325bWu-cheng Li * @return minimum exposure compensation index (<=0). If both this 186424b326a8978bf78e3e560723dde221792784325bWu-cheng Li * method and {@link #getMaxExposureCompensation} return 0, 186524b326a8978bf78e3e560723dde221792784325bWu-cheng Li * exposure compensation is not supported. 1866ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li */ 186724b326a8978bf78e3e560723dde221792784325bWu-cheng Li public int getMinExposureCompensation() { 186824b326a8978bf78e3e560723dde221792784325bWu-cheng Li return getInt(KEY_MIN_EXPOSURE_COMPENSATION, 0); 186924b326a8978bf78e3e560723dde221792784325bWu-cheng Li } 187024b326a8978bf78e3e560723dde221792784325bWu-cheng Li 187124b326a8978bf78e3e560723dde221792784325bWu-cheng Li /** 187224b326a8978bf78e3e560723dde221792784325bWu-cheng Li * Gets the exposure compensation step. 187324b326a8978bf78e3e560723dde221792784325bWu-cheng Li * 187424b326a8978bf78e3e560723dde221792784325bWu-cheng Li * @return exposure compensation step. Applications can get EV by 187524b326a8978bf78e3e560723dde221792784325bWu-cheng Li * multiplying the exposure compensation index and step. Ex: if 187624b326a8978bf78e3e560723dde221792784325bWu-cheng Li * exposure compensation index is -6 and step is 0.333333333, EV 187724b326a8978bf78e3e560723dde221792784325bWu-cheng Li * is -2. 187824b326a8978bf78e3e560723dde221792784325bWu-cheng Li */ 187924b326a8978bf78e3e560723dde221792784325bWu-cheng Li public float getExposureCompensationStep() { 188024b326a8978bf78e3e560723dde221792784325bWu-cheng Li return getFloat(KEY_EXPOSURE_COMPENSATION_STEP, 0); 1881ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li } 1882ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li 1883ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li /** 188436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * Gets current zoom value. This also works when smooth zoom is in 18858cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * progress. Applications should check {@link #isZoomSupported} before 18868cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * using this method. 188736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 188836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @return the current zoom value. The range is 0 to {@link 18898cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * #getMaxZoom}. 0 means the camera is not zoomed. 189036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 189136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li public int getZoom() { 18928cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li return getInt(KEY_ZOOM, 0); 189336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li } 189436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 189536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 18968cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * Sets current zoom value. If the camera is zoomed (value > 0), the 18978cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * actual picture size may be smaller than picture size setting. 18988cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * Applications can check the actual picture size after picture is 18998cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * returned from {@link PictureCallback}. The preview size remains the 19008cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * same in zoom. Applications should check {@link #isZoomSupported} 19018cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * before using this method. 190236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 190336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @param value zoom value. The valid range is 0 to {@link #getMaxZoom}. 190436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 190536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li public void setZoom(int value) { 19068cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li set(KEY_ZOOM, value); 190736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li } 190836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 190936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 191036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * Returns true if zoom is supported. Applications should call this 191136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * before using other zoom methods. 191236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 191336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @return true if zoom is supported. 191436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 191536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li public boolean isZoomSupported() { 19168cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li String str = get(KEY_ZOOM_SUPPORTED); 19178cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li return TRUE.equals(str); 191836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li } 191936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 192036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 192136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * Gets the maximum zoom value allowed for snapshot. This is the maximum 192236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * value that applications can set to {@link #setZoom(int)}. 19238cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * Applications should call {@link #isZoomSupported} before using this 19248cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * method. This value may change in different preview size. Applications 19258cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * should call this again after setting preview size. 192636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 192736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @return the maximum zoom value supported by the camera. 192836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 192936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li public int getMaxZoom() { 19308cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li return getInt(KEY_MAX_ZOOM, 0); 193136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li } 193236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 193336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 19348cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * Gets the zoom ratios of all zoom values. Applications should check 19358cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * {@link #isZoomSupported} before using this method. 193636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 19378cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * @return the zoom ratios in 1/100 increments. Ex: a zoom of 3.2x is 19388cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * returned as 320. The number of elements is {@link 19398cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * #getMaxZoom} + 1. The list is sorted from small to large. The 19408cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * first element is always 100. The last element is the zoom 19418cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li * ratio of the maximum zoom value. 194236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 19438cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li public List<Integer> getZoomRatios() { 19448cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li return splitInt(get(KEY_ZOOM_RATIOS)); 194536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li } 194636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 194736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li /** 194836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * Returns true if smooth zoom is supported. Applications should call 194936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * this before using other smooth zoom methods. 195036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * 195136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li * @return true if smooth zoom is supported. 195236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li */ 195336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li public boolean isSmoothZoomSupported() { 19548cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li String str = get(KEY_SMOOTH_ZOOM_SUPPORTED); 19558cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li return TRUE.equals(str); 195636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li } 195736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 19589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Splits a comma delimited string to an ArrayList of String. 19599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Return null if the passing string is null or the size is 0. 19609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private ArrayList<String> split(String str) { 19619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (str == null) return null; 19629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 19639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Use StringTokenizer because it is faster than split. 19649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li StringTokenizer tokenizer = new StringTokenizer(str, ","); 19659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li ArrayList<String> substrings = new ArrayList<String>(); 19669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li while (tokenizer.hasMoreElements()) { 19679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li substrings.add(tokenizer.nextToken()); 19689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 19699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return substrings; 19709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 19719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 19729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Splits a comma delimited string to an ArrayList of Integer. 19739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Return null if the passing string is null or the size is 0. 19749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private ArrayList<Integer> splitInt(String str) { 19759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (str == null) return null; 19769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 19779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li StringTokenizer tokenizer = new StringTokenizer(str, ","); 19789b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li ArrayList<Integer> substrings = new ArrayList<Integer>(); 19799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li while (tokenizer.hasMoreElements()) { 19809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String token = tokenizer.nextToken(); 19819b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li substrings.add(Integer.parseInt(token)); 19829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 19839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (substrings.size() == 0) return null; 19849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return substrings; 19859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 19869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 198724b326a8978bf78e3e560723dde221792784325bWu-cheng Li // Returns the value of a float parameter. 198824b326a8978bf78e3e560723dde221792784325bWu-cheng Li private float getFloat(String key, float defaultValue) { 198924b326a8978bf78e3e560723dde221792784325bWu-cheng Li try { 199024b326a8978bf78e3e560723dde221792784325bWu-cheng Li return Float.parseFloat(mMap.get(key)); 199124b326a8978bf78e3e560723dde221792784325bWu-cheng Li } catch (NumberFormatException ex) { 199224b326a8978bf78e3e560723dde221792784325bWu-cheng Li return defaultValue; 199324b326a8978bf78e3e560723dde221792784325bWu-cheng Li } 199424b326a8978bf78e3e560723dde221792784325bWu-cheng Li } 199524b326a8978bf78e3e560723dde221792784325bWu-cheng Li 199624b326a8978bf78e3e560723dde221792784325bWu-cheng Li // Returns the value of a integer parameter. 199724b326a8978bf78e3e560723dde221792784325bWu-cheng Li private int getInt(String key, int defaultValue) { 199824b326a8978bf78e3e560723dde221792784325bWu-cheng Li try { 199924b326a8978bf78e3e560723dde221792784325bWu-cheng Li return Integer.parseInt(mMap.get(key)); 200024b326a8978bf78e3e560723dde221792784325bWu-cheng Li } catch (NumberFormatException ex) { 200124b326a8978bf78e3e560723dde221792784325bWu-cheng Li return defaultValue; 200224b326a8978bf78e3e560723dde221792784325bWu-cheng Li } 200324b326a8978bf78e3e560723dde221792784325bWu-cheng Li } 200424b326a8978bf78e3e560723dde221792784325bWu-cheng Li 20059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Splits a comma delimited string to an ArrayList of Size. 20069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Return null if the passing string is null or the size is 0. 20079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private ArrayList<Size> splitSize(String str) { 20089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (str == null) return null; 20099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 20109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li StringTokenizer tokenizer = new StringTokenizer(str, ","); 20119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li ArrayList<Size> sizeList = new ArrayList<Size>(); 20129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li while (tokenizer.hasMoreElements()) { 20139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li Size size = strToSize(tokenizer.nextToken()); 20149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (size != null) sizeList.add(size); 20159b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 20169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (sizeList.size() == 0) return null; 20179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return sizeList; 20189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 20199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 20209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Parses a string (ex: "480x320") to Size object. 20219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li // Return null if the passing string is null. 20229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li private Size strToSize(String str) { 20239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (str == null) return null; 20249b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li 20259b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li int pos = str.indexOf('x'); 20269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li if (pos != -1) { 20279b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String width = str.substring(0, pos); 20289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li String height = str.substring(pos + 1); 20299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return new Size(Integer.parseInt(width), 20309b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li Integer.parseInt(height)); 20319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 20329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li Log.e(TAG, "Invalid size parameter string=" + str); 20339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li return null; 20349b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li } 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2037