OSDN Git Service

4e510809bf5e403751326793e5ff4715a36d5b7d
[android-x86/frameworks-base.git] / core / java / android / hardware / Camera.java
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package android.hardware;
18
19 import android.app.ActivityThread;
20 import android.annotation.SdkConstant;
21 import android.annotation.SdkConstant.SdkConstantType;
22 import android.content.Context;
23 import android.graphics.ImageFormat;
24 import android.graphics.Point;
25 import android.graphics.Rect;
26 import android.graphics.SurfaceTexture;
27 import android.media.IAudioService;
28 import android.os.Handler;
29 import android.os.IBinder;
30 import android.os.Looper;
31 import android.os.Message;
32 import android.os.RemoteException;
33 import android.os.ServiceManager;
34 import android.util.Log;
35 import android.text.TextUtils;
36 import android.view.Surface;
37 import android.view.SurfaceHolder;
38
39 import java.io.IOException;
40 import java.lang.ref.WeakReference;
41 import java.util.ArrayList;
42 import java.util.HashMap;
43 import java.util.List;
44 import java.util.concurrent.locks.ReentrantLock;
45
46 /**
47  * The Camera class is used to set image capture settings, start/stop preview,
48  * snap pictures, and retrieve frames for encoding for video.  This class is a
49  * client for the Camera service, which manages the actual camera hardware.
50  *
51  * <p>To access the device camera, you must declare the
52  * {@link android.Manifest.permission#CAMERA} permission in your Android
53  * Manifest. Also be sure to include the
54  * <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">&lt;uses-feature></a>
55  * manifest element to declare camera features used by your application.
56  * For example, if you use the camera and auto-focus feature, your Manifest
57  * should include the following:</p>
58  * <pre> &lt;uses-permission android:name="android.permission.CAMERA" />
59  * &lt;uses-feature android:name="android.hardware.camera" />
60  * &lt;uses-feature android:name="android.hardware.camera.autofocus" /></pre>
61  *
62  * <p>To take pictures with this class, use the following steps:</p>
63  *
64  * <ol>
65  * <li>Obtain an instance of Camera from {@link #open(int)}.
66  *
67  * <li>Get existing (default) settings with {@link #getParameters()}.
68  *
69  * <li>If necessary, modify the returned {@link Camera.Parameters} object and call
70  * {@link #setParameters(Camera.Parameters)}.
71  *
72  * <li>If desired, call {@link #setDisplayOrientation(int)}.
73  *
74  * <li><b>Important</b>: Pass a fully initialized {@link SurfaceHolder} to
75  * {@link #setPreviewDisplay(SurfaceHolder)}.  Without a surface, the camera
76  * will be unable to start the preview.
77  *
78  * <li><b>Important</b>: Call {@link #startPreview()} to start updating the
79  * preview surface.  Preview must be started before you can take a picture.
80  *
81  * <li>When you want, call {@link #takePicture(Camera.ShutterCallback,
82  * Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)} to
83  * capture a photo.  Wait for the callbacks to provide the actual image data.
84  *
85  * <li>After taking a picture, preview display will have stopped.  To take more
86  * photos, call {@link #startPreview()} again first.
87  *
88  * <li>Call {@link #stopPreview()} to stop updating the preview surface.
89  *
90  * <li><b>Important:</b> Call {@link #release()} to release the camera for
91  * use by other applications.  Applications should release the camera
92  * immediately in {@link android.app.Activity#onPause()} (and re-{@link #open()}
93  * it in {@link android.app.Activity#onResume()}).
94  * </ol>
95  *
96  * <p>To quickly switch to video recording mode, use these steps:</p>
97  *
98  * <ol>
99  * <li>Obtain and initialize a Camera and start preview as described above.
100  *
101  * <li>Call {@link #unlock()} to allow the media process to access the camera.
102  *
103  * <li>Pass the camera to {@link android.media.MediaRecorder#setCamera(Camera)}.
104  * See {@link android.media.MediaRecorder} information about video recording.
105  *
106  * <li>When finished recording, call {@link #reconnect()} to re-acquire
107  * and re-lock the camera.
108  *
109  * <li>If desired, restart preview and take more photos or videos.
110  *
111  * <li>Call {@link #stopPreview()} and {@link #release()} as described above.
112  * </ol>
113  *
114  * <p>This class is not thread-safe, and is meant for use from one event thread.
115  * Most long-running operations (preview, focus, photo capture, etc) happen
116  * asynchronously and invoke callbacks as necessary.  Callbacks will be invoked
117  * on the event thread {@link #open(int)} was called from.  This class's methods
118  * must never be called from multiple threads at once.</p>
119  *
120  * <p class="caution"><strong>Caution:</strong> Different Android-powered devices
121  * may have different hardware specifications, such as megapixel ratings and
122  * auto-focus capabilities. In order for your application to be compatible with
123  * more devices, you should not make assumptions about the device camera
124  * specifications.</p>
125  *
126  * <div class="special reference">
127  * <h3>Developer Guides</h3>
128  * <p>For more information about using cameras, read the
129  * <a href="{@docRoot}guide/topics/media/camera.html">Camera</a> developer guide.</p>
130  * </div>
131  */
132 public class Camera {
133     private static final String TAG = "Camera";
134
135     // These match the enums in frameworks/base/include/camera/Camera.h
136     private static final int CAMERA_MSG_ERROR            = 0x001;
137     private static final int CAMERA_MSG_SHUTTER          = 0x002;
138     private static final int CAMERA_MSG_FOCUS            = 0x004;
139     private static final int CAMERA_MSG_ZOOM             = 0x008;
140     private static final int CAMERA_MSG_PREVIEW_FRAME    = 0x010;
141     private static final int CAMERA_MSG_VIDEO_FRAME      = 0x020;
142     private static final int CAMERA_MSG_POSTVIEW_FRAME   = 0x040;
143     private static final int CAMERA_MSG_RAW_IMAGE        = 0x080;
144     private static final int CAMERA_MSG_COMPRESSED_IMAGE = 0x100;
145     private static final int CAMERA_MSG_RAW_IMAGE_NOTIFY = 0x200;
146     private static final int CAMERA_MSG_PREVIEW_METADATA = 0x400;
147     private static final int CAMERA_MSG_FOCUS_MOVE       = 0x800;
148
149     private int mNativeContext; // accessed by native methods
150     private EventHandler mEventHandler;
151     private ShutterCallback mShutterCallback;
152     private PictureCallback mRawImageCallback;
153     private PictureCallback mJpegCallback;
154     private PreviewCallback mPreviewCallback;
155     private PictureCallback mPostviewCallback;
156     private AutoFocusCallback mAutoFocusCallback;
157     private AutoFocusMoveCallback mAutoFocusMoveCallback;
158     private OnZoomChangeListener mZoomListener;
159     private FaceDetectionListener mFaceListener;
160     private ErrorCallback mErrorCallback;
161     private boolean mOneShot;
162     private boolean mWithBuffer;
163     private boolean mFaceDetectionRunning = false;
164     private Object mAutoFocusCallbackLock = new Object();
165
166     /**
167      * Broadcast Action:  A new picture is taken by the camera, and the entry of
168      * the picture has been added to the media store.
169      * {@link android.content.Intent#getData} is URI of the picture.
170      */
171     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
172     public static final String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE";
173
174     /**
175      * Broadcast Action:  A new video is recorded by the camera, and the entry
176      * of the video has been added to the media store.
177      * {@link android.content.Intent#getData} is URI of the video.
178      */
179     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
180     public static final String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
181
182     /**
183      * Hardware face detection. It does not use much CPU.
184      */
185     private static final int CAMERA_FACE_DETECTION_HW = 0;
186
187     /**
188      * Software face detection. It uses some CPU.
189      */
190     private static final int CAMERA_FACE_DETECTION_SW = 1;
191
192     /**
193      * Returns the number of physical cameras available on this device.
194      */
195     public native static int getNumberOfCameras();
196
197     /**
198      * Returns the information about a particular camera.
199      * If {@link #getNumberOfCameras()} returns N, the valid id is 0 to N-1.
200      */
201     public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) {
202         _getCameraInfo(cameraId, cameraInfo);
203         IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
204         IAudioService audioService = IAudioService.Stub.asInterface(b);
205         try {
206             if (audioService.isCameraSoundForced()) {
207                 // Only set this when sound is forced; otherwise let native code
208                 // decide.
209                 cameraInfo.canDisableShutterSound = false;
210             }
211         } catch (RemoteException e) {
212             Log.e(TAG, "Audio service is unavailable for queries");
213         }
214     }
215     private native static void _getCameraInfo(int cameraId, CameraInfo cameraInfo);
216
217     /**
218      * Information about a camera
219      */
220     public static class CameraInfo {
221         /**
222          * The facing of the camera is opposite to that of the screen.
223          */
224         public static final int CAMERA_FACING_BACK = 0;
225
226         /**
227          * The facing of the camera is the same as that of the screen.
228          */
229         public static final int CAMERA_FACING_FRONT = 1;
230
231         /**
232          * The direction that the camera faces. It should be
233          * CAMERA_FACING_BACK or CAMERA_FACING_FRONT.
234          */
235         public int facing;
236
237         /**
238          * <p>The orientation of the camera image. The value is the angle that the
239          * camera image needs to be rotated clockwise so it shows correctly on
240          * the display in its natural orientation. It should be 0, 90, 180, or 270.</p>
241          *
242          * <p>For example, suppose a device has a naturally tall screen. The
243          * back-facing camera sensor is mounted in landscape. You are looking at
244          * the screen. If the top side of the camera sensor is aligned with the
245          * right edge of the screen in natural orientation, the value should be
246          * 90. If the top side of a front-facing camera sensor is aligned with
247          * the right of the screen, the value should be 270.</p>
248          *
249          * @see #setDisplayOrientation(int)
250          * @see Parameters#setRotation(int)
251          * @see Parameters#setPreviewSize(int, int)
252          * @see Parameters#setPictureSize(int, int)
253          * @see Parameters#setJpegThumbnailSize(int, int)
254          */
255         public int orientation;
256
257         /**
258          * <p>Whether the shutter sound can be disabled.</p>
259          *
260          * <p>On some devices, the camera shutter sound cannot be turned off
261          * through {@link #enableShutterSound enableShutterSound}. This field
262          * can be used to determine whether a call to disable the shutter sound
263          * will succeed.</p>
264          *
265          * <p>If this field is set to true, then a call of
266          * {@code enableShutterSound(false)} will be successful. If set to
267          * false, then that call will fail, and the shutter sound will be played
268          * when {@link Camera#takePicture takePicture} is called.</p>
269          */
270         public boolean canDisableShutterSound;
271     };
272
273     /**
274      * Creates a new Camera object to access a particular hardware camera. If
275      * the same camera is opened by other applications, this will throw a
276      * RuntimeException.
277      *
278      * <p>You must call {@link #release()} when you are done using the camera,
279      * otherwise it will remain locked and be unavailable to other applications.
280      *
281      * <p>Your application should only have one Camera object active at a time
282      * for a particular hardware camera.
283      *
284      * <p>Callbacks from other methods are delivered to the event loop of the
285      * thread which called open().  If this thread has no event loop, then
286      * callbacks are delivered to the main application event loop.  If there
287      * is no main application event loop, callbacks are not delivered.
288      *
289      * <p class="caution"><b>Caution:</b> On some devices, this method may
290      * take a long time to complete.  It is best to call this method from a
291      * worker thread (possibly using {@link android.os.AsyncTask}) to avoid
292      * blocking the main application UI thread.
293      *
294      * @param cameraId the hardware camera to access, between 0 and
295      *     {@link #getNumberOfCameras()}-1.
296      * @return a new Camera object, connected, locked and ready for use.
297      * @throws RuntimeException if opening the camera fails (for example, if the
298      *     camera is in use by another process or device policy manager has
299      *     disabled the camera).
300      * @see android.app.admin.DevicePolicyManager#getCameraDisabled(android.content.ComponentName)
301      */
302     public static Camera open(int cameraId) {
303         return new Camera(cameraId);
304     }
305
306     /**
307      * Creates a new Camera object to access the first back-facing camera on the
308      * device. If the device does not have a back-facing camera, this returns
309      * null.
310      * @see #open(int)
311      */
312     public static Camera open() {
313         int numberOfCameras = getNumberOfCameras();
314         CameraInfo cameraInfo = new CameraInfo();
315         for (int i = 0; i < numberOfCameras; i++) {
316             getCameraInfo(i, cameraInfo);
317             if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
318                 return new Camera(i);
319             }
320         }
321         return null;
322     }
323
324     Camera(int cameraId) {
325         mShutterCallback = null;
326         mRawImageCallback = null;
327         mJpegCallback = null;
328         mPreviewCallback = null;
329         mPostviewCallback = null;
330         mZoomListener = null;
331
332         Looper looper;
333         if ((looper = Looper.myLooper()) != null) {
334             mEventHandler = new EventHandler(this, looper);
335         } else if ((looper = Looper.getMainLooper()) != null) {
336             mEventHandler = new EventHandler(this, looper);
337         } else {
338             mEventHandler = null;
339         }
340
341         String packageName = ActivityThread.currentPackageName();
342
343         native_setup(new WeakReference<Camera>(this), cameraId, packageName);
344     }
345
346     /**
347      * An empty Camera for testing purpose.
348      */
349     Camera() {
350     }
351
352     protected void finalize() {
353         release();
354     }
355
356     private native final void native_setup(Object camera_this, int cameraId,
357                                            String packageName);
358
359     private native final void native_release();
360
361
362     /**
363      * Disconnects and releases the Camera object resources.
364      *
365      * <p>You must call this as soon as you're done with the Camera object.</p>
366      */
367     public final void release() {
368         native_release();
369         mFaceDetectionRunning = false;
370     }
371
372     /**
373      * Unlocks the camera to allow another process to access it.
374      * Normally, the camera is locked to the process with an active Camera
375      * object until {@link #release()} is called.  To allow rapid handoff
376      * between processes, you can call this method to release the camera
377      * temporarily for another process to use; once the other process is done
378      * you can call {@link #reconnect()} to reclaim the camera.
379      *
380      * <p>This must be done before calling
381      * {@link android.media.MediaRecorder#setCamera(Camera)}. This cannot be
382      * called after recording starts.
383      *
384      * <p>If you are not recording video, you probably do not need this method.
385      *
386      * @throws RuntimeException if the camera cannot be unlocked.
387      */
388     public native final void unlock();
389
390     /**
391      * Re-locks the camera to prevent other processes from accessing it.
392      * Camera objects are locked by default unless {@link #unlock()} is
393      * called.  Normally {@link #reconnect()} is used instead.
394      *
395      * <p>Since API level 14, camera is automatically locked for applications in
396      * {@link android.media.MediaRecorder#start()}. Applications can use the
397      * camera (ex: zoom) after recording starts. There is no need to call this
398      * after recording starts or stops.
399      *
400      * <p>If you are not recording video, you probably do not need this method.
401      *
402      * @throws RuntimeException if the camera cannot be re-locked (for
403      *     example, if the camera is still in use by another process).
404      */
405     public native final void lock();
406
407     /**
408      * Reconnects to the camera service after another process used it.
409      * After {@link #unlock()} is called, another process may use the
410      * camera; when the process is done, you must reconnect to the camera,
411      * which will re-acquire the lock and allow you to continue using the
412      * camera.
413      *
414      * <p>Since API level 14, camera is automatically locked for applications in
415      * {@link android.media.MediaRecorder#start()}. Applications can use the
416      * camera (ex: zoom) after recording starts. There is no need to call this
417      * after recording starts or stops.
418      *
419      * <p>If you are not recording video, you probably do not need this method.
420      *
421      * @throws IOException if a connection cannot be re-established (for
422      *     example, if the camera is still in use by another process).
423      */
424     public native final void reconnect() throws IOException;
425
426     /**
427      * Sets the {@link Surface} to be used for live preview.
428      * Either a surface or surface texture is necessary for preview, and
429      * preview is necessary to take pictures.  The same surface can be re-set
430      * without harm.  Setting a preview surface will un-set any preview surface
431      * texture that was set via {@link #setPreviewTexture}.
432      *
433      * <p>The {@link SurfaceHolder} must already contain a surface when this
434      * method is called.  If you are using {@link android.view.SurfaceView},
435      * you will need to register a {@link SurfaceHolder.Callback} with
436      * {@link SurfaceHolder#addCallback(SurfaceHolder.Callback)} and wait for
437      * {@link SurfaceHolder.Callback#surfaceCreated(SurfaceHolder)} before
438      * calling setPreviewDisplay() or starting preview.
439      *
440      * <p>This method must be called before {@link #startPreview()}.  The
441      * one exception is that if the preview surface is not set (or set to null)
442      * before startPreview() is called, then this method may be called once
443      * with a non-null parameter to set the preview surface.  (This allows
444      * camera setup and surface creation to happen in parallel, saving time.)
445      * The preview surface may not otherwise change while preview is running.
446      *
447      * @param holder containing the Surface on which to place the preview,
448      *     or null to remove the preview surface
449      * @throws IOException if the method fails (for example, if the surface
450      *     is unavailable or unsuitable).
451      */
452     public final void setPreviewDisplay(SurfaceHolder holder) throws IOException {
453         if (holder != null) {
454             setPreviewDisplay(holder.getSurface());
455         } else {
456             setPreviewDisplay((Surface)null);
457         }
458     }
459
460     private native final void setPreviewDisplay(Surface surface) throws IOException;
461
462     /**
463      * Sets the {@link SurfaceTexture} to be used for live preview.
464      * Either a surface or surface texture is necessary for preview, and
465      * preview is necessary to take pictures.  The same surface texture can be
466      * re-set without harm.  Setting a preview surface texture will un-set any
467      * preview surface that was set via {@link #setPreviewDisplay}.
468      *
469      * <p>This method must be called before {@link #startPreview()}.  The
470      * one exception is that if the preview surface texture is not set (or set
471      * to null) before startPreview() is called, then this method may be called
472      * once with a non-null parameter to set the preview surface.  (This allows
473      * camera setup and surface creation to happen in parallel, saving time.)
474      * The preview surface texture may not otherwise change while preview is
475      * running.
476      *
477      * <p>The timestamps provided by {@link SurfaceTexture#getTimestamp()} for a
478      * SurfaceTexture set as the preview texture have an unspecified zero point,
479      * and cannot be directly compared between different cameras or different
480      * instances of the same camera, or across multiple runs of the same
481      * program.
482      *
483      * <p>If you are using the preview data to create video or still images,
484      * strongly consider using {@link android.media.MediaActionSound} to
485      * properly indicate image capture or recording start/stop to the user.</p>
486      *
487      * @see android.media.MediaActionSound
488      * @see android.graphics.SurfaceTexture
489      * @see android.view.TextureView
490      * @param surfaceTexture the {@link SurfaceTexture} to which the preview
491      *     images are to be sent or null to remove the current preview surface
492      *     texture
493      * @throws IOException if the method fails (for example, if the surface
494      *     texture is unavailable or unsuitable).
495      */
496     public native final void setPreviewTexture(SurfaceTexture surfaceTexture) throws IOException;
497
498     /**
499      * Callback interface used to deliver copies of preview frames as
500      * they are displayed.
501      *
502      * @see #setPreviewCallback(Camera.PreviewCallback)
503      * @see #setOneShotPreviewCallback(Camera.PreviewCallback)
504      * @see #setPreviewCallbackWithBuffer(Camera.PreviewCallback)
505      * @see #startPreview()
506      */
507     public interface PreviewCallback
508     {
509         /**
510          * Called as preview frames are displayed.  This callback is invoked
511          * on the event thread {@link #open(int)} was called from.
512          *
513          * <p>If using the {@link android.graphics.ImageFormat#YV12} format,
514          * refer to the equations in {@link Camera.Parameters#setPreviewFormat}
515          * for the arrangement of the pixel data in the preview callback
516          * buffers.
517          *
518          * @param data the contents of the preview frame in the format defined
519          *  by {@link android.graphics.ImageFormat}, which can be queried
520          *  with {@link android.hardware.Camera.Parameters#getPreviewFormat()}.
521          *  If {@link android.hardware.Camera.Parameters#setPreviewFormat(int)}
522          *             is never called, the default will be the YCbCr_420_SP
523          *             (NV21) format.
524          * @param camera the Camera service object.
525          */
526         void onPreviewFrame(byte[] data, Camera camera);
527     };
528
529     /**
530      * Starts capturing and drawing preview frames to the screen.
531      * Preview will not actually start until a surface is supplied
532      * with {@link #setPreviewDisplay(SurfaceHolder)} or
533      * {@link #setPreviewTexture(SurfaceTexture)}.
534      *
535      * <p>If {@link #setPreviewCallback(Camera.PreviewCallback)},
536      * {@link #setOneShotPreviewCallback(Camera.PreviewCallback)}, or
537      * {@link #setPreviewCallbackWithBuffer(Camera.PreviewCallback)} were
538      * called, {@link Camera.PreviewCallback#onPreviewFrame(byte[], Camera)}
539      * will be called when preview data becomes available.
540      */
541     public native final void startPreview();
542
543     /**
544      * Stops capturing and drawing preview frames to the surface, and
545      * resets the camera for a future call to {@link #startPreview()}.
546      */
547     public final void stopPreview() {
548         _stopPreview();
549         mFaceDetectionRunning = false;
550
551         mShutterCallback = null;
552         mRawImageCallback = null;
553         mPostviewCallback = null;
554         mJpegCallback = null;
555         synchronized (mAutoFocusCallbackLock) {
556             mAutoFocusCallback = null;
557         }
558         mAutoFocusMoveCallback = null;
559     }
560
561     private native final void _stopPreview();
562
563     /**
564      * Return current preview state.
565      *
566      * FIXME: Unhide before release
567      * @hide
568      */
569     public native final boolean previewEnabled();
570
571     /**
572      * <p>Installs a callback to be invoked for every preview frame in addition
573      * to displaying them on the screen.  The callback will be repeatedly called
574      * for as long as preview is active.  This method can be called at any time,
575      * even while preview is live.  Any other preview callbacks are
576      * overridden.</p>
577      *
578      * <p>If you are using the preview data to create video or still images,
579      * strongly consider using {@link android.media.MediaActionSound} to
580      * properly indicate image capture or recording start/stop to the user.</p>
581      *
582      * @param cb a callback object that receives a copy of each preview frame,
583      *     or null to stop receiving callbacks.
584      * @see android.media.MediaActionSound
585      */
586     public final void setPreviewCallback(PreviewCallback cb) {
587         mPreviewCallback = cb;
588         mOneShot = false;
589         mWithBuffer = false;
590         // Always use one-shot mode. We fake camera preview mode by
591         // doing one-shot preview continuously.
592         setHasPreviewCallback(cb != null, false);
593     }
594
595     /**
596      * <p>Installs a callback to be invoked for the next preview frame in
597      * addition to displaying it on the screen.  After one invocation, the
598      * callback is cleared. This method can be called any time, even when
599      * preview is live.  Any other preview callbacks are overridden.</p>
600      *
601      * <p>If you are using the preview data to create video or still images,
602      * strongly consider using {@link android.media.MediaActionSound} to
603      * properly indicate image capture or recording start/stop to the user.</p>
604      *
605      * @param cb a callback object that receives a copy of the next preview frame,
606      *     or null to stop receiving callbacks.
607      * @see android.media.MediaActionSound
608      */
609     public final void setOneShotPreviewCallback(PreviewCallback cb) {
610         mPreviewCallback = cb;
611         mOneShot = true;
612         mWithBuffer = false;
613         setHasPreviewCallback(cb != null, false);
614     }
615
616     private native final void setHasPreviewCallback(boolean installed, boolean manualBuffer);
617
618     /**
619      * <p>Installs a callback to be invoked for every preview frame, using
620      * buffers supplied with {@link #addCallbackBuffer(byte[])}, in addition to
621      * displaying them on the screen.  The callback will be repeatedly called
622      * for as long as preview is active and buffers are available.  Any other
623      * preview callbacks are overridden.</p>
624      *
625      * <p>The purpose of this method is to improve preview efficiency and frame
626      * rate by allowing preview frame memory reuse.  You must call
627      * {@link #addCallbackBuffer(byte[])} at some point -- before or after
628      * calling this method -- or no callbacks will received.</p>
629      *
630      * <p>The buffer queue will be cleared if this method is called with a null
631      * callback, {@link #setPreviewCallback(Camera.PreviewCallback)} is called,
632      * or {@link #setOneShotPreviewCallback(Camera.PreviewCallback)} is
633      * called.</p>
634      *
635      * <p>If you are using the preview data to create video or still images,
636      * strongly consider using {@link android.media.MediaActionSound} to
637      * properly indicate image capture or recording start/stop to the user.</p>
638      *
639      * @param cb a callback object that receives a copy of the preview frame,
640      *     or null to stop receiving callbacks and clear the buffer queue.
641      * @see #addCallbackBuffer(byte[])
642      * @see android.media.MediaActionSound
643      */
644     public final void setPreviewCallbackWithBuffer(PreviewCallback cb) {
645         mPreviewCallback = cb;
646         mOneShot = false;
647         mWithBuffer = true;
648         setHasPreviewCallback(cb != null, true);
649     }
650
651     /**
652      * Adds a pre-allocated buffer to the preview callback buffer queue.
653      * Applications can add one or more buffers to the queue. When a preview
654      * frame arrives and there is still at least one available buffer, the
655      * buffer will be used and removed from the queue. Then preview callback is
656      * invoked with the buffer. If a frame arrives and there is no buffer left,
657      * the frame is discarded. Applications should add buffers back when they
658      * finish processing the data in them.
659      *
660      * <p>For formats besides YV12, the size of the buffer is determined by
661      * multiplying the preview image width, height, and bytes per pixel. The
662      * width and height can be read from
663      * {@link Camera.Parameters#getPreviewSize()}. Bytes per pixel can be
664      * computed from {@link android.graphics.ImageFormat#getBitsPerPixel(int)} /
665      * 8, using the image format from
666      * {@link Camera.Parameters#getPreviewFormat()}.
667      *
668      * <p>If using the {@link android.graphics.ImageFormat#YV12} format, the
669      * size can be calculated using the equations listed in
670      * {@link Camera.Parameters#setPreviewFormat}.
671      *
672      * <p>This method is only necessary when
673      * {@link #setPreviewCallbackWithBuffer(PreviewCallback)} is used. When
674      * {@link #setPreviewCallback(PreviewCallback)} or
675      * {@link #setOneShotPreviewCallback(PreviewCallback)} are used, buffers
676      * are automatically allocated. When a supplied buffer is too small to
677      * hold the preview frame data, preview callback will return null and
678      * the buffer will be removed from the buffer queue.
679      *
680      * @param callbackBuffer the buffer to add to the queue. The size of the
681      *   buffer must match the values described above.
682      * @see #setPreviewCallbackWithBuffer(PreviewCallback)
683      */
684     public final void addCallbackBuffer(byte[] callbackBuffer)
685     {
686         _addCallbackBuffer(callbackBuffer, CAMERA_MSG_PREVIEW_FRAME);
687     }
688
689     /**
690      * Adds a pre-allocated buffer to the raw image callback buffer queue.
691      * Applications can add one or more buffers to the queue. When a raw image
692      * frame arrives and there is still at least one available buffer, the
693      * buffer will be used to hold the raw image data and removed from the
694      * queue. Then raw image callback is invoked with the buffer. If a raw
695      * image frame arrives but there is no buffer left, the frame is
696      * discarded. Applications should add buffers back when they finish
697      * processing the data in them by calling this method again in order
698      * to avoid running out of raw image callback buffers.
699      *
700      * <p>The size of the buffer is determined by multiplying the raw image
701      * width, height, and bytes per pixel. The width and height can be
702      * read from {@link Camera.Parameters#getPictureSize()}. Bytes per pixel
703      * can be computed from
704      * {@link android.graphics.ImageFormat#getBitsPerPixel(int)} / 8,
705      * using the image format from {@link Camera.Parameters#getPreviewFormat()}.
706      *
707      * <p>This method is only necessary when the PictureCallbck for raw image
708      * is used while calling {@link #takePicture(Camera.ShutterCallback,
709      * Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)}.
710      *
711      * <p>Please note that by calling this method, the mode for
712      * application-managed callback buffers is triggered. If this method has
713      * never been called, null will be returned by the raw image callback since
714      * there is no image callback buffer available. Furthermore, When a supplied
715      * buffer is too small to hold the raw image data, raw image callback will
716      * return null and the buffer will be removed from the buffer queue.
717      *
718      * @param callbackBuffer the buffer to add to the raw image callback buffer
719      *     queue. The size should be width * height * (bits per pixel) / 8. An
720      *     null callbackBuffer will be ignored and won't be added to the queue.
721      *
722      * @see #takePicture(Camera.ShutterCallback,
723      * Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)}.
724      *
725      * {@hide}
726      */
727     public final void addRawImageCallbackBuffer(byte[] callbackBuffer)
728     {
729         addCallbackBuffer(callbackBuffer, CAMERA_MSG_RAW_IMAGE);
730     }
731
732     private final void addCallbackBuffer(byte[] callbackBuffer, int msgType)
733     {
734         // CAMERA_MSG_VIDEO_FRAME may be allowed in the future.
735         if (msgType != CAMERA_MSG_PREVIEW_FRAME &&
736             msgType != CAMERA_MSG_RAW_IMAGE) {
737             throw new IllegalArgumentException(
738                             "Unsupported message type: " + msgType);
739         }
740
741         _addCallbackBuffer(callbackBuffer, msgType);
742     }
743
744     private native final void _addCallbackBuffer(
745                                 byte[] callbackBuffer, int msgType);
746
747     private class EventHandler extends Handler
748     {
749         private Camera mCamera;
750
751         public EventHandler(Camera c, Looper looper) {
752             super(looper);
753             mCamera = c;
754         }
755
756         @Override
757         public void handleMessage(Message msg) {
758             switch(msg.what) {
759             case CAMERA_MSG_SHUTTER:
760                 if (mShutterCallback != null) {
761                     mShutterCallback.onShutter();
762                 }
763                 return;
764
765             case CAMERA_MSG_RAW_IMAGE:
766                 if (mRawImageCallback != null) {
767                     mRawImageCallback.onPictureTaken((byte[])msg.obj, mCamera);
768                 }
769                 return;
770
771             case CAMERA_MSG_COMPRESSED_IMAGE:
772                 if (mJpegCallback != null) {
773                     mJpegCallback.onPictureTaken((byte[])msg.obj, mCamera);
774                 }
775                 return;
776
777             case CAMERA_MSG_PREVIEW_FRAME:
778                 PreviewCallback pCb = mPreviewCallback;
779                 if (pCb != null) {
780                     if (mOneShot) {
781                         // Clear the callback variable before the callback
782                         // in case the app calls setPreviewCallback from
783                         // the callback function
784                         mPreviewCallback = null;
785                     } else if (!mWithBuffer) {
786                         // We're faking the camera preview mode to prevent
787                         // the app from being flooded with preview frames.
788                         // Set to oneshot mode again.
789                         setHasPreviewCallback(true, false);
790                     }
791                     pCb.onPreviewFrame((byte[])msg.obj, mCamera);
792                 }
793                 return;
794
795             case CAMERA_MSG_POSTVIEW_FRAME:
796                 if (mPostviewCallback != null) {
797                     mPostviewCallback.onPictureTaken((byte[])msg.obj, mCamera);
798                 }
799                 return;
800
801             case CAMERA_MSG_FOCUS:
802                 AutoFocusCallback cb = null;
803                 synchronized (mAutoFocusCallbackLock) {
804                     cb = mAutoFocusCallback;
805                 }
806                 if (cb != null) {
807                     boolean success = msg.arg1 == 0 ? false : true;
808                     cb.onAutoFocus(success, mCamera);
809                 }
810                 return;
811
812             case CAMERA_MSG_ZOOM:
813                 if (mZoomListener != null) {
814                     mZoomListener.onZoomChange(msg.arg1, msg.arg2 != 0, mCamera);
815                 }
816                 return;
817
818             case CAMERA_MSG_PREVIEW_METADATA:
819                 if (mFaceListener != null) {
820                     mFaceListener.onFaceDetection((Face[])msg.obj, mCamera);
821                 }
822                 return;
823
824             case CAMERA_MSG_ERROR :
825                 Log.e(TAG, "Error " + msg.arg1);
826                 if (mErrorCallback != null) {
827                     mErrorCallback.onError(msg.arg1, mCamera);
828                 }
829                 return;
830
831             case CAMERA_MSG_FOCUS_MOVE:
832                 if (mAutoFocusMoveCallback != null) {
833                     mAutoFocusMoveCallback.onAutoFocusMoving(msg.arg1 == 0 ? false : true, mCamera);
834                 }
835                 return;
836
837             default:
838                 Log.e(TAG, "Unknown message type " + msg.what);
839                 return;
840             }
841         }
842     }
843
844     private static void postEventFromNative(Object camera_ref,
845                                             int what, int arg1, int arg2, Object obj)
846     {
847         Camera c = (Camera)((WeakReference)camera_ref).get();
848         if (c == null)
849             return;
850
851         if (c.mEventHandler != null) {
852             Message m = c.mEventHandler.obtainMessage(what, arg1, arg2, obj);
853             c.mEventHandler.sendMessage(m);
854         }
855     }
856
857     /**
858      * Callback interface used to notify on completion of camera auto focus.
859      *
860      * <p>Devices that do not support auto-focus will receive a "fake"
861      * callback to this interface. If your application needs auto-focus and
862      * should not be installed on devices <em>without</em> auto-focus, you must
863      * declare that your app uses the
864      * {@code android.hardware.camera.autofocus} feature, in the
865      * <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">&lt;uses-feature></a>
866      * manifest element.</p>
867      *
868      * @see #autoFocus(AutoFocusCallback)
869      */
870     public interface AutoFocusCallback
871     {
872         /**
873          * Called when the camera auto focus completes.  If the camera
874          * does not support auto-focus and autoFocus is called,
875          * onAutoFocus will be called immediately with a fake value of
876          * <code>success</code> set to <code>true</code>.
877          *
878          * The auto-focus routine does not lock auto-exposure and auto-white
879          * balance after it completes.
880          *
881          * @param success true if focus was successful, false if otherwise
882          * @param camera  the Camera service object
883          * @see android.hardware.Camera.Parameters#setAutoExposureLock(boolean)
884          * @see android.hardware.Camera.Parameters#setAutoWhiteBalanceLock(boolean)
885          */
886         void onAutoFocus(boolean success, Camera camera);
887     }
888
889     /**
890      * Starts camera auto-focus and registers a callback function to run when
891      * the camera is focused.  This method is only valid when preview is active
892      * (between {@link #startPreview()} and before {@link #stopPreview()}).
893      *
894      * <p>Callers should check
895      * {@link android.hardware.Camera.Parameters#getFocusMode()} to determine if
896      * this method should be called. If the camera does not support auto-focus,
897      * it is a no-op and {@link AutoFocusCallback#onAutoFocus(boolean, Camera)}
898      * callback will be called immediately.
899      *
900      * <p>If your application should not be installed
901      * on devices without auto-focus, you must declare that your application
902      * uses auto-focus with the
903      * <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">&lt;uses-feature></a>
904      * manifest element.</p>
905      *
906      * <p>If the current flash mode is not
907      * {@link android.hardware.Camera.Parameters#FLASH_MODE_OFF}, flash may be
908      * fired during auto-focus, depending on the driver and camera hardware.<p>
909      *
910      * <p>Auto-exposure lock {@link android.hardware.Camera.Parameters#getAutoExposureLock()}
911      * and auto-white balance locks {@link android.hardware.Camera.Parameters#getAutoWhiteBalanceLock()}
912      * do not change during and after autofocus. But auto-focus routine may stop
913      * auto-exposure and auto-white balance transiently during focusing.
914      *
915      * <p>Stopping preview with {@link #stopPreview()}, or triggering still
916      * image capture with {@link #takePicture(Camera.ShutterCallback,
917      * Camera.PictureCallback, Camera.PictureCallback)}, will not change the
918      * the focus position. Applications must call cancelAutoFocus to reset the
919      * focus.</p>
920      *
921      * <p>If autofocus is successful, consider using
922      * {@link android.media.MediaActionSound} to properly play back an autofocus
923      * success sound to the user.</p>
924      *
925      * @param cb the callback to run
926      * @see #cancelAutoFocus()
927      * @see android.hardware.Camera.Parameters#setAutoExposureLock(boolean)
928      * @see android.hardware.Camera.Parameters#setAutoWhiteBalanceLock(boolean)
929      * @see android.media.MediaActionSound
930      */
931     public final void autoFocus(AutoFocusCallback cb)
932     {
933         synchronized (mAutoFocusCallbackLock) {
934             mAutoFocusCallback = cb;
935         }
936         native_autoFocus();
937     }
938     private native final void native_autoFocus();
939
940     /**
941      * Cancels any auto-focus function in progress.
942      * Whether or not auto-focus is currently in progress,
943      * this function will return the focus position to the default.
944      * If the camera does not support auto-focus, this is a no-op.
945      *
946      * @see #autoFocus(Camera.AutoFocusCallback)
947      */
948     public final void cancelAutoFocus()
949     {
950         synchronized (mAutoFocusCallbackLock) {
951             mAutoFocusCallback = null;
952         }
953         native_cancelAutoFocus();
954         // CAMERA_MSG_FOCUS should be removed here because the following
955         // scenario can happen:
956         // - An application uses the same thread for autoFocus, cancelAutoFocus
957         //   and looper thread.
958         // - The application calls autoFocus.
959         // - HAL sends CAMERA_MSG_FOCUS, which enters the looper message queue.
960         //   Before event handler's handleMessage() is invoked, the application
961         //   calls cancelAutoFocus and autoFocus.
962         // - The application gets the old CAMERA_MSG_FOCUS and thinks autofocus
963         //   has been completed. But in fact it is not.
964         //
965         // As documented in the beginning of the file, apps should not use
966         // multiple threads to call autoFocus and cancelAutoFocus at the same
967         // time. It is HAL's responsibility not to send a CAMERA_MSG_FOCUS
968         // message after native_cancelAutoFocus is called.
969         mEventHandler.removeMessages(CAMERA_MSG_FOCUS);
970     }
971     private native final void native_cancelAutoFocus();
972
973     /**
974      * Callback interface used to notify on auto focus start and stop.
975      *
976      * <p>This is only supported in continuous autofocus modes -- {@link
977      * Parameters#FOCUS_MODE_CONTINUOUS_VIDEO} and {@link
978      * Parameters#FOCUS_MODE_CONTINUOUS_PICTURE}. Applications can show
979      * autofocus animation based on this.</p>
980      */
981     public interface AutoFocusMoveCallback
982     {
983         /**
984          * Called when the camera auto focus starts or stops.
985          *
986          * @param start true if focus starts to move, false if focus stops to move
987          * @param camera the Camera service object
988          */
989         void onAutoFocusMoving(boolean start, Camera camera);
990     }
991
992     /**
993      * Sets camera auto-focus move callback.
994      *
995      * @param cb the callback to run
996      */
997     public void setAutoFocusMoveCallback(AutoFocusMoveCallback cb) {
998         mAutoFocusMoveCallback = cb;
999         enableFocusMoveCallback((mAutoFocusMoveCallback != null) ? 1 : 0);
1000     }
1001
1002     private native void enableFocusMoveCallback(int enable);
1003
1004     /**
1005      * Callback interface used to signal the moment of actual image capture.
1006      *
1007      * @see #takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback)
1008      */
1009     public interface ShutterCallback
1010     {
1011         /**
1012          * Called as near as possible to the moment when a photo is captured
1013          * from the sensor.  This is a good opportunity to play a shutter sound
1014          * or give other feedback of camera operation.  This may be some time
1015          * after the photo was triggered, but some time before the actual data
1016          * is available.
1017          */
1018         void onShutter();
1019     }
1020
1021     /**
1022      * Callback interface used to supply image data from a photo capture.
1023      *
1024      * @see #takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback)
1025      */
1026     public interface PictureCallback {
1027         /**
1028          * Called when image data is available after a picture is taken.
1029          * The format of the data depends on the context of the callback
1030          * and {@link Camera.Parameters} settings.
1031          *
1032          * @param data   a byte array of the picture data
1033          * @param camera the Camera service object
1034          */
1035         void onPictureTaken(byte[] data, Camera camera);
1036     };
1037
1038     /**
1039      * Equivalent to takePicture(shutter, raw, null, jpeg).
1040      *
1041      * @see #takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback)
1042      */
1043     public final void takePicture(ShutterCallback shutter, PictureCallback raw,
1044             PictureCallback jpeg) {
1045         takePicture(shutter, raw, null, jpeg);
1046     }
1047     private native final void native_takePicture(int msgType);
1048
1049     /**
1050      * Triggers an asynchronous image capture. The camera service will initiate
1051      * a series of callbacks to the application as the image capture progresses.
1052      * The shutter callback occurs after the image is captured. This can be used
1053      * to trigger a sound to let the user know that image has been captured. The
1054      * raw callback occurs when the raw image data is available (NOTE: the data
1055      * will be null if there is no raw image callback buffer available or the
1056      * raw image callback buffer is not large enough to hold the raw image).
1057      * The postview callback occurs when a scaled, fully processed postview
1058      * image is available (NOTE: not all hardware supports this). The jpeg
1059      * callback occurs when the compressed image is available. If the
1060      * application does not need a particular callback, a null can be passed
1061      * instead of a callback method.
1062      *
1063      * <p>This method is only valid when preview is active (after
1064      * {@link #startPreview()}).  Preview will be stopped after the image is
1065      * taken; callers must call {@link #startPreview()} again if they want to
1066      * re-start preview or take more pictures. This should not be called between
1067      * {@link android.media.MediaRecorder#start()} and
1068      * {@link android.media.MediaRecorder#stop()}.
1069      *
1070      * <p>After calling this method, you must not call {@link #startPreview()}
1071      * or take another picture until the JPEG callback has returned.
1072      *
1073      * @param shutter   the callback for image capture moment, or null
1074      * @param raw       the callback for raw (uncompressed) image data, or null
1075      * @param postview  callback with postview image data, may be null
1076      * @param jpeg      the callback for JPEG image data, or null
1077      */
1078     public final void takePicture(ShutterCallback shutter, PictureCallback raw,
1079             PictureCallback postview, PictureCallback jpeg) {
1080         mShutterCallback = shutter;
1081         mRawImageCallback = raw;
1082         mPostviewCallback = postview;
1083         mJpegCallback = jpeg;
1084
1085         // If callback is not set, do not send me callbacks.
1086         int msgType = 0;
1087         if (mShutterCallback != null) {
1088             msgType |= CAMERA_MSG_SHUTTER;
1089         }
1090         if (mRawImageCallback != null) {
1091             msgType |= CAMERA_MSG_RAW_IMAGE;
1092         }
1093         if (mPostviewCallback != null) {
1094             msgType |= CAMERA_MSG_POSTVIEW_FRAME;
1095         }
1096         if (mJpegCallback != null) {
1097             msgType |= CAMERA_MSG_COMPRESSED_IMAGE;
1098         }
1099
1100         native_takePicture(msgType);
1101         mFaceDetectionRunning = false;
1102     }
1103
1104     /**
1105      * Zooms to the requested value smoothly. The driver will notify {@link
1106      * OnZoomChangeListener} of the zoom value and whether zoom is stopped at
1107      * the time. For example, suppose the current zoom is 0 and startSmoothZoom
1108      * is called with value 3. The
1109      * {@link Camera.OnZoomChangeListener#onZoomChange(int, boolean, Camera)}
1110      * method will be called three times with zoom values 1, 2, and 3.
1111      * Applications can call {@link #stopSmoothZoom} to stop the zoom earlier.
1112      * Applications should not call startSmoothZoom again or change the zoom
1113      * value before zoom stops. If the supplied zoom value equals to the current
1114      * zoom value, no zoom callback will be generated. This method is supported
1115      * if {@link android.hardware.Camera.Parameters#isSmoothZoomSupported}
1116      * returns true.
1117      *
1118      * @param value zoom value. The valid range is 0 to {@link
1119      *              android.hardware.Camera.Parameters#getMaxZoom}.
1120      * @throws IllegalArgumentException if the zoom value is invalid.
1121      * @throws RuntimeException if the method fails.
1122      * @see #setZoomChangeListener(OnZoomChangeListener)
1123      */
1124     public native final void startSmoothZoom(int value);
1125
1126     /**
1127      * Stops the smooth zoom. Applications should wait for the {@link
1128      * OnZoomChangeListener} to know when the zoom is actually stopped. This
1129      * method is supported if {@link
1130      * android.hardware.Camera.Parameters#isSmoothZoomSupported} is true.
1131      *
1132      * @throws RuntimeException if the method fails.
1133      */
1134     public native final void stopSmoothZoom();
1135
1136     /**
1137      * Set the clockwise rotation of preview display in degrees. This affects
1138      * the preview frames and the picture displayed after snapshot. This method
1139      * is useful for portrait mode applications. Note that preview display of
1140      * front-facing cameras is flipped horizontally before the rotation, that
1141      * is, the image is reflected along the central vertical axis of the camera
1142      * sensor. So the users can see themselves as looking into a mirror.
1143      *
1144      * <p>This does not affect the order of byte array passed in {@link
1145      * PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos. This
1146      * method is not allowed to be called during preview.
1147      *
1148      * <p>If you want to make the camera image show in the same orientation as
1149      * the display, you can use the following code.
1150      * <pre>
1151      * public static void setCameraDisplayOrientation(Activity activity,
1152      *         int cameraId, android.hardware.Camera camera) {
1153      *     android.hardware.Camera.CameraInfo info =
1154      *             new android.hardware.Camera.CameraInfo();
1155      *     android.hardware.Camera.getCameraInfo(cameraId, info);
1156      *     int rotation = activity.getWindowManager().getDefaultDisplay()
1157      *             .getRotation();
1158      *     int degrees = 0;
1159      *     switch (rotation) {
1160      *         case Surface.ROTATION_0: degrees = 0; break;
1161      *         case Surface.ROTATION_90: degrees = 90; break;
1162      *         case Surface.ROTATION_180: degrees = 180; break;
1163      *         case Surface.ROTATION_270: degrees = 270; break;
1164      *     }
1165      *
1166      *     int result;
1167      *     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
1168      *         result = (info.orientation + degrees) % 360;
1169      *         result = (360 - result) % 360;  // compensate the mirror
1170      *     } else {  // back-facing
1171      *         result = (info.orientation - degrees + 360) % 360;
1172      *     }
1173      *     camera.setDisplayOrientation(result);
1174      * }
1175      * </pre>
1176      *
1177      * <p>Starting from API level 14, this method can be called when preview is
1178      * active.
1179      *
1180      * @param degrees the angle that the picture will be rotated clockwise.
1181      *                Valid values are 0, 90, 180, and 270. The starting
1182      *                position is 0 (landscape).
1183      * @see #setPreviewDisplay(SurfaceHolder)
1184      */
1185     public native final void setDisplayOrientation(int degrees);
1186
1187     /**
1188      * <p>Enable or disable the default shutter sound when taking a picture.</p>
1189      *
1190      * <p>By default, the camera plays the system-defined camera shutter sound
1191      * when {@link #takePicture} is called. Using this method, the shutter sound
1192      * can be disabled. It is strongly recommended that an alternative shutter
1193      * sound is played in the {@link ShutterCallback} when the system shutter
1194      * sound is disabled.</p>
1195      *
1196      * <p>Note that devices may not always allow disabling the camera shutter
1197      * sound. If the shutter sound state cannot be set to the desired value,
1198      * this method will return false. {@link CameraInfo#canDisableShutterSound}
1199      * can be used to determine whether the device will allow the shutter sound
1200      * to be disabled.</p>
1201      *
1202      * @param enabled whether the camera should play the system shutter sound
1203      *                when {@link #takePicture takePicture} is called.
1204      * @return {@code true} if the shutter sound state was successfully
1205      *         changed. {@code false} if the shutter sound state could not be
1206      *         changed. {@code true} is also returned if shutter sound playback
1207      *         is already set to the requested state.
1208      * @see #takePicture
1209      * @see CameraInfo#canDisableShutterSound
1210      * @see ShutterCallback
1211      */
1212     public final boolean enableShutterSound(boolean enabled) {
1213         if (!enabled) {
1214             IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
1215             IAudioService audioService = IAudioService.Stub.asInterface(b);
1216             try {
1217                 if (audioService.isCameraSoundForced()) return false;
1218             } catch (RemoteException e) {
1219                 Log.e(TAG, "Audio service is unavailable for queries");
1220             }
1221         }
1222         return _enableShutterSound(enabled);
1223     }
1224
1225     private native final boolean _enableShutterSound(boolean enabled);
1226
1227     /**
1228      * Callback interface for zoom changes during a smooth zoom operation.
1229      *
1230      * @see #setZoomChangeListener(OnZoomChangeListener)
1231      * @see #startSmoothZoom(int)
1232      */
1233     public interface OnZoomChangeListener
1234     {
1235         /**
1236          * Called when the zoom value has changed during a smooth zoom.
1237          *
1238          * @param zoomValue the current zoom value. In smooth zoom mode, camera
1239          *                  calls this for every new zoom value.
1240          * @param stopped whether smooth zoom is stopped. If the value is true,
1241          *                this is the last zoom update for the application.
1242          * @param camera  the Camera service object
1243          */
1244         void onZoomChange(int zoomValue, boolean stopped, Camera camera);
1245     };
1246
1247     /**
1248      * Registers a listener to be notified when the zoom value is updated by the
1249      * camera driver during smooth zoom.
1250      *
1251      * @param listener the listener to notify
1252      * @see #startSmoothZoom(int)
1253      */
1254     public final void setZoomChangeListener(OnZoomChangeListener listener)
1255     {
1256         mZoomListener = listener;
1257     }
1258
1259     /**
1260      * Callback interface for face detected in the preview frame.
1261      *
1262      */
1263     public interface FaceDetectionListener
1264     {
1265         /**
1266          * Notify the listener of the detected faces in the preview frame.
1267          *
1268          * @param faces The detected faces in a list
1269          * @param camera  The {@link Camera} service object
1270          */
1271         void onFaceDetection(Face[] faces, Camera camera);
1272     }
1273
1274     /**
1275      * Registers a listener to be notified about the faces detected in the
1276      * preview frame.
1277      *
1278      * @param listener the listener to notify
1279      * @see #startFaceDetection()
1280      */
1281     public final void setFaceDetectionListener(FaceDetectionListener listener)
1282     {
1283         mFaceListener = listener;
1284     }
1285
1286     /**
1287      * Starts the face detection. This should be called after preview is started.
1288      * The camera will notify {@link FaceDetectionListener} of the detected
1289      * faces in the preview frame. The detected faces may be the same as the
1290      * previous ones. Applications should call {@link #stopFaceDetection} to
1291      * stop the face detection. This method is supported if {@link
1292      * Parameters#getMaxNumDetectedFaces()} returns a number larger than 0.
1293      * If the face detection has started, apps should not call this again.
1294      *
1295      * <p>When the face detection is running, {@link Parameters#setWhiteBalance(String)},
1296      * {@link Parameters#setFocusAreas(List)}, and {@link Parameters#setMeteringAreas(List)}
1297      * have no effect. The camera uses the detected faces to do auto-white balance,
1298      * auto exposure, and autofocus.
1299      *
1300      * <p>If the apps call {@link #autoFocus(AutoFocusCallback)}, the camera
1301      * will stop sending face callbacks. The last face callback indicates the
1302      * areas used to do autofocus. After focus completes, face detection will
1303      * resume sending face callbacks. If the apps call {@link
1304      * #cancelAutoFocus()}, the face callbacks will also resume.</p>
1305      *
1306      * <p>After calling {@link #takePicture(Camera.ShutterCallback, Camera.PictureCallback,
1307      * Camera.PictureCallback)} or {@link #stopPreview()}, and then resuming
1308      * preview with {@link #startPreview()}, the apps should call this method
1309      * again to resume face detection.</p>
1310      *
1311      * @throws IllegalArgumentException if the face detection is unsupported.
1312      * @throws RuntimeException if the method fails or the face detection is
1313      *         already running.
1314      * @see FaceDetectionListener
1315      * @see #stopFaceDetection()
1316      * @see Parameters#getMaxNumDetectedFaces()
1317      */
1318     public final void startFaceDetection() {
1319         if (mFaceDetectionRunning) {
1320             throw new RuntimeException("Face detection is already running");
1321         }
1322         _startFaceDetection(CAMERA_FACE_DETECTION_HW);
1323         mFaceDetectionRunning = true;
1324     }
1325
1326     /**
1327      * Stops the face detection.
1328      *
1329      * @see #startFaceDetection()
1330      */
1331     public final void stopFaceDetection() {
1332         _stopFaceDetection();
1333         mFaceDetectionRunning = false;
1334     }
1335
1336     private native final void _startFaceDetection(int type);
1337     private native final void _stopFaceDetection();
1338
1339     /**
1340      * Information about a face identified through camera face detection.
1341      *
1342      * <p>When face detection is used with a camera, the {@link FaceDetectionListener} returns a
1343      * list of face objects for use in focusing and metering.</p>
1344      *
1345      * @see FaceDetectionListener
1346      */
1347     public static class Face {
1348         /**
1349          * Create an empty face.
1350          */
1351         public Face() {
1352         }
1353
1354         /**
1355          * Bounds of the face. (-1000, -1000) represents the top-left of the
1356          * camera field of view, and (1000, 1000) represents the bottom-right of
1357          * the field of view. For example, suppose the size of the viewfinder UI
1358          * is 800x480. The rect passed from the driver is (-1000, -1000, 0, 0).
1359          * The corresponding viewfinder rect should be (0, 0, 400, 240). It is
1360          * guaranteed left < right and top < bottom. The coordinates can be
1361          * smaller than -1000 or bigger than 1000. But at least one vertex will
1362          * be within (-1000, -1000) and (1000, 1000).
1363          *
1364          * <p>The direction is relative to the sensor orientation, that is, what
1365          * the sensor sees. The direction is not affected by the rotation or
1366          * mirroring of {@link #setDisplayOrientation(int)}. The face bounding
1367          * rectangle does not provide any information about face orientation.</p>
1368          *
1369          * <p>Here is the matrix to convert driver coordinates to View coordinates
1370          * in pixels.</p>
1371          * <pre>
1372          * Matrix matrix = new Matrix();
1373          * CameraInfo info = CameraHolder.instance().getCameraInfo()[cameraId];
1374          * // Need mirror for front camera.
1375          * boolean mirror = (info.facing == CameraInfo.CAMERA_FACING_FRONT);
1376          * matrix.setScale(mirror ? -1 : 1, 1);
1377          * // This is the value for android.hardware.Camera.setDisplayOrientation.
1378          * matrix.postRotate(displayOrientation);
1379          * // Camera driver coordinates range from (-1000, -1000) to (1000, 1000).
1380          * // UI coordinates range from (0, 0) to (width, height).
1381          * matrix.postScale(view.getWidth() / 2000f, view.getHeight() / 2000f);
1382          * matrix.postTranslate(view.getWidth() / 2f, view.getHeight() / 2f);
1383          * </pre>
1384          *
1385          * @see #startFaceDetection()
1386          */
1387         public Rect rect;
1388
1389         /**
1390          * <p>The confidence level for the detection of the face. The range is 1 to
1391          * 100. 100 is the highest confidence.</p>
1392          *
1393          * <p>Depending on the device, even very low-confidence faces may be
1394          * listed, so applications should filter out faces with low confidence,
1395          * depending on the use case. For a typical point-and-shoot camera
1396          * application that wishes to display rectangles around detected faces,
1397          * filtering out faces with confidence less than 50 is recommended.</p>
1398          *
1399          * @see #startFaceDetection()
1400          */
1401         public int score;
1402
1403         /**
1404          * An unique id per face while the face is visible to the tracker. If
1405          * the face leaves the field-of-view and comes back, it will get a new
1406          * id. This is an optional field, may not be supported on all devices.
1407          * If not supported, id will always be set to -1. The optional fields
1408          * are supported as a set. Either they are all valid, or none of them
1409          * are.
1410          */
1411         public int id = -1;
1412
1413         /**
1414          * The coordinates of the center of the left eye. The coordinates are in
1415          * the same space as the ones for {@link #rect}. This is an optional
1416          * field, may not be supported on all devices. If not supported, the
1417          * value will always be set to null. The optional fields are supported
1418          * as a set. Either they are all valid, or none of them are.
1419          */
1420         public Point leftEye = null;
1421
1422         /**
1423          * The coordinates of the center of the right eye. The coordinates are
1424          * in the same space as the ones for {@link #rect}.This is an optional
1425          * field, may not be supported on all devices. If not supported, the
1426          * value will always be set to null. The optional fields are supported
1427          * as a set. Either they are all valid, or none of them are.
1428          */
1429         public Point rightEye = null;
1430
1431         /**
1432          * The coordinates of the center of the mouth.  The coordinates are in
1433          * the same space as the ones for {@link #rect}. This is an optional
1434          * field, may not be supported on all devices. If not supported, the
1435          * value will always be set to null. The optional fields are supported
1436          * as a set. Either they are all valid, or none of them are.
1437          */
1438         public Point mouth = null;
1439     }
1440
1441     // Error codes match the enum in include/ui/Camera.h
1442
1443     /**
1444      * Unspecified camera error.
1445      * @see Camera.ErrorCallback
1446      */
1447     public static final int CAMERA_ERROR_UNKNOWN = 1;
1448
1449     /**
1450      * Media server died. In this case, the application must release the
1451      * Camera object and instantiate a new one.
1452      * @see Camera.ErrorCallback
1453      */
1454     public static final int CAMERA_ERROR_SERVER_DIED = 100;
1455
1456     /**
1457      * Callback interface for camera error notification.
1458      *
1459      * @see #setErrorCallback(ErrorCallback)
1460      */
1461     public interface ErrorCallback
1462     {
1463         /**
1464          * Callback for camera errors.
1465          * @param error   error code:
1466          * <ul>
1467          * <li>{@link #CAMERA_ERROR_UNKNOWN}
1468          * <li>{@link #CAMERA_ERROR_SERVER_DIED}
1469          * </ul>
1470          * @param camera  the Camera service object
1471          */
1472         void onError(int error, Camera camera);
1473     };
1474
1475     /**
1476      * Registers a callback to be invoked when an error occurs.
1477      * @param cb The callback to run
1478      */
1479     public final void setErrorCallback(ErrorCallback cb)
1480     {
1481         mErrorCallback = cb;
1482     }
1483
1484     private native final void native_setParameters(String params);
1485     private native final String native_getParameters();
1486
1487     /**
1488      * Changes the settings for this Camera service.
1489      *
1490      * @param params the Parameters to use for this Camera service
1491      * @throws RuntimeException if any parameter is invalid or not supported.
1492      * @see #getParameters()
1493      */
1494     public void setParameters(Parameters params) {
1495         native_setParameters(params.flatten());
1496     }
1497
1498     /**
1499      * Returns the current settings for this Camera service.
1500      * If modifications are made to the returned Parameters, they must be passed
1501      * to {@link #setParameters(Camera.Parameters)} to take effect.
1502      *
1503      * @see #setParameters(Camera.Parameters)
1504      */
1505     public Parameters getParameters() {
1506         Parameters p = new Parameters();
1507         String s = native_getParameters();
1508         p.unflatten(s);
1509         return p;
1510     }
1511
1512     /**
1513      * Returns an empty {@link Parameters} for testing purpose.
1514      *
1515      * @return a Parameter object.
1516      *
1517      * @hide
1518      */
1519     public static Parameters getEmptyParameters() {
1520         Camera camera = new Camera();
1521         return camera.new Parameters();
1522     }
1523
1524     /**
1525      * Image size (width and height dimensions).
1526      */
1527     public class Size {
1528         /**
1529          * Sets the dimensions for pictures.
1530          *
1531          * @param w the photo width (pixels)
1532          * @param h the photo height (pixels)
1533          */
1534         public Size(int w, int h) {
1535             width = w;
1536             height = h;
1537         }
1538         /**
1539          * Compares {@code obj} to this size.
1540          *
1541          * @param obj the object to compare this size with.
1542          * @return {@code true} if the width and height of {@code obj} is the
1543          *         same as those of this size. {@code false} otherwise.
1544          */
1545         @Override
1546         public boolean equals(Object obj) {
1547             if (!(obj instanceof Size)) {
1548                 return false;
1549             }
1550             Size s = (Size) obj;
1551             return width == s.width && height == s.height;
1552         }
1553         @Override
1554         public int hashCode() {
1555             return width * 32713 + height;
1556         }
1557         /** width of the picture */
1558         public int width;
1559         /** height of the picture */
1560         public int height;
1561     };
1562
1563     /**
1564      * <p>The Area class is used for choosing specific metering and focus areas for
1565      * the camera to use when calculating auto-exposure, auto-white balance, and
1566      * auto-focus.</p>
1567      *
1568      * <p>To find out how many simultaneous areas a given camera supports, use
1569      * {@link Parameters#getMaxNumMeteringAreas()} and
1570      * {@link Parameters#getMaxNumFocusAreas()}. If metering or focusing area
1571      * selection is unsupported, these methods will return 0.</p>
1572      *
1573      * <p>Each Area consists of a rectangle specifying its bounds, and a weight
1574      * that determines its importance. The bounds are relative to the camera's
1575      * current field of view. The coordinates are mapped so that (-1000, -1000)
1576      * is always the top-left corner of the current field of view, and (1000,
1577      * 1000) is always the bottom-right corner of the current field of
1578      * view. Setting Areas with bounds outside that range is not allowed. Areas
1579      * with zero or negative width or height are not allowed.</p>
1580      *
1581      * <p>The weight must range from 1 to 1000, and represents a weight for
1582      * every pixel in the area. This means that a large metering area with
1583      * the same weight as a smaller area will have more effect in the
1584      * metering result.  Metering areas can overlap and the driver
1585      * will add the weights in the overlap region.</p>
1586      *
1587      * @see Parameters#setFocusAreas(List)
1588      * @see Parameters#getFocusAreas()
1589      * @see Parameters#getMaxNumFocusAreas()
1590      * @see Parameters#setMeteringAreas(List)
1591      * @see Parameters#getMeteringAreas()
1592      * @see Parameters#getMaxNumMeteringAreas()
1593      */
1594     public static class Area {
1595         /**
1596          * Create an area with specified rectangle and weight.
1597          *
1598          * @param rect the bounds of the area.
1599          * @param weight the weight of the area.
1600          */
1601         public Area(Rect rect, int weight) {
1602             this.rect = rect;
1603             this.weight = weight;
1604         }
1605         /**
1606          * Compares {@code obj} to this area.
1607          *
1608          * @param obj the object to compare this area with.
1609          * @return {@code true} if the rectangle and weight of {@code obj} is
1610          *         the same as those of this area. {@code false} otherwise.
1611          */
1612         @Override
1613         public boolean equals(Object obj) {
1614             if (!(obj instanceof Area)) {
1615                 return false;
1616             }
1617             Area a = (Area) obj;
1618             if (rect == null) {
1619                 if (a.rect != null) return false;
1620             } else {
1621                 if (!rect.equals(a.rect)) return false;
1622             }
1623             return weight == a.weight;
1624         }
1625
1626         /**
1627          * Bounds of the area. (-1000, -1000) represents the top-left of the
1628          * camera field of view, and (1000, 1000) represents the bottom-right of
1629          * the field of view. Setting bounds outside that range is not
1630          * allowed. Bounds with zero or negative width or height are not
1631          * allowed.
1632          *
1633          * @see Parameters#getFocusAreas()
1634          * @see Parameters#getMeteringAreas()
1635          */
1636         public Rect rect;
1637
1638         /**
1639          * Weight of the area. The weight must range from 1 to 1000, and
1640          * represents a weight for every pixel in the area. This means that a
1641          * large metering area with the same weight as a smaller area will have
1642          * more effect in the metering result.  Metering areas can overlap and
1643          * the driver will add the weights in the overlap region.
1644          *
1645          * @see Parameters#getFocusAreas()
1646          * @see Parameters#getMeteringAreas()
1647          */
1648         public int weight;
1649     }
1650
1651     /**
1652      * Camera service settings.
1653      *
1654      * <p>To make camera parameters take effect, applications have to call
1655      * {@link Camera#setParameters(Camera.Parameters)}. For example, after
1656      * {@link Camera.Parameters#setWhiteBalance} is called, white balance is not
1657      * actually changed until {@link Camera#setParameters(Camera.Parameters)}
1658      * is called with the changed parameters object.
1659      *
1660      * <p>Different devices may have different camera capabilities, such as
1661      * picture size or flash modes. The application should query the camera
1662      * capabilities before setting parameters. For example, the application
1663      * should call {@link Camera.Parameters#getSupportedColorEffects()} before
1664      * calling {@link Camera.Parameters#setColorEffect(String)}. If the
1665      * camera does not support color effects,
1666      * {@link Camera.Parameters#getSupportedColorEffects()} will return null.
1667      */
1668     public class Parameters {
1669         // Parameter keys to communicate with the camera driver.
1670         private static final String KEY_PREVIEW_SIZE = "preview-size";
1671         private static final String KEY_PREVIEW_FORMAT = "preview-format";
1672         private static final String KEY_PREVIEW_FRAME_RATE = "preview-frame-rate";
1673         private static final String KEY_PREVIEW_FPS_RANGE = "preview-fps-range";
1674         private static final String KEY_PICTURE_SIZE = "picture-size";
1675         private static final String KEY_PICTURE_FORMAT = "picture-format";
1676         private static final String KEY_JPEG_THUMBNAIL_SIZE = "jpeg-thumbnail-size";
1677         private static final String KEY_JPEG_THUMBNAIL_WIDTH = "jpeg-thumbnail-width";
1678         private static final String KEY_JPEG_THUMBNAIL_HEIGHT = "jpeg-thumbnail-height";
1679         private static final String KEY_JPEG_THUMBNAIL_QUALITY = "jpeg-thumbnail-quality";
1680         private static final String KEY_JPEG_QUALITY = "jpeg-quality";
1681         private static final String KEY_ROTATION = "rotation";
1682         private static final String KEY_GPS_LATITUDE = "gps-latitude";
1683         private static final String KEY_GPS_LONGITUDE = "gps-longitude";
1684         private static final String KEY_GPS_ALTITUDE = "gps-altitude";
1685         private static final String KEY_GPS_TIMESTAMP = "gps-timestamp";
1686         private static final String KEY_GPS_PROCESSING_METHOD = "gps-processing-method";
1687         private static final String KEY_WHITE_BALANCE = "whitebalance";
1688         private static final String KEY_EFFECT = "effect";
1689         private static final String KEY_ANTIBANDING = "antibanding";
1690         private static final String KEY_SCENE_MODE = "scene-mode";
1691         private static final String KEY_FLASH_MODE = "flash-mode";
1692         private static final String KEY_FOCUS_MODE = "focus-mode";
1693         private static final String KEY_FOCUS_AREAS = "focus-areas";
1694         private static final String KEY_MAX_NUM_FOCUS_AREAS = "max-num-focus-areas";
1695         private static final String KEY_FOCAL_LENGTH = "focal-length";
1696         private static final String KEY_HORIZONTAL_VIEW_ANGLE = "horizontal-view-angle";
1697         private static final String KEY_VERTICAL_VIEW_ANGLE = "vertical-view-angle";
1698         private static final String KEY_EXPOSURE_COMPENSATION = "exposure-compensation";
1699         private static final String KEY_MAX_EXPOSURE_COMPENSATION = "max-exposure-compensation";
1700         private static final String KEY_MIN_EXPOSURE_COMPENSATION = "min-exposure-compensation";
1701         private static final String KEY_EXPOSURE_COMPENSATION_STEP = "exposure-compensation-step";
1702         private static final String KEY_AUTO_EXPOSURE_LOCK = "auto-exposure-lock";
1703         private static final String KEY_AUTO_EXPOSURE_LOCK_SUPPORTED = "auto-exposure-lock-supported";
1704         private static final String KEY_AUTO_WHITEBALANCE_LOCK = "auto-whitebalance-lock";
1705         private static final String KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED = "auto-whitebalance-lock-supported";
1706         private static final String KEY_METERING_AREAS = "metering-areas";
1707         private static final String KEY_MAX_NUM_METERING_AREAS = "max-num-metering-areas";
1708         private static final String KEY_ZOOM = "zoom";
1709         private static final String KEY_MAX_ZOOM = "max-zoom";
1710         private static final String KEY_ZOOM_RATIOS = "zoom-ratios";
1711         private static final String KEY_ZOOM_SUPPORTED = "zoom-supported";
1712         private static final String KEY_SMOOTH_ZOOM_SUPPORTED = "smooth-zoom-supported";
1713         private static final String KEY_FOCUS_DISTANCES = "focus-distances";
1714         private static final String KEY_VIDEO_SIZE = "video-size";
1715         private static final String KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO =
1716                                             "preferred-preview-size-for-video";
1717         private static final String KEY_MAX_NUM_DETECTED_FACES_HW = "max-num-detected-faces-hw";
1718         private static final String KEY_MAX_NUM_DETECTED_FACES_SW = "max-num-detected-faces-sw";
1719         private static final String KEY_RECORDING_HINT = "recording-hint";
1720         private static final String KEY_VIDEO_SNAPSHOT_SUPPORTED = "video-snapshot-supported";
1721         private static final String KEY_VIDEO_STABILIZATION = "video-stabilization";
1722         private static final String KEY_VIDEO_STABILIZATION_SUPPORTED = "video-stabilization-supported";
1723
1724         // Parameter key suffix for supported values.
1725         private static final String SUPPORTED_VALUES_SUFFIX = "-values";
1726
1727         private static final String TRUE = "true";
1728         private static final String FALSE = "false";
1729
1730         // Values for white balance settings.
1731         public static final String WHITE_BALANCE_AUTO = "auto";
1732         public static final String WHITE_BALANCE_INCANDESCENT = "incandescent";
1733         public static final String WHITE_BALANCE_FLUORESCENT = "fluorescent";
1734         public static final String WHITE_BALANCE_WARM_FLUORESCENT = "warm-fluorescent";
1735         public static final String WHITE_BALANCE_DAYLIGHT = "daylight";
1736         public static final String WHITE_BALANCE_CLOUDY_DAYLIGHT = "cloudy-daylight";
1737         public static final String WHITE_BALANCE_TWILIGHT = "twilight";
1738         public static final String WHITE_BALANCE_SHADE = "shade";
1739
1740         // Values for color effect settings.
1741         public static final String EFFECT_NONE = "none";
1742         public static final String EFFECT_MONO = "mono";
1743         public static final String EFFECT_NEGATIVE = "negative";
1744         public static final String EFFECT_SOLARIZE = "solarize";
1745         public static final String EFFECT_SEPIA = "sepia";
1746         public static final String EFFECT_POSTERIZE = "posterize";
1747         public static final String EFFECT_WHITEBOARD = "whiteboard";
1748         public static final String EFFECT_BLACKBOARD = "blackboard";
1749         public static final String EFFECT_AQUA = "aqua";
1750
1751         // Values for antibanding settings.
1752         public static final String ANTIBANDING_AUTO = "auto";
1753         public static final String ANTIBANDING_50HZ = "50hz";
1754         public static final String ANTIBANDING_60HZ = "60hz";
1755         public static final String ANTIBANDING_OFF = "off";
1756
1757         // Values for flash mode settings.
1758         /**
1759          * Flash will not be fired.
1760          */
1761         public static final String FLASH_MODE_OFF = "off";
1762
1763         /**
1764          * Flash will be fired automatically when required. The flash may be fired
1765          * during preview, auto-focus, or snapshot depending on the driver.
1766          */
1767         public static final String FLASH_MODE_AUTO = "auto";
1768
1769         /**
1770          * Flash will always be fired during snapshot. The flash may also be
1771          * fired during preview or auto-focus depending on the driver.
1772          */
1773         public static final String FLASH_MODE_ON = "on";
1774
1775         /**
1776          * Flash will be fired in red-eye reduction mode.
1777          */
1778         public static final String FLASH_MODE_RED_EYE = "red-eye";
1779
1780         /**
1781          * Constant emission of light during preview, auto-focus and snapshot.
1782          * This can also be used for video recording.
1783          */
1784         public static final String FLASH_MODE_TORCH = "torch";
1785
1786         /**
1787          * Scene mode is off.
1788          */
1789         public static final String SCENE_MODE_AUTO = "auto";
1790
1791         /**
1792          * Take photos of fast moving objects. Same as {@link
1793          * #SCENE_MODE_SPORTS}.
1794          */
1795         public static final String SCENE_MODE_ACTION = "action";
1796
1797         /**
1798          * Take people pictures.
1799          */
1800         public static final String SCENE_MODE_PORTRAIT = "portrait";
1801
1802         /**
1803          * Take pictures on distant objects.
1804          */
1805         public static final String SCENE_MODE_LANDSCAPE = "landscape";
1806
1807         /**
1808          * Take photos at night.
1809          */
1810         public static final String SCENE_MODE_NIGHT = "night";
1811
1812         /**
1813          * Take people pictures at night.
1814          */
1815         public static final String SCENE_MODE_NIGHT_PORTRAIT = "night-portrait";
1816
1817         /**
1818          * Take photos in a theater. Flash light is off.
1819          */
1820         public static final String SCENE_MODE_THEATRE = "theatre";
1821
1822         /**
1823          * Take pictures on the beach.
1824          */
1825         public static final String SCENE_MODE_BEACH = "beach";
1826
1827         /**
1828          * Take pictures on the snow.
1829          */
1830         public static final String SCENE_MODE_SNOW = "snow";
1831
1832         /**
1833          * Take sunset photos.
1834          */
1835         public static final String SCENE_MODE_SUNSET = "sunset";
1836
1837         /**
1838          * Avoid blurry pictures (for example, due to hand shake).
1839          */
1840         public static final String SCENE_MODE_STEADYPHOTO = "steadyphoto";
1841
1842         /**
1843          * For shooting firework displays.
1844          */
1845         public static final String SCENE_MODE_FIREWORKS = "fireworks";
1846
1847         /**
1848          * Take photos of fast moving objects. Same as {@link
1849          * #SCENE_MODE_ACTION}.
1850          */
1851         public static final String SCENE_MODE_SPORTS = "sports";
1852
1853         /**
1854          * Take indoor low-light shot.
1855          */
1856         public static final String SCENE_MODE_PARTY = "party";
1857
1858         /**
1859          * Capture the naturally warm color of scenes lit by candles.
1860          */
1861         public static final String SCENE_MODE_CANDLELIGHT = "candlelight";
1862
1863         /**
1864          * Applications are looking for a barcode. Camera driver will be
1865          * optimized for barcode reading.
1866          */
1867         public static final String SCENE_MODE_BARCODE = "barcode";
1868
1869         /**
1870          * Capture a scene using high dynamic range imaging techniques. The
1871          * camera will return an image that has an extended dynamic range
1872          * compared to a regular capture. Capturing such an image may take
1873          * longer than a regular capture.
1874          */
1875         public static final String SCENE_MODE_HDR = "hdr";
1876
1877         /**
1878          * Auto-focus mode. Applications should call {@link
1879          * #autoFocus(AutoFocusCallback)} to start the focus in this mode.
1880          */
1881         public static final String FOCUS_MODE_AUTO = "auto";
1882
1883         /**
1884          * Focus is set at infinity. Applications should not call
1885          * {@link #autoFocus(AutoFocusCallback)} in this mode.
1886          */
1887         public static final String FOCUS_MODE_INFINITY = "infinity";
1888
1889         /**
1890          * Macro (close-up) focus mode. Applications should call
1891          * {@link #autoFocus(AutoFocusCallback)} to start the focus in this
1892          * mode.
1893          */
1894         public static final String FOCUS_MODE_MACRO = "macro";
1895
1896         /**
1897          * Focus is fixed. The camera is always in this mode if the focus is not
1898          * adjustable. If the camera has auto-focus, this mode can fix the
1899          * focus, which is usually at hyperfocal distance. Applications should
1900          * not call {@link #autoFocus(AutoFocusCallback)} in this mode.
1901          */
1902         public static final String FOCUS_MODE_FIXED = "fixed";
1903
1904         /**
1905          * Extended depth of field (EDOF). Focusing is done digitally and
1906          * continuously. Applications should not call {@link
1907          * #autoFocus(AutoFocusCallback)} in this mode.
1908          */
1909         public static final String FOCUS_MODE_EDOF = "edof";
1910
1911         /**
1912          * Continuous auto focus mode intended for video recording. The camera
1913          * continuously tries to focus. This is the best choice for video
1914          * recording because the focus changes smoothly . Applications still can
1915          * call {@link #takePicture(Camera.ShutterCallback,
1916          * Camera.PictureCallback, Camera.PictureCallback)} in this mode but the
1917          * subject may not be in focus. Auto focus starts when the parameter is
1918          * set.
1919          *
1920          * <p>Since API level 14, applications can call {@link
1921          * #autoFocus(AutoFocusCallback)} in this mode. The focus callback will
1922          * immediately return with a boolean that indicates whether the focus is
1923          * sharp or not. The focus position is locked after autoFocus call. If
1924          * applications want to resume the continuous focus, cancelAutoFocus
1925          * must be called. Restarting the preview will not resume the continuous
1926          * autofocus. To stop continuous focus, applications should change the
1927          * focus mode to other modes.
1928          *
1929          * @see #FOCUS_MODE_CONTINUOUS_PICTURE
1930          */
1931         public static final String FOCUS_MODE_CONTINUOUS_VIDEO = "continuous-video";
1932
1933         /**
1934          * Continuous auto focus mode intended for taking pictures. The camera
1935          * continuously tries to focus. The speed of focus change is more
1936          * aggressive than {@link #FOCUS_MODE_CONTINUOUS_VIDEO}. Auto focus
1937          * starts when the parameter is set.
1938          *
1939          * <p>Applications can call {@link #autoFocus(AutoFocusCallback)} in
1940          * this mode. If the autofocus is in the middle of scanning, the focus
1941          * callback will return when it completes. If the autofocus is not
1942          * scanning, the focus callback will immediately return with a boolean
1943          * that indicates whether the focus is sharp or not. The apps can then
1944          * decide if they want to take a picture immediately or to change the
1945          * focus mode to auto, and run a full autofocus cycle. The focus
1946          * position is locked after autoFocus call. If applications want to
1947          * resume the continuous focus, cancelAutoFocus must be called.
1948          * Restarting the preview will not resume the continuous autofocus. To
1949          * stop continuous focus, applications should change the focus mode to
1950          * other modes.
1951          *
1952          * @see #FOCUS_MODE_CONTINUOUS_VIDEO
1953          */
1954         public static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
1955
1956         // Indices for focus distance array.
1957         /**
1958          * The array index of near focus distance for use with
1959          * {@link #getFocusDistances(float[])}.
1960          */
1961         public static final int FOCUS_DISTANCE_NEAR_INDEX = 0;
1962
1963         /**
1964          * The array index of optimal focus distance for use with
1965          * {@link #getFocusDistances(float[])}.
1966          */
1967         public static final int FOCUS_DISTANCE_OPTIMAL_INDEX = 1;
1968
1969         /**
1970          * The array index of far focus distance for use with
1971          * {@link #getFocusDistances(float[])}.
1972          */
1973         public static final int FOCUS_DISTANCE_FAR_INDEX = 2;
1974
1975         /**
1976          * The array index of minimum preview fps for use with {@link
1977          * #getPreviewFpsRange(int[])} or {@link
1978          * #getSupportedPreviewFpsRange()}.
1979          */
1980         public static final int PREVIEW_FPS_MIN_INDEX = 0;
1981
1982         /**
1983          * The array index of maximum preview fps for use with {@link
1984          * #getPreviewFpsRange(int[])} or {@link
1985          * #getSupportedPreviewFpsRange()}.
1986          */
1987         public static final int PREVIEW_FPS_MAX_INDEX = 1;
1988
1989         // Formats for setPreviewFormat and setPictureFormat.
1990         private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp";
1991         private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp";
1992         private static final String PIXEL_FORMAT_YUV422I = "yuv422i-yuyv";
1993         private static final String PIXEL_FORMAT_YUV420P = "yuv420p";
1994         private static final String PIXEL_FORMAT_RGB565 = "rgb565";
1995         private static final String PIXEL_FORMAT_JPEG = "jpeg";
1996         private static final String PIXEL_FORMAT_BAYER_RGGB = "bayer-rggb";
1997
1998         private HashMap<String, String> mMap;
1999
2000         private Parameters() {
2001             mMap = new HashMap<String, String>(64);
2002         }
2003
2004         /**
2005          * Writes the current Parameters to the log.
2006          * @hide
2007          * @deprecated
2008          */
2009         public void dump() {
2010             Log.e(TAG, "dump: size=" + mMap.size());
2011             for (String k : mMap.keySet()) {
2012                 Log.e(TAG, "dump: " + k + "=" + mMap.get(k));
2013             }
2014         }
2015
2016         /**
2017          * Creates a single string with all the parameters set in
2018          * this Parameters object.
2019          * <p>The {@link #unflatten(String)} method does the reverse.</p>
2020          *
2021          * @return a String with all values from this Parameters object, in
2022          *         semi-colon delimited key-value pairs
2023          */
2024         public String flatten() {
2025             StringBuilder flattened = new StringBuilder(128);
2026             for (String k : mMap.keySet()) {
2027                 flattened.append(k);
2028                 flattened.append("=");
2029                 flattened.append(mMap.get(k));
2030                 flattened.append(";");
2031             }
2032             // chop off the extra semicolon at the end
2033             flattened.deleteCharAt(flattened.length()-1);
2034             return flattened.toString();
2035         }
2036
2037         /**
2038          * Takes a flattened string of parameters and adds each one to
2039          * this Parameters object.
2040          * <p>The {@link #flatten()} method does the reverse.</p>
2041          *
2042          * @param flattened a String of parameters (key-value paired) that
2043          *                  are semi-colon delimited
2044          */
2045         public void unflatten(String flattened) {
2046             mMap.clear();
2047
2048             TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(';');
2049             splitter.setString(flattened);
2050             for (String kv : splitter) {
2051                 int pos = kv.indexOf('=');
2052                 if (pos == -1) {
2053                     continue;
2054                 }
2055                 String k = kv.substring(0, pos);
2056                 String v = kv.substring(pos + 1);
2057                 mMap.put(k, v);
2058             }
2059         }
2060
2061         public void remove(String key) {
2062             mMap.remove(key);
2063         }
2064
2065         /**
2066          * Sets a String parameter.
2067          *
2068          * @param key   the key name for the parameter
2069          * @param value the String value of the parameter
2070          */
2071         public void set(String key, String value) {
2072             if (key.indexOf('=') != -1 || key.indexOf(';') != -1 || key.indexOf(0) != -1) {
2073                 Log.e(TAG, "Key \"" + key + "\" contains invalid character (= or ; or \\0)");
2074                 return;
2075             }
2076             if (value.indexOf('=') != -1 || value.indexOf(';') != -1 || value.indexOf(0) != -1) {
2077                 Log.e(TAG, "Value \"" + value + "\" contains invalid character (= or ; or \\0)");
2078                 return;
2079             }
2080
2081             mMap.put(key, value);
2082         }
2083
2084         /**
2085          * Sets an integer parameter.
2086          *
2087          * @param key   the key name for the parameter
2088          * @param value the int value of the parameter
2089          */
2090         public void set(String key, int value) {
2091             mMap.put(key, Integer.toString(value));
2092         }
2093
2094         private void set(String key, List<Area> areas) {
2095             if (areas == null) {
2096                 set(key, "(0,0,0,0,0)");
2097             } else {
2098                 StringBuilder buffer = new StringBuilder();
2099                 for (int i = 0; i < areas.size(); i++) {
2100                     Area area = areas.get(i);
2101                     Rect rect = area.rect;
2102                     buffer.append('(');
2103                     buffer.append(rect.left);
2104                     buffer.append(',');
2105                     buffer.append(rect.top);
2106                     buffer.append(',');
2107                     buffer.append(rect.right);
2108                     buffer.append(',');
2109                     buffer.append(rect.bottom);
2110                     buffer.append(',');
2111                     buffer.append(area.weight);
2112                     buffer.append(')');
2113                     if (i != areas.size() - 1) buffer.append(',');
2114                 }
2115                 set(key, buffer.toString());
2116             }
2117         }
2118
2119         /**
2120          * Returns the value of a String parameter.
2121          *
2122          * @param key the key name for the parameter
2123          * @return the String value of the parameter
2124          */
2125         public String get(String key) {
2126             return mMap.get(key);
2127         }
2128
2129         /**
2130          * Returns the value of an integer parameter.
2131          *
2132          * @param key the key name for the parameter
2133          * @return the int value of the parameter
2134          */
2135         public int getInt(String key) {
2136             return Integer.parseInt(mMap.get(key));
2137         }
2138
2139         /**
2140          * Sets the dimensions for preview pictures. If the preview has already
2141          * started, applications should stop the preview first before changing
2142          * preview size.
2143          *
2144          * The sides of width and height are based on camera orientation. That
2145          * is, the preview size is the size before it is rotated by display
2146          * orientation. So applications need to consider the display orientation
2147          * while setting preview size. For example, suppose the camera supports
2148          * both 480x320 and 320x480 preview sizes. The application wants a 3:2
2149          * preview ratio. If the display orientation is set to 0 or 180, preview
2150          * size should be set to 480x320. If the display orientation is set to
2151          * 90 or 270, preview size should be set to 320x480. The display
2152          * orientation should also be considered while setting picture size and
2153          * thumbnail size.
2154          *
2155          * @param width  the width of the pictures, in pixels
2156          * @param height the height of the pictures, in pixels
2157          * @see #setDisplayOrientation(int)
2158          * @see #getCameraInfo(int, CameraInfo)
2159          * @see #setPictureSize(int, int)
2160          * @see #setJpegThumbnailSize(int, int)
2161          */
2162         public void setPreviewSize(int width, int height) {
2163             String v = Integer.toString(width) + "x" + Integer.toString(height);
2164             set(KEY_PREVIEW_SIZE, v);
2165         }
2166
2167         /**
2168          * Returns the dimensions setting for preview pictures.
2169          *
2170          * @return a Size object with the width and height setting
2171          *          for the preview picture
2172          */
2173         public Size getPreviewSize() {
2174             String pair = get(KEY_PREVIEW_SIZE);
2175             return strToSize(pair);
2176         }
2177
2178         /**
2179          * Gets the supported preview sizes.
2180          *
2181          * @return a list of Size object. This method will always return a list
2182          *         with at least one element.
2183          */
2184         public List<Size> getSupportedPreviewSizes() {
2185             String str = get(KEY_PREVIEW_SIZE + SUPPORTED_VALUES_SUFFIX);
2186             return splitSize(str);
2187         }
2188
2189         /**
2190          * <p>Gets the supported video frame sizes that can be used by
2191          * MediaRecorder.</p>
2192          *
2193          * <p>If the returned list is not null, the returned list will contain at
2194          * least one Size and one of the sizes in the returned list must be
2195          * passed to MediaRecorder.setVideoSize() for camcorder application if
2196          * camera is used as the video source. In this case, the size of the
2197          * preview can be different from the resolution of the recorded video
2198          * during video recording.</p>
2199          *
2200          * @return a list of Size object if camera has separate preview and
2201          *         video output; otherwise, null is returned.
2202          * @see #getPreferredPreviewSizeForVideo()
2203          */
2204         public List<Size> getSupportedVideoSizes() {
2205             String str = get(KEY_VIDEO_SIZE + SUPPORTED_VALUES_SUFFIX);
2206             return splitSize(str);
2207         }
2208
2209         /**
2210          * Returns the preferred or recommended preview size (width and height)
2211          * in pixels for video recording. Camcorder applications should
2212          * set the preview size to a value that is not larger than the
2213          * preferred preview size. In other words, the product of the width
2214          * and height of the preview size should not be larger than that of
2215          * the preferred preview size. In addition, we recommend to choose a
2216          * preview size that has the same aspect ratio as the resolution of
2217          * video to be recorded.
2218          *
2219          * @return the preferred preview size (width and height) in pixels for
2220          *         video recording if getSupportedVideoSizes() does not return
2221          *         null; otherwise, null is returned.
2222          * @see #getSupportedVideoSizes()
2223          */
2224         public Size getPreferredPreviewSizeForVideo() {
2225             String pair = get(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO);
2226             return strToSize(pair);
2227         }
2228
2229         /**
2230          * <p>Sets the dimensions for EXIF thumbnail in Jpeg picture. If
2231          * applications set both width and height to 0, EXIF will not contain
2232          * thumbnail.</p>
2233          *
2234          * <p>Applications need to consider the display orientation. See {@link
2235          * #setPreviewSize(int,int)} for reference.</p>
2236          *
2237          * @param width  the width of the thumbnail, in pixels
2238          * @param height the height of the thumbnail, in pixels
2239          * @see #setPreviewSize(int,int)
2240          */
2241         public void setJpegThumbnailSize(int width, int height) {
2242             set(KEY_JPEG_THUMBNAIL_WIDTH, width);
2243             set(KEY_JPEG_THUMBNAIL_HEIGHT, height);
2244         }
2245
2246         /**
2247          * Returns the dimensions for EXIF thumbnail in Jpeg picture.
2248          *
2249          * @return a Size object with the height and width setting for the EXIF
2250          *         thumbnails
2251          */
2252         public Size getJpegThumbnailSize() {
2253             return new Size(getInt(KEY_JPEG_THUMBNAIL_WIDTH),
2254                             getInt(KEY_JPEG_THUMBNAIL_HEIGHT));
2255         }
2256
2257         /**
2258          * Gets the supported jpeg thumbnail sizes.
2259          *
2260          * @return a list of Size object. This method will always return a list
2261          *         with at least two elements. Size 0,0 (no thumbnail) is always
2262          *         supported.
2263          */
2264         public List<Size> getSupportedJpegThumbnailSizes() {
2265             String str = get(KEY_JPEG_THUMBNAIL_SIZE + SUPPORTED_VALUES_SUFFIX);
2266             return splitSize(str);
2267         }
2268
2269         /**
2270          * Sets the quality of the EXIF thumbnail in Jpeg picture.
2271          *
2272          * @param quality the JPEG quality of the EXIF thumbnail. The range is 1
2273          *                to 100, with 100 being the best.
2274          */
2275         public void setJpegThumbnailQuality(int quality) {
2276             set(KEY_JPEG_THUMBNAIL_QUALITY, quality);
2277         }
2278
2279         /**
2280          * Returns the quality setting for the EXIF thumbnail in Jpeg picture.
2281          *
2282          * @return the JPEG quality setting of the EXIF thumbnail.
2283          */
2284         public int getJpegThumbnailQuality() {
2285             return getInt(KEY_JPEG_THUMBNAIL_QUALITY);
2286         }
2287
2288         /**
2289          * Sets Jpeg quality of captured picture.
2290          *
2291          * @param quality the JPEG quality of captured picture. The range is 1
2292          *                to 100, with 100 being the best.
2293          */
2294         public void setJpegQuality(int quality) {
2295             set(KEY_JPEG_QUALITY, quality);
2296         }
2297
2298         /**
2299          * Returns the quality setting for the JPEG picture.
2300          *
2301          * @return the JPEG picture quality setting.
2302          */
2303         public int getJpegQuality() {
2304             return getInt(KEY_JPEG_QUALITY);
2305         }
2306
2307         /**
2308          * Sets the rate at which preview frames are received. This is the
2309          * target frame rate. The actual frame rate depends on the driver.
2310          *
2311          * @param fps the frame rate (frames per second)
2312          * @deprecated replaced by {@link #setPreviewFpsRange(int,int)}
2313          */
2314         @Deprecated
2315         public void setPreviewFrameRate(int fps) {
2316             set(KEY_PREVIEW_FRAME_RATE, fps);
2317         }
2318
2319         /**
2320          * Returns the setting for the rate at which preview frames are
2321          * received. This is the target frame rate. The actual frame rate
2322          * depends on the driver.
2323          *
2324          * @return the frame rate setting (frames per second)
2325          * @deprecated replaced by {@link #getPreviewFpsRange(int[])}
2326          */
2327         @Deprecated
2328         public int getPreviewFrameRate() {
2329             return getInt(KEY_PREVIEW_FRAME_RATE);
2330         }
2331
2332         /**
2333          * Gets the supported preview frame rates.
2334          *
2335          * @return a list of supported preview frame rates. null if preview
2336          *         frame rate setting is not supported.
2337          * @deprecated replaced by {@link #getSupportedPreviewFpsRange()}
2338          */
2339         @Deprecated
2340         public List<Integer> getSupportedPreviewFrameRates() {
2341             String str = get(KEY_PREVIEW_FRAME_RATE + SUPPORTED_VALUES_SUFFIX);
2342             return splitInt(str);
2343         }
2344
2345         /**
2346          * Sets the minimum and maximum preview fps. This controls the rate of
2347          * preview frames received in {@link PreviewCallback}. The minimum and
2348          * maximum preview fps must be one of the elements from {@link
2349          * #getSupportedPreviewFpsRange}.
2350          *
2351          * @param min the minimum preview fps (scaled by 1000).
2352          * @param max the maximum preview fps (scaled by 1000).
2353          * @throws RuntimeException if fps range is invalid.
2354          * @see #setPreviewCallbackWithBuffer(Camera.PreviewCallback)
2355          * @see #getSupportedPreviewFpsRange()
2356          */
2357         public void setPreviewFpsRange(int min, int max) {
2358             set(KEY_PREVIEW_FPS_RANGE, "" + min + "," + max);
2359         }
2360
2361         /**
2362          * Returns the current minimum and maximum preview fps. The values are
2363          * one of the elements returned by {@link #getSupportedPreviewFpsRange}.
2364          *
2365          * @return range the minimum and maximum preview fps (scaled by 1000).
2366          * @see #PREVIEW_FPS_MIN_INDEX
2367          * @see #PREVIEW_FPS_MAX_INDEX
2368          * @see #getSupportedPreviewFpsRange()
2369          */
2370         public void getPreviewFpsRange(int[] range) {
2371             if (range == null || range.length != 2) {
2372                 throw new IllegalArgumentException(
2373                         "range must be an array with two elements.");
2374             }
2375             splitInt(get(KEY_PREVIEW_FPS_RANGE), range);
2376         }
2377
2378         /**
2379          * Gets the supported preview fps (frame-per-second) ranges. Each range
2380          * contains a minimum fps and maximum fps. If minimum fps equals to
2381          * maximum fps, the camera outputs frames in fixed frame rate. If not,
2382          * the camera outputs frames in auto frame rate. The actual frame rate
2383          * fluctuates between the minimum and the maximum. The values are
2384          * multiplied by 1000 and represented in integers. For example, if frame
2385          * rate is 26.623 frames per second, the value is 26623.
2386          *
2387          * @return a list of supported preview fps ranges. This method returns a
2388          *         list with at least one element. Every element is an int array
2389          *         of two values - minimum fps and maximum fps. The list is
2390          *         sorted from small to large (first by maximum fps and then
2391          *         minimum fps).
2392          * @see #PREVIEW_FPS_MIN_INDEX
2393          * @see #PREVIEW_FPS_MAX_INDEX
2394          */
2395         public List<int[]> getSupportedPreviewFpsRange() {
2396             String str = get(KEY_PREVIEW_FPS_RANGE + SUPPORTED_VALUES_SUFFIX);
2397             return splitRange(str);
2398         }
2399
2400         /**
2401          * Sets the image format for preview pictures.
2402          * <p>If this is never called, the default format will be
2403          * {@link android.graphics.ImageFormat#NV21}, which
2404          * uses the NV21 encoding format.</p>
2405          *
2406          * <p>Use {@link Parameters#getSupportedPreviewFormats} to get a list of
2407          * the available preview formats.
2408          *
2409          * <p>It is strongly recommended that either
2410          * {@link android.graphics.ImageFormat#NV21} or
2411          * {@link android.graphics.ImageFormat#YV12} is used, since
2412          * they are supported by all camera devices.</p>
2413          *
2414          * <p>For YV12, the image buffer that is received is not necessarily
2415          * tightly packed, as there may be padding at the end of each row of
2416          * pixel data, as described in
2417          * {@link android.graphics.ImageFormat#YV12}. For camera callback data,
2418          * it can be assumed that the stride of the Y and UV data is the
2419          * smallest possible that meets the alignment requirements. That is, if
2420          * the preview size is <var>width x height</var>, then the following
2421          * equations describe the buffer index for the beginning of row
2422          * <var>y</var> for the Y plane and row <var>c</var> for the U and V
2423          * planes:
2424          *
2425          * {@code
2426          * <pre>
2427          * yStride   = (int) ceil(width / 16.0) * 16;
2428          * uvStride  = (int) ceil( (yStride / 2) / 16.0) * 16;
2429          * ySize     = yStride * height;
2430          * uvSize    = uvStride * height / 2;
2431          * yRowIndex = yStride * y;
2432          * uRowIndex = ySize + uvSize + uvStride * c;
2433          * vRowIndex = ySize + uvStride * c;
2434          * size      = ySize + uvSize * 2;</pre>
2435          * }
2436          *
2437          * @param pixel_format the desired preview picture format, defined by
2438          *   one of the {@link android.graphics.ImageFormat} constants.  (E.g.,
2439          *   <var>ImageFormat.NV21</var> (default), or
2440          *   <var>ImageFormat.YV12</var>)
2441          *
2442          * @see android.graphics.ImageFormat
2443          * @see android.hardware.Camera.Parameters#getSupportedPreviewFormats
2444          */
2445         public void setPreviewFormat(int pixel_format) {
2446             String s = cameraFormatForPixelFormat(pixel_format);
2447             if (s == null) {
2448                 throw new IllegalArgumentException(
2449                         "Invalid pixel_format=" + pixel_format);
2450             }
2451
2452             set(KEY_PREVIEW_FORMAT, s);
2453         }
2454
2455         /**
2456          * Returns the image format for preview frames got from
2457          * {@link PreviewCallback}.
2458          *
2459          * @return the preview format.
2460          * @see android.graphics.ImageFormat
2461          * @see #setPreviewFormat
2462          */
2463         public int getPreviewFormat() {
2464             return pixelFormatForCameraFormat(get(KEY_PREVIEW_FORMAT));
2465         }
2466
2467         /**
2468          * Gets the supported preview formats. {@link android.graphics.ImageFormat#NV21}
2469          * is always supported. {@link android.graphics.ImageFormat#YV12}
2470          * is always supported since API level 12.
2471          *
2472          * @return a list of supported preview formats. This method will always
2473          *         return a list with at least one element.
2474          * @see android.graphics.ImageFormat
2475          * @see #setPreviewFormat
2476          */
2477         public List<Integer> getSupportedPreviewFormats() {
2478             String str = get(KEY_PREVIEW_FORMAT + SUPPORTED_VALUES_SUFFIX);
2479             ArrayList<Integer> formats = new ArrayList<Integer>();
2480             for (String s : split(str)) {
2481                 int f = pixelFormatForCameraFormat(s);
2482                 if (f == ImageFormat.UNKNOWN) continue;
2483                 formats.add(f);
2484             }
2485             return formats;
2486         }
2487
2488         /**
2489          * <p>Sets the dimensions for pictures.</p>
2490          *
2491          * <p>Applications need to consider the display orientation. See {@link
2492          * #setPreviewSize(int,int)} for reference.</p>
2493          *
2494          * @param width  the width for pictures, in pixels
2495          * @param height the height for pictures, in pixels
2496          * @see #setPreviewSize(int,int)
2497          *
2498          */
2499         public void setPictureSize(int width, int height) {
2500             String v = Integer.toString(width) + "x" + Integer.toString(height);
2501             set(KEY_PICTURE_SIZE, v);
2502         }
2503
2504         /**
2505          * Returns the dimension setting for pictures.
2506          *
2507          * @return a Size object with the height and width setting
2508          *          for pictures
2509          */
2510         public Size getPictureSize() {
2511             String pair = get(KEY_PICTURE_SIZE);
2512             return strToSize(pair);
2513         }
2514
2515         /**
2516          * Gets the supported picture sizes.
2517          *
2518          * @return a list of supported picture sizes. This method will always
2519          *         return a list with at least one element.
2520          */
2521         public List<Size> getSupportedPictureSizes() {
2522             String str = get(KEY_PICTURE_SIZE + SUPPORTED_VALUES_SUFFIX);
2523             return splitSize(str);
2524         }
2525
2526         /**
2527          * Sets the image format for pictures.
2528          *
2529          * @param pixel_format the desired picture format
2530          *                     (<var>ImageFormat.NV21</var>,
2531          *                      <var>ImageFormat.RGB_565</var>, or
2532          *                      <var>ImageFormat.JPEG</var>)
2533          * @see android.graphics.ImageFormat
2534          */
2535         public void setPictureFormat(int pixel_format) {
2536             String s = cameraFormatForPixelFormat(pixel_format);
2537             if (s == null) {
2538                 throw new IllegalArgumentException(
2539                         "Invalid pixel_format=" + pixel_format);
2540             }
2541
2542             set(KEY_PICTURE_FORMAT, s);
2543         }
2544
2545         /**
2546          * Returns the image format for pictures.
2547          *
2548          * @return the picture format
2549          * @see android.graphics.ImageFormat
2550          */
2551         public int getPictureFormat() {
2552             return pixelFormatForCameraFormat(get(KEY_PICTURE_FORMAT));
2553         }
2554
2555         /**
2556          * Gets the supported picture formats.
2557          *
2558          * @return supported picture formats. This method will always return a
2559          *         list with at least one element.
2560          * @see android.graphics.ImageFormat
2561          */
2562         public List<Integer> getSupportedPictureFormats() {
2563             String str = get(KEY_PICTURE_FORMAT + SUPPORTED_VALUES_SUFFIX);
2564             ArrayList<Integer> formats = new ArrayList<Integer>();
2565             for (String s : split(str)) {
2566                 int f = pixelFormatForCameraFormat(s);
2567                 if (f == ImageFormat.UNKNOWN) continue;
2568                 formats.add(f);
2569             }
2570             return formats;
2571         }
2572
2573         private String cameraFormatForPixelFormat(int pixel_format) {
2574             switch(pixel_format) {
2575             case ImageFormat.NV16:      return PIXEL_FORMAT_YUV422SP;
2576             case ImageFormat.NV21:      return PIXEL_FORMAT_YUV420SP;
2577             case ImageFormat.YUY2:      return PIXEL_FORMAT_YUV422I;
2578             case ImageFormat.YV12:      return PIXEL_FORMAT_YUV420P;
2579             case ImageFormat.RGB_565:   return PIXEL_FORMAT_RGB565;
2580             case ImageFormat.JPEG:      return PIXEL_FORMAT_JPEG;
2581             case ImageFormat.BAYER_RGGB: return PIXEL_FORMAT_BAYER_RGGB;
2582             default:                    return null;
2583             }
2584         }
2585
2586         private int pixelFormatForCameraFormat(String format) {
2587             if (format == null)
2588                 return ImageFormat.UNKNOWN;
2589
2590             if (format.equals(PIXEL_FORMAT_YUV422SP))
2591                 return ImageFormat.NV16;
2592
2593             if (format.equals(PIXEL_FORMAT_YUV420SP))
2594                 return ImageFormat.NV21;
2595
2596             if (format.equals(PIXEL_FORMAT_YUV422I))
2597                 return ImageFormat.YUY2;
2598
2599             if (format.equals(PIXEL_FORMAT_YUV420P))
2600                 return ImageFormat.YV12;
2601
2602             if (format.equals(PIXEL_FORMAT_RGB565))
2603                 return ImageFormat.RGB_565;
2604
2605             if (format.equals(PIXEL_FORMAT_JPEG))
2606                 return ImageFormat.JPEG;
2607
2608             return ImageFormat.UNKNOWN;
2609         }
2610
2611         /**
2612          * Sets the clockwise rotation angle in degrees relative to the
2613          * orientation of the camera. This affects the pictures returned from
2614          * JPEG {@link PictureCallback}. The camera driver may set orientation
2615          * in the EXIF header without rotating the picture. Or the driver may
2616          * rotate the picture and the EXIF thumbnail. If the Jpeg picture is
2617          * rotated, the orientation in the EXIF header will be missing or 1
2618          * (row #0 is top and column #0 is left side).
2619          *
2620          * <p>If applications want to rotate the picture to match the orientation
2621          * of what users see, apps should use {@link
2622          * android.view.OrientationEventListener} and {@link CameraInfo}.
2623          * The value from OrientationEventListener is relative to the natural
2624          * orientation of the device. CameraInfo.orientation is the angle
2625          * between camera orientation and natural device orientation. The sum
2626          * of the two is the rotation angle for back-facing camera. The
2627          * difference of the two is the rotation angle for front-facing camera.
2628          * Note that the JPEG pictures of front-facing cameras are not mirrored
2629          * as in preview display.
2630          *
2631          * <p>For example, suppose the natural orientation of the device is
2632          * portrait. The device is rotated 270 degrees clockwise, so the device
2633          * orientation is 270. Suppose a back-facing camera sensor is mounted in
2634          * landscape and the top side of the camera sensor is aligned with the
2635          * right edge of the display in natural orientation. So the camera
2636          * orientation is 90. The rotation should be set to 0 (270 + 90).
2637          *
2638          * <p>The reference code is as follows.
2639          *
2640          * <pre>
2641          * public void onOrientationChanged(int orientation) {
2642          *     if (orientation == ORIENTATION_UNKNOWN) return;
2643          *     android.hardware.Camera.CameraInfo info =
2644          *            new android.hardware.Camera.CameraInfo();
2645          *     android.hardware.Camera.getCameraInfo(cameraId, info);
2646          *     orientation = (orientation + 45) / 90 * 90;
2647          *     int rotation = 0;
2648          *     if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
2649          *         rotation = (info.orientation - orientation + 360) % 360;
2650          *     } else {  // back-facing camera
2651          *         rotation = (info.orientation + orientation) % 360;
2652          *     }
2653          *     mParameters.setRotation(rotation);
2654          * }
2655          * </pre>
2656          *
2657          * @param rotation The rotation angle in degrees relative to the
2658          *                 orientation of the camera. Rotation can only be 0,
2659          *                 90, 180 or 270.
2660          * @throws IllegalArgumentException if rotation value is invalid.
2661          * @see android.view.OrientationEventListener
2662          * @see #getCameraInfo(int, CameraInfo)
2663          */
2664         public void setRotation(int rotation) {
2665             if (rotation == 0 || rotation == 90 || rotation == 180
2666                     || rotation == 270) {
2667                 set(KEY_ROTATION, Integer.toString(rotation));
2668             } else {
2669                 throw new IllegalArgumentException(
2670                         "Invalid rotation=" + rotation);
2671             }
2672         }
2673
2674         /**
2675          * Sets GPS latitude coordinate. This will be stored in JPEG EXIF
2676          * header.
2677          *
2678          * @param latitude GPS latitude coordinate.
2679          */
2680         public void setGpsLatitude(double latitude) {
2681             set(KEY_GPS_LATITUDE, Double.toString(latitude));
2682         }
2683
2684         /**
2685          * Sets GPS longitude coordinate. This will be stored in JPEG EXIF
2686          * header.
2687          *
2688          * @param longitude GPS longitude coordinate.
2689          */
2690         public void setGpsLongitude(double longitude) {
2691             set(KEY_GPS_LONGITUDE, Double.toString(longitude));
2692         }
2693
2694         /**
2695          * Sets GPS altitude. This will be stored in JPEG EXIF header.
2696          *
2697          * @param altitude GPS altitude in meters.
2698          */
2699         public void setGpsAltitude(double altitude) {
2700             set(KEY_GPS_ALTITUDE, Double.toString(altitude));
2701         }
2702
2703         /**
2704          * Sets GPS timestamp. This will be stored in JPEG EXIF header.
2705          *
2706          * @param timestamp GPS timestamp (UTC in seconds since January 1,
2707          *                  1970).
2708          */
2709         public void setGpsTimestamp(long timestamp) {
2710             set(KEY_GPS_TIMESTAMP, Long.toString(timestamp));
2711         }
2712
2713         /**
2714          * Sets GPS processing method. It will store up to 32 characters
2715          * in JPEG EXIF header.
2716          *
2717          * @param processing_method The processing method to get this location.
2718          */
2719         public void setGpsProcessingMethod(String processing_method) {
2720             set(KEY_GPS_PROCESSING_METHOD, processing_method);
2721         }
2722
2723         /**
2724          * Removes GPS latitude, longitude, altitude, and timestamp from the
2725          * parameters.
2726          */
2727         public void removeGpsData() {
2728             remove(KEY_GPS_LATITUDE);
2729             remove(KEY_GPS_LONGITUDE);
2730             remove(KEY_GPS_ALTITUDE);
2731             remove(KEY_GPS_TIMESTAMP);
2732             remove(KEY_GPS_PROCESSING_METHOD);
2733         }
2734
2735         /**
2736          * Gets the current white balance setting.
2737          *
2738          * @return current white balance. null if white balance setting is not
2739          *         supported.
2740          * @see #WHITE_BALANCE_AUTO
2741          * @see #WHITE_BALANCE_INCANDESCENT
2742          * @see #WHITE_BALANCE_FLUORESCENT
2743          * @see #WHITE_BALANCE_WARM_FLUORESCENT
2744          * @see #WHITE_BALANCE_DAYLIGHT
2745          * @see #WHITE_BALANCE_CLOUDY_DAYLIGHT
2746          * @see #WHITE_BALANCE_TWILIGHT
2747          * @see #WHITE_BALANCE_SHADE
2748          *
2749          */
2750         public String getWhiteBalance() {
2751             return get(KEY_WHITE_BALANCE);
2752         }
2753
2754         /**
2755          * Sets the white balance. Changing the setting will release the
2756          * auto-white balance lock. It is recommended not to change white
2757          * balance and AWB lock at the same time.
2758          *
2759          * @param value new white balance.
2760          * @see #getWhiteBalance()
2761          * @see #setAutoWhiteBalanceLock(boolean)
2762          */
2763         public void setWhiteBalance(String value) {
2764             String oldValue = get(KEY_WHITE_BALANCE);
2765             if (same(value, oldValue)) return;
2766             set(KEY_WHITE_BALANCE, value);
2767             set(KEY_AUTO_WHITEBALANCE_LOCK, FALSE);
2768         }
2769
2770         /**
2771          * Gets the supported white balance.
2772          *
2773          * @return a list of supported white balance. null if white balance
2774          *         setting is not supported.
2775          * @see #getWhiteBalance()
2776          */
2777         public List<String> getSupportedWhiteBalance() {
2778             String str = get(KEY_WHITE_BALANCE + SUPPORTED_VALUES_SUFFIX);
2779             return split(str);
2780         }
2781
2782         /**
2783          * Gets the current color effect setting.
2784          *
2785          * @return current color effect. null if color effect
2786          *         setting is not supported.
2787          * @see #EFFECT_NONE
2788          * @see #EFFECT_MONO
2789          * @see #EFFECT_NEGATIVE
2790          * @see #EFFECT_SOLARIZE
2791          * @see #EFFECT_SEPIA
2792          * @see #EFFECT_POSTERIZE
2793          * @see #EFFECT_WHITEBOARD
2794          * @see #EFFECT_BLACKBOARD
2795          * @see #EFFECT_AQUA
2796          */
2797         public String getColorEffect() {
2798             return get(KEY_EFFECT);
2799         }
2800
2801         /**
2802          * Sets the current color effect setting.
2803          *
2804          * @param value new color effect.
2805          * @see #getColorEffect()
2806          */
2807         public void setColorEffect(String value) {
2808             set(KEY_EFFECT, value);
2809         }
2810
2811         /**
2812          * Gets the supported color effects.
2813          *
2814          * @return a list of supported color effects. null if color effect
2815          *         setting is not supported.
2816          * @see #getColorEffect()
2817          */
2818         public List<String> getSupportedColorEffects() {
2819             String str = get(KEY_EFFECT + SUPPORTED_VALUES_SUFFIX);
2820             return split(str);
2821         }
2822
2823
2824         /**
2825          * Gets the current antibanding setting.
2826          *
2827          * @return current antibanding. null if antibanding setting is not
2828          *         supported.
2829          * @see #ANTIBANDING_AUTO
2830          * @see #ANTIBANDING_50HZ
2831          * @see #ANTIBANDING_60HZ
2832          * @see #ANTIBANDING_OFF
2833          */
2834         public String getAntibanding() {
2835             return get(KEY_ANTIBANDING);
2836         }
2837
2838         /**
2839          * Sets the antibanding.
2840          *
2841          * @param antibanding new antibanding value.
2842          * @see #getAntibanding()
2843          */
2844         public void setAntibanding(String antibanding) {
2845             set(KEY_ANTIBANDING, antibanding);
2846         }
2847
2848         /**
2849          * Gets the supported antibanding values.
2850          *
2851          * @return a list of supported antibanding values. null if antibanding
2852          *         setting is not supported.
2853          * @see #getAntibanding()
2854          */
2855         public List<String> getSupportedAntibanding() {
2856             String str = get(KEY_ANTIBANDING + SUPPORTED_VALUES_SUFFIX);
2857             return split(str);
2858         }
2859
2860         /**
2861          * Gets the current scene mode setting.
2862          *
2863          * @return one of SCENE_MODE_XXX string constant. null if scene mode
2864          *         setting is not supported.
2865          * @see #SCENE_MODE_AUTO
2866          * @see #SCENE_MODE_ACTION
2867          * @see #SCENE_MODE_PORTRAIT
2868          * @see #SCENE_MODE_LANDSCAPE
2869          * @see #SCENE_MODE_NIGHT
2870          * @see #SCENE_MODE_NIGHT_PORTRAIT
2871          * @see #SCENE_MODE_THEATRE
2872          * @see #SCENE_MODE_BEACH
2873          * @see #SCENE_MODE_SNOW
2874          * @see #SCENE_MODE_SUNSET
2875          * @see #SCENE_MODE_STEADYPHOTO
2876          * @see #SCENE_MODE_FIREWORKS
2877          * @see #SCENE_MODE_SPORTS
2878          * @see #SCENE_MODE_PARTY
2879          * @see #SCENE_MODE_CANDLELIGHT
2880          * @see #SCENE_MODE_BARCODE
2881          */
2882         public String getSceneMode() {
2883             return get(KEY_SCENE_MODE);
2884         }
2885
2886         /**
2887          * Sets the scene mode. Changing scene mode may override other
2888          * parameters (such as flash mode, focus mode, white balance). For
2889          * example, suppose originally flash mode is on and supported flash
2890          * modes are on/off. In night scene mode, both flash mode and supported
2891          * flash mode may be changed to off. After setting scene mode,
2892          * applications should call getParameters to know if some parameters are
2893          * changed.
2894          *
2895          * @param value scene mode.
2896          * @see #getSceneMode()
2897          */
2898         public void setSceneMode(String value) {
2899             set(KEY_SCENE_MODE, value);
2900         }
2901
2902         /**
2903          * Gets the supported scene modes.
2904          *
2905          * @return a list of supported scene modes. null if scene mode setting
2906          *         is not supported.
2907          * @see #getSceneMode()
2908          */
2909         public List<String> getSupportedSceneModes() {
2910             String str = get(KEY_SCENE_MODE + SUPPORTED_VALUES_SUFFIX);
2911             return split(str);
2912         }
2913
2914         /**
2915          * Gets the current flash mode setting.
2916          *
2917          * @return current flash mode. null if flash mode setting is not
2918          *         supported.
2919          * @see #FLASH_MODE_OFF
2920          * @see #FLASH_MODE_AUTO
2921          * @see #FLASH_MODE_ON
2922          * @see #FLASH_MODE_RED_EYE
2923          * @see #FLASH_MODE_TORCH
2924          */
2925         public String getFlashMode() {
2926             return get(KEY_FLASH_MODE);
2927         }
2928
2929         /**
2930          * Sets the flash mode.
2931          *
2932          * @param value flash mode.
2933          * @see #getFlashMode()
2934          */
2935         public void setFlashMode(String value) {
2936             set(KEY_FLASH_MODE, value);
2937         }
2938
2939         /**
2940          * Gets the supported flash modes.
2941          *
2942          * @return a list of supported flash modes. null if flash mode setting
2943          *         is not supported.
2944          * @see #getFlashMode()
2945          */
2946         public List<String> getSupportedFlashModes() {
2947             String str = get(KEY_FLASH_MODE + SUPPORTED_VALUES_SUFFIX);
2948             return split(str);
2949         }
2950
2951         /**
2952          * Gets the current focus mode setting.
2953          *
2954          * @return current focus mode. This method will always return a non-null
2955          *         value. Applications should call {@link
2956          *         #autoFocus(AutoFocusCallback)} to start the focus if focus
2957          *         mode is FOCUS_MODE_AUTO or FOCUS_MODE_MACRO.
2958          * @see #FOCUS_MODE_AUTO
2959          * @see #FOCUS_MODE_INFINITY
2960          * @see #FOCUS_MODE_MACRO
2961          * @see #FOCUS_MODE_FIXED
2962          * @see #FOCUS_MODE_EDOF
2963          * @see #FOCUS_MODE_CONTINUOUS_VIDEO
2964          */
2965         public String getFocusMode() {
2966             return get(KEY_FOCUS_MODE);
2967         }
2968
2969         /**
2970          * Sets the focus mode.
2971          *
2972          * @param value focus mode.
2973          * @see #getFocusMode()
2974          */
2975         public void setFocusMode(String value) {
2976             set(KEY_FOCUS_MODE, value);
2977         }
2978
2979         /**
2980          * Gets the supported focus modes.
2981          *
2982          * @return a list of supported focus modes. This method will always
2983          *         return a list with at least one element.
2984          * @see #getFocusMode()
2985          */
2986         public List<String> getSupportedFocusModes() {
2987             String str = get(KEY_FOCUS_MODE + SUPPORTED_VALUES_SUFFIX);
2988             return split(str);
2989         }
2990
2991         /**
2992          * Gets the focal length (in millimeter) of the camera.
2993          *
2994          * @return the focal length. This method will always return a valid
2995          *         value.
2996          */
2997         public float getFocalLength() {
2998             return Float.parseFloat(get(KEY_FOCAL_LENGTH));
2999         }
3000
3001         /**
3002          * Gets the horizontal angle of view in degrees.
3003          *
3004          * @return horizontal angle of view. This method will always return a
3005          *         valid value.
3006          */
3007         public float getHorizontalViewAngle() {
3008             return Float.parseFloat(get(KEY_HORIZONTAL_VIEW_ANGLE));
3009         }
3010
3011         /**
3012          * Gets the vertical angle of view in degrees.
3013          *
3014          * @return vertical angle of view. This method will always return a
3015          *         valid value.
3016          */
3017         public float getVerticalViewAngle() {
3018             return Float.parseFloat(get(KEY_VERTICAL_VIEW_ANGLE));
3019         }
3020
3021         /**
3022          * Gets the current exposure compensation index.
3023          *
3024          * @return current exposure compensation index. The range is {@link
3025          *         #getMinExposureCompensation} to {@link
3026          *         #getMaxExposureCompensation}. 0 means exposure is not
3027          *         adjusted.
3028          */
3029         public int getExposureCompensation() {
3030             return getInt(KEY_EXPOSURE_COMPENSATION, 0);
3031         }
3032
3033         /**
3034          * Sets the exposure compensation index.
3035          *
3036          * @param value exposure compensation index. The valid value range is
3037          *        from {@link #getMinExposureCompensation} (inclusive) to {@link
3038          *        #getMaxExposureCompensation} (inclusive). 0 means exposure is
3039          *        not adjusted. Application should call
3040          *        getMinExposureCompensation and getMaxExposureCompensation to
3041          *        know if exposure compensation is supported.
3042          */
3043         public void setExposureCompensation(int value) {
3044             set(KEY_EXPOSURE_COMPENSATION, value);
3045         }
3046
3047         /**
3048          * Gets the maximum exposure compensation index.
3049          *
3050          * @return maximum exposure compensation index (>=0). If both this
3051          *         method and {@link #getMinExposureCompensation} return 0,
3052          *         exposure compensation is not supported.
3053          */
3054         public int getMaxExposureCompensation() {
3055             return getInt(KEY_MAX_EXPOSURE_COMPENSATION, 0);
3056         }
3057
3058         /**
3059          * Gets the minimum exposure compensation index.
3060          *
3061          * @return minimum exposure compensation index (<=0). If both this
3062          *         method and {@link #getMaxExposureCompensation} return 0,
3063          *         exposure compensation is not supported.
3064          */
3065         public int getMinExposureCompensation() {
3066             return getInt(KEY_MIN_EXPOSURE_COMPENSATION, 0);
3067         }
3068
3069         /**
3070          * Gets the exposure compensation step.
3071          *
3072          * @return exposure compensation step. Applications can get EV by
3073          *         multiplying the exposure compensation index and step. Ex: if
3074          *         exposure compensation index is -6 and step is 0.333333333, EV
3075          *         is -2.
3076          */
3077         public float getExposureCompensationStep() {
3078             return getFloat(KEY_EXPOSURE_COMPENSATION_STEP, 0);
3079         }
3080
3081         /**
3082          * <p>Sets the auto-exposure lock state. Applications should check
3083          * {@link #isAutoExposureLockSupported} before using this method.</p>
3084          *
3085          * <p>If set to true, the camera auto-exposure routine will immediately
3086          * pause until the lock is set to false. Exposure compensation settings
3087          * changes will still take effect while auto-exposure is locked.</p>
3088          *
3089          * <p>If auto-exposure is already locked, setting this to true again has
3090          * no effect (the driver will not recalculate exposure values).</p>
3091          *
3092          * <p>Stopping preview with {@link #stopPreview()}, or triggering still
3093          * image capture with {@link #takePicture(Camera.ShutterCallback,
3094          * Camera.PictureCallback, Camera.PictureCallback)}, will not change the
3095          * lock.</p>
3096          *
3097          * <p>Exposure compensation, auto-exposure lock, and auto-white balance
3098          * lock can be used to capture an exposure-bracketed burst of images,
3099          * for example.</p>
3100          *
3101          * <p>Auto-exposure state, including the lock state, will not be
3102          * maintained after camera {@link #release()} is called.  Locking
3103          * auto-exposure after {@link #open()} but before the first call to
3104          * {@link #startPreview()} will not allow the auto-exposure routine to
3105          * run at all, and may result in severely over- or under-exposed
3106          * images.</p>
3107          *
3108          * @param toggle new state of the auto-exposure lock. True means that
3109          *        auto-exposure is locked, false means that the auto-exposure
3110          *        routine is free to run normally.
3111          *
3112          * @see #getAutoExposureLock()
3113          */
3114         public void setAutoExposureLock(boolean toggle) {
3115             set(KEY_AUTO_EXPOSURE_LOCK, toggle ? TRUE : FALSE);
3116         }
3117
3118         /**
3119          * Gets the state of the auto-exposure lock. Applications should check
3120          * {@link #isAutoExposureLockSupported} before using this method. See
3121          * {@link #setAutoExposureLock} for details about the lock.
3122          *
3123          * @return State of the auto-exposure lock. Returns true if
3124          *         auto-exposure is currently locked, and false otherwise.
3125          *
3126          * @see #setAutoExposureLock(boolean)
3127          *
3128          */
3129         public boolean getAutoExposureLock() {
3130             String str = get(KEY_AUTO_EXPOSURE_LOCK);
3131             return TRUE.equals(str);
3132         }
3133
3134         /**
3135          * Returns true if auto-exposure locking is supported. Applications
3136          * should call this before trying to lock auto-exposure. See
3137          * {@link #setAutoExposureLock} for details about the lock.
3138          *
3139          * @return true if auto-exposure lock is supported.
3140          * @see #setAutoExposureLock(boolean)
3141          *
3142          */
3143         public boolean isAutoExposureLockSupported() {
3144             String str = get(KEY_AUTO_EXPOSURE_LOCK_SUPPORTED);
3145             return TRUE.equals(str);
3146         }
3147
3148         /**
3149          * <p>Sets the auto-white balance lock state. Applications should check
3150          * {@link #isAutoWhiteBalanceLockSupported} before using this
3151          * method.</p>
3152          *
3153          * <p>If set to true, the camera auto-white balance routine will
3154          * immediately pause until the lock is set to false.</p>
3155          *
3156          * <p>If auto-white balance is already locked, setting this to true
3157          * again has no effect (the driver will not recalculate white balance
3158          * values).</p>
3159          *
3160          * <p>Stopping preview with {@link #stopPreview()}, or triggering still
3161          * image capture with {@link #takePicture(Camera.ShutterCallback,
3162          * Camera.PictureCallback, Camera.PictureCallback)}, will not change the
3163          * the lock.</p>
3164          *
3165          * <p> Changing the white balance mode with {@link #setWhiteBalance}
3166          * will release the auto-white balance lock if it is set.</p>
3167          *
3168          * <p>Exposure compensation, AE lock, and AWB lock can be used to
3169          * capture an exposure-bracketed burst of images, for example.
3170          * Auto-white balance state, including the lock state, will not be
3171          * maintained after camera {@link #release()} is called.  Locking
3172          * auto-white balance after {@link #open()} but before the first call to
3173          * {@link #startPreview()} will not allow the auto-white balance routine
3174          * to run at all, and may result in severely incorrect color in captured
3175          * images.</p>
3176          *
3177          * @param toggle new state of the auto-white balance lock. True means
3178          *        that auto-white balance is locked, false means that the
3179          *        auto-white balance routine is free to run normally.
3180          *
3181          * @see #getAutoWhiteBalanceLock()
3182          * @see #setWhiteBalance(String)
3183          */
3184         public void setAutoWhiteBalanceLock(boolean toggle) {
3185             set(KEY_AUTO_WHITEBALANCE_LOCK, toggle ? TRUE : FALSE);
3186         }
3187
3188         /**
3189          * Gets the state of the auto-white balance lock. Applications should
3190          * check {@link #isAutoWhiteBalanceLockSupported} before using this
3191          * method. See {@link #setAutoWhiteBalanceLock} for details about the
3192          * lock.
3193          *
3194          * @return State of the auto-white balance lock. Returns true if
3195          *         auto-white balance is currently locked, and false
3196          *         otherwise.
3197          *
3198          * @see #setAutoWhiteBalanceLock(boolean)
3199          *
3200          */
3201         public boolean getAutoWhiteBalanceLock() {
3202             String str = get(KEY_AUTO_WHITEBALANCE_LOCK);
3203             return TRUE.equals(str);
3204         }
3205
3206         /**
3207          * Returns true if auto-white balance locking is supported. Applications
3208          * should call this before trying to lock auto-white balance. See
3209          * {@link #setAutoWhiteBalanceLock} for details about the lock.
3210          *
3211          * @return true if auto-white balance lock is supported.
3212          * @see #setAutoWhiteBalanceLock(boolean)
3213          *
3214          */
3215         public boolean isAutoWhiteBalanceLockSupported() {
3216             String str = get(KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED);
3217             return TRUE.equals(str);
3218         }
3219
3220         /**
3221          * Gets current zoom value. This also works when smooth zoom is in
3222          * progress. Applications should check {@link #isZoomSupported} before
3223          * using this method.
3224          *
3225          * @return the current zoom value. The range is 0 to {@link
3226          *         #getMaxZoom}. 0 means the camera is not zoomed.
3227          */
3228         public int getZoom() {
3229             return getInt(KEY_ZOOM, 0);
3230         }
3231
3232         /**
3233          * Sets current zoom value. If the camera is zoomed (value > 0), the
3234          * actual picture size may be smaller than picture size setting.
3235          * Applications can check the actual picture size after picture is
3236          * returned from {@link PictureCallback}. The preview size remains the
3237          * same in zoom. Applications should check {@link #isZoomSupported}
3238          * before using this method.
3239          *
3240          * @param value zoom value. The valid range is 0 to {@link #getMaxZoom}.
3241          */
3242         public void setZoom(int value) {
3243             set(KEY_ZOOM, value);
3244         }
3245
3246         /**
3247          * Returns true if zoom is supported. Applications should call this
3248          * before using other zoom methods.
3249          *
3250          * @return true if zoom is supported.
3251          */
3252         public boolean isZoomSupported() {
3253             String str = get(KEY_ZOOM_SUPPORTED);
3254             return TRUE.equals(str);
3255         }
3256
3257         /**
3258          * Gets the maximum zoom value allowed for snapshot. This is the maximum
3259          * value that applications can set to {@link #setZoom(int)}.
3260          * Applications should call {@link #isZoomSupported} before using this
3261          * method. This value may change in different preview size. Applications
3262          * should call this again after setting preview size.
3263          *
3264          * @return the maximum zoom value supported by the camera.
3265          */
3266         public int getMaxZoom() {
3267             return getInt(KEY_MAX_ZOOM, 0);
3268         }
3269
3270         /**
3271          * Gets the zoom ratios of all zoom values. Applications should check
3272          * {@link #isZoomSupported} before using this method.
3273          *
3274          * @return the zoom ratios in 1/100 increments. Ex: a zoom of 3.2x is
3275          *         returned as 320. The number of elements is {@link
3276          *         #getMaxZoom} + 1. The list is sorted from small to large. The
3277          *         first element is always 100. The last element is the zoom
3278          *         ratio of the maximum zoom value.
3279          */
3280         public List<Integer> getZoomRatios() {
3281             return splitInt(get(KEY_ZOOM_RATIOS));
3282         }
3283
3284         /**
3285          * Returns true if smooth zoom is supported. Applications should call
3286          * this before using other smooth zoom methods.
3287          *
3288          * @return true if smooth zoom is supported.
3289          */
3290         public boolean isSmoothZoomSupported() {
3291             String str = get(KEY_SMOOTH_ZOOM_SUPPORTED);
3292             return TRUE.equals(str);
3293         }
3294
3295         /**
3296          * <p>Gets the distances from the camera to where an object appears to be
3297          * in focus. The object is sharpest at the optimal focus distance. The
3298          * depth of field is the far focus distance minus near focus distance.</p>
3299          *
3300          * <p>Focus distances may change after calling {@link
3301          * #autoFocus(AutoFocusCallback)}, {@link #cancelAutoFocus}, or {@link
3302          * #startPreview()}. Applications can call {@link #getParameters()}
3303          * and this method anytime to get the latest focus distances. If the
3304          * focus mode is FOCUS_MODE_CONTINUOUS_VIDEO, focus distances may change
3305          * from time to time.</p>
3306          *
3307          * <p>This method is intended to estimate the distance between the camera
3308          * and the subject. After autofocus, the subject distance may be within
3309          * near and far focus distance. However, the precision depends on the
3310          * camera hardware, autofocus algorithm, the focus area, and the scene.
3311          * The error can be large and it should be only used as a reference.</p>
3312          *
3313          * <p>Far focus distance >= optimal focus distance >= near focus distance.
3314          * If the focus distance is infinity, the value will be
3315          * {@code Float.POSITIVE_INFINITY}.</p>
3316          *
3317          * @param output focus distances in meters. output must be a float
3318          *        array with three elements. Near focus distance, optimal focus
3319          *        distance, and far focus distance will be filled in the array.
3320          * @see #FOCUS_DISTANCE_NEAR_INDEX
3321          * @see #FOCUS_DISTANCE_OPTIMAL_INDEX
3322          * @see #FOCUS_DISTANCE_FAR_INDEX
3323          */
3324         public void getFocusDistances(float[] output) {
3325             if (output == null || output.length != 3) {
3326                 throw new IllegalArgumentException(
3327                         "output must be a float array with three elements.");
3328             }
3329             splitFloat(get(KEY_FOCUS_DISTANCES), output);
3330         }
3331
3332         /**
3333          * Gets the maximum number of focus areas supported. This is the maximum
3334          * length of the list in {@link #setFocusAreas(List)} and
3335          * {@link #getFocusAreas()}.
3336          *
3337          * @return the maximum number of focus areas supported by the camera.
3338          * @see #getFocusAreas()
3339          */
3340         public int getMaxNumFocusAreas() {
3341             return getInt(KEY_MAX_NUM_FOCUS_AREAS, 0);
3342         }
3343
3344         /**
3345          * <p>Gets the current focus areas. Camera driver uses the areas to decide
3346          * focus.</p>
3347          *
3348          * <p>Before using this API or {@link #setFocusAreas(List)}, apps should
3349          * call {@link #getMaxNumFocusAreas()} to know the maximum number of
3350          * focus areas first. If the value is 0, focus area is not supported.</p>
3351          *
3352          * <p>Each focus area is a rectangle with specified weight. The direction
3353          * is relative to the sensor orientation, that is, what the sensor sees.
3354          * The direction is not affected by the rotation or mirroring of
3355          * {@link #setDisplayOrientation(int)}. Coordinates of the rectangle
3356          * range from -1000 to 1000. (-1000, -1000) is the upper left point.
3357          * (1000, 1000) is the lower right point. The width and height of focus
3358          * areas cannot be 0 or negative.</p>
3359          *
3360          * <p>The weight must range from 1 to 1000. The weight should be
3361          * interpreted as a per-pixel weight - all pixels in the area have the
3362          * specified weight. This means a small area with the same weight as a
3363          * larger area will have less influence on the focusing than the larger
3364          * area. Focus areas can partially overlap and the driver will add the
3365          * weights in the overlap region.</p>
3366          *
3367          * <p>A special case of a {@code null} focus area list means the driver is
3368          * free to select focus targets as it wants. For example, the driver may
3369          * use more signals to select focus areas and change them
3370          * dynamically. Apps can set the focus area list to {@code null} if they
3371          * want the driver to completely control focusing.</p>
3372          *
3373          * <p>Focus areas are relative to the current field of view
3374          * ({@link #getZoom()}). No matter what the zoom level is, (-1000,-1000)
3375          * represents the top of the currently visible camera frame. The focus
3376          * area cannot be set to be outside the current field of view, even
3377          * when using zoom.</p>
3378          *
3379          * <p>Focus area only has effect if the current focus mode is
3380          * {@link #FOCUS_MODE_AUTO}, {@link #FOCUS_MODE_MACRO},
3381          * {@link #FOCUS_MODE_CONTINUOUS_VIDEO}, or
3382          * {@link #FOCUS_MODE_CONTINUOUS_PICTURE}.</p>
3383          *
3384          * @return a list of current focus areas
3385          */
3386         public List<Area> getFocusAreas() {
3387             return splitArea(get(KEY_FOCUS_AREAS));
3388         }
3389
3390         /**
3391          * Sets focus areas. See {@link #getFocusAreas()} for documentation.
3392          *
3393          * @param focusAreas the focus areas
3394          * @see #getFocusAreas()
3395          */
3396         public void setFocusAreas(List<Area> focusAreas) {
3397             set(KEY_FOCUS_AREAS, focusAreas);
3398         }
3399
3400         /**
3401          * Gets the maximum number of metering areas supported. This is the
3402          * maximum length of the list in {@link #setMeteringAreas(List)} and
3403          * {@link #getMeteringAreas()}.
3404          *
3405          * @return the maximum number of metering areas supported by the camera.
3406          * @see #getMeteringAreas()
3407          */
3408         public int getMaxNumMeteringAreas() {
3409             return getInt(KEY_MAX_NUM_METERING_AREAS, 0);
3410         }
3411
3412         /**
3413          * <p>Gets the current metering areas. Camera driver uses these areas to
3414          * decide exposure.</p>
3415          *
3416          * <p>Before using this API or {@link #setMeteringAreas(List)}, apps should
3417          * call {@link #getMaxNumMeteringAreas()} to know the maximum number of
3418          * metering areas first. If the value is 0, metering area is not
3419          * supported.</p>
3420          *
3421          * <p>Each metering area is a rectangle with specified weight. The
3422          * direction is relative to the sensor orientation, that is, what the
3423          * sensor sees. The direction is not affected by the rotation or
3424          * mirroring of {@link #setDisplayOrientation(int)}. Coordinates of the
3425          * rectangle range from -1000 to 1000. (-1000, -1000) is the upper left
3426          * point. (1000, 1000) is the lower right point. The width and height of
3427          * metering areas cannot be 0 or negative.</p>
3428          *
3429          * <p>The weight must range from 1 to 1000, and represents a weight for
3430          * every pixel in the area. This means that a large metering area with
3431          * the same weight as a smaller area will have more effect in the
3432          * metering result.  Metering areas can partially overlap and the driver
3433          * will add the weights in the overlap region.</p>
3434          *
3435          * <p>A special case of a {@code null} metering area list means the driver
3436          * is free to meter as it chooses. For example, the driver may use more
3437          * signals to select metering areas and change them dynamically. Apps
3438          * can set the metering area list to {@code null} if they want the
3439          * driver to completely control metering.</p>
3440          *
3441          * <p>Metering areas are relative to the current field of view
3442          * ({@link #getZoom()}). No matter what the zoom level is, (-1000,-1000)
3443          * represents the top of the currently visible camera frame. The
3444          * metering area cannot be set to be outside the current field of view,
3445          * even when using zoom.</p>
3446          *
3447          * <p>No matter what metering areas are, the final exposure are compensated
3448          * by {@link #setExposureCompensation(int)}.</p>
3449          *
3450          * @return a list of current metering areas
3451          */
3452         public List<Area> getMeteringAreas() {
3453             return splitArea(get(KEY_METERING_AREAS));
3454         }
3455
3456         /**
3457          * Sets metering areas. See {@link #getMeteringAreas()} for
3458          * documentation.
3459          *
3460          * @param meteringAreas the metering areas
3461          * @see #getMeteringAreas()
3462          */
3463         public void setMeteringAreas(List<Area> meteringAreas) {
3464             set(KEY_METERING_AREAS, meteringAreas);
3465         }
3466
3467         /**
3468          * Gets the maximum number of detected faces supported. This is the
3469          * maximum length of the list returned from {@link FaceDetectionListener}.
3470          * If the return value is 0, face detection of the specified type is not
3471          * supported.
3472          *
3473          * @return the maximum number of detected face supported by the camera.
3474          * @see #startFaceDetection()
3475          */
3476         public int getMaxNumDetectedFaces() {
3477             return getInt(KEY_MAX_NUM_DETECTED_FACES_HW, 0);
3478         }
3479
3480         /**
3481          * Sets recording mode hint. This tells the camera that the intent of
3482          * the application is to record videos {@link
3483          * android.media.MediaRecorder#start()}, not to take still pictures
3484          * {@link #takePicture(Camera.ShutterCallback, Camera.PictureCallback,
3485          * Camera.PictureCallback, Camera.PictureCallback)}. Using this hint can
3486          * allow MediaRecorder.start() to start faster or with fewer glitches on
3487          * output. This should be called before starting preview for the best
3488          * result, but can be changed while the preview is active. The default
3489          * value is false.
3490          *
3491          * The app can still call takePicture() when the hint is true or call
3492          * MediaRecorder.start() when the hint is false. But the performance may
3493          * be worse.
3494          *
3495          * @param hint true if the apps intend to record videos using
3496          *             {@link android.media.MediaRecorder}.
3497          */
3498         public void setRecordingHint(boolean hint) {
3499             set(KEY_RECORDING_HINT, hint ? TRUE : FALSE);
3500         }
3501
3502         /**
3503          * <p>Returns true if video snapshot is supported. That is, applications
3504          * can call {@link #takePicture(Camera.ShutterCallback,
3505          * Camera.PictureCallback, Camera.PictureCallback,
3506          * Camera.PictureCallback)} during recording. Applications do not need
3507          * to call {@link #startPreview()} after taking a picture. The preview
3508          * will be still active. Other than that, taking a picture during
3509          * recording is identical to taking a picture normally. All settings and
3510          * methods related to takePicture work identically. Ex:
3511          * {@link #getPictureSize()}, {@link #getSupportedPictureSizes()},
3512          * {@link #setJpegQuality(int)}, {@link #setRotation(int)}, and etc. The
3513          * picture will have an EXIF header. {@link #FLASH_MODE_AUTO} and
3514          * {@link #FLASH_MODE_ON} also still work, but the video will record the
3515          * flash.</p>
3516          *
3517          * <p>Applications can set shutter callback as null to avoid the shutter
3518          * sound. It is also recommended to set raw picture and post view
3519          * callbacks to null to avoid the interrupt of preview display.</p>
3520          *
3521          * <p>Field-of-view of the recorded video may be different from that of the
3522          * captured pictures. The maximum size of a video snapshot may be
3523          * smaller than that for regular still captures. If the current picture
3524          * size is set higher than can be supported by video snapshot, the
3525          * picture will be captured at the maximum supported size instead.</p>
3526          *
3527          * @return true if video snapshot is supported.
3528          */
3529         public boolean isVideoSnapshotSupported() {
3530             String str = get(KEY_VIDEO_SNAPSHOT_SUPPORTED);
3531             return TRUE.equals(str);
3532         }
3533
3534         /**
3535          * <p>Enables and disables video stabilization. Use
3536          * {@link #isVideoStabilizationSupported} to determine if calling this
3537          * method is valid.</p>
3538          *
3539          * <p>Video stabilization reduces the shaking due to the motion of the
3540          * camera in both the preview stream and in recorded videos, including
3541          * data received from the preview callback. It does not reduce motion
3542          * blur in images captured with
3543          * {@link Camera#takePicture takePicture}.</p>
3544          *
3545          * <p>Video stabilization can be enabled and disabled while preview or
3546          * recording is active, but toggling it may cause a jump in the video
3547          * stream that may be undesirable in a recorded video.</p>
3548          *
3549          * @param toggle Set to true to enable video stabilization, and false to
3550          * disable video stabilization.
3551          * @see #isVideoStabilizationSupported()
3552          * @see #getVideoStabilization()
3553          */
3554         public void setVideoStabilization(boolean toggle) {
3555             set(KEY_VIDEO_STABILIZATION, toggle ? TRUE : FALSE);
3556         }
3557
3558         /**
3559          * Get the current state of video stabilization. See
3560          * {@link #setVideoStabilization} for details of video stabilization.
3561          *
3562          * @return true if video stabilization is enabled
3563          * @see #isVideoStabilizationSupported()
3564          * @see #setVideoStabilization(boolean)
3565          */
3566         public boolean getVideoStabilization() {
3567             String str = get(KEY_VIDEO_STABILIZATION);
3568             return TRUE.equals(str);
3569         }
3570
3571         /**
3572          * Returns true if video stabilization is supported. See
3573          * {@link #setVideoStabilization} for details of video stabilization.
3574          *
3575          * @return true if video stabilization is supported
3576          * @see #setVideoStabilization(boolean)
3577          * @see #getVideoStabilization()
3578          */
3579         public boolean isVideoStabilizationSupported() {
3580             String str = get(KEY_VIDEO_STABILIZATION_SUPPORTED);
3581             return TRUE.equals(str);
3582         }
3583
3584         // Splits a comma delimited string to an ArrayList of String.
3585         // Return null if the passing string is null or the size is 0.
3586         private ArrayList<String> split(String str) {
3587             if (str == null) return null;
3588
3589             TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
3590             splitter.setString(str);
3591             ArrayList<String> substrings = new ArrayList<String>();
3592             for (String s : splitter) {
3593                 substrings.add(s);
3594             }
3595             return substrings;
3596         }
3597
3598         // Splits a comma delimited string to an ArrayList of Integer.
3599         // Return null if the passing string is null or the size is 0.
3600         private ArrayList<Integer> splitInt(String str) {
3601             if (str == null) return null;
3602
3603             TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
3604             splitter.setString(str);
3605             ArrayList<Integer> substrings = new ArrayList<Integer>();
3606             for (String s : splitter) {
3607                 substrings.add(Integer.parseInt(s));
3608             }
3609             if (substrings.size() == 0) return null;
3610             return substrings;
3611         }
3612
3613         private void splitInt(String str, int[] output) {
3614             if (str == null) return;
3615
3616             TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
3617             splitter.setString(str);
3618             int index = 0;
3619             for (String s : splitter) {
3620                 output[index++] = Integer.parseInt(s);
3621             }
3622         }
3623
3624         // Splits a comma delimited string to an ArrayList of Float.
3625         private void splitFloat(String str, float[] output) {
3626             if (str == null) return;
3627
3628             TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
3629             splitter.setString(str);
3630             int index = 0;
3631             for (String s : splitter) {
3632                 output[index++] = Float.parseFloat(s);
3633             }
3634         }
3635
3636         // Returns the value of a float parameter.
3637         private float getFloat(String key, float defaultValue) {
3638             try {
3639                 return Float.parseFloat(mMap.get(key));
3640             } catch (NumberFormatException ex) {
3641                 return defaultValue;
3642             }
3643         }
3644
3645         // Returns the value of a integer parameter.
3646         private int getInt(String key, int defaultValue) {
3647             try {
3648                 return Integer.parseInt(mMap.get(key));
3649             } catch (NumberFormatException ex) {
3650                 return defaultValue;
3651             }
3652         }
3653
3654         // Splits a comma delimited string to an ArrayList of Size.
3655         // Return null if the passing string is null or the size is 0.
3656         private ArrayList<Size> splitSize(String str) {
3657             if (str == null) return null;
3658
3659             TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
3660             splitter.setString(str);
3661             ArrayList<Size> sizeList = new ArrayList<Size>();
3662             for (String s : splitter) {
3663                 Size size = strToSize(s);
3664                 if (size != null) sizeList.add(size);
3665             }
3666             if (sizeList.size() == 0) return null;
3667             return sizeList;
3668         }
3669
3670         // Parses a string (ex: "480x320") to Size object.
3671         // Return null if the passing string is null.
3672         private Size strToSize(String str) {
3673             if (str == null) return null;
3674
3675             int pos = str.indexOf('x');
3676             if (pos != -1) {
3677                 String width = str.substring(0, pos);
3678                 String height = str.substring(pos + 1);
3679                 return new Size(Integer.parseInt(width),
3680                                 Integer.parseInt(height));
3681             }
3682             Log.e(TAG, "Invalid size parameter string=" + str);
3683             return null;
3684         }
3685
3686         // Splits a comma delimited string to an ArrayList of int array.
3687         // Example string: "(10000,26623),(10000,30000)". Return null if the
3688         // passing string is null or the size is 0.
3689         private ArrayList<int[]> splitRange(String str) {
3690             if (str == null || str.charAt(0) != '('
3691                     || str.charAt(str.length() - 1) != ')') {
3692                 Log.e(TAG, "Invalid range list string=" + str);
3693                 return null;
3694             }
3695
3696             ArrayList<int[]> rangeList = new ArrayList<int[]>();
3697             int endIndex, fromIndex = 1;
3698             do {
3699                 int[] range = new int[2];
3700                 endIndex = str.indexOf("),(", fromIndex);
3701                 if (endIndex == -1) endIndex = str.length() - 1;
3702                 splitInt(str.substring(fromIndex, endIndex), range);
3703                 rangeList.add(range);
3704                 fromIndex = endIndex + 3;
3705             } while (endIndex != str.length() - 1);
3706
3707             if (rangeList.size() == 0) return null;
3708             return rangeList;
3709         }
3710
3711         // Splits a comma delimited string to an ArrayList of Area objects.
3712         // Example string: "(-10,-10,0,0,300),(0,0,10,10,700)". Return null if
3713         // the passing string is null or the size is 0 or (0,0,0,0,0).
3714         private ArrayList<Area> splitArea(String str) {
3715             if (str == null || str.charAt(0) != '('
3716                     || str.charAt(str.length() - 1) != ')') {
3717                 Log.e(TAG, "Invalid area string=" + str);
3718                 return null;
3719             }
3720
3721             ArrayList<Area> result = new ArrayList<Area>();
3722             int endIndex, fromIndex = 1;
3723             int[] array = new int[5];
3724             do {
3725                 endIndex = str.indexOf("),(", fromIndex);
3726                 if (endIndex == -1) endIndex = str.length() - 1;
3727                 splitInt(str.substring(fromIndex, endIndex), array);
3728                 Rect rect = new Rect(array[0], array[1], array[2], array[3]);
3729                 result.add(new Area(rect, array[4]));
3730                 fromIndex = endIndex + 3;
3731             } while (endIndex != str.length() - 1);
3732
3733             if (result.size() == 0) return null;
3734
3735             if (result.size() == 1) {
3736                 Area area = result.get(0);
3737                 Rect rect = area.rect;
3738                 if (rect.left == 0 && rect.top == 0 && rect.right == 0
3739                         && rect.bottom == 0 && area.weight == 0) {
3740                     return null;
3741                 }
3742             }
3743
3744             return result;
3745         }
3746
3747         private boolean same(String s1, String s2) {
3748             if (s1 == null && s2 == null) return true;
3749             if (s1 != null && s1.equals(s2)) return true;
3750             return false;
3751         }
3752     };
3753 }