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