MediaRecorder.java revision 2450830c0c41a45d333838f4dcf3ba1e4a2409a2
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dongimport android.media.CamcorderProfile;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.Camera;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to record audio and video. The recording control is based on a
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simple state machine (see below).
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><img src="{@docRoot}images/mediarecorder_state_diagram.gif" border="0" />
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A common case of using MediaRecorder to record audio works as follows:
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>MediaRecorder recorder = new MediaRecorder();
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.setOutputFile(PATH_NAME);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.prepare();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.start();   // Recording is now started
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ...
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.stop();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.reset();   // You can reuse the object by going back to setAudioSource() step
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorder.release(); // Now the object cannot be reused
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * documentation for additional help with using MediaRecorder.
5690f8680f41525e5e5d9b811af60793a0396a32e3James Dong * <p>Note: Currently, MediaRecorder does not work on the emulator.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MediaRecorder
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.loadLibrary("media_jni");
624935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        native_init();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "MediaRecorder";
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // The two fields below are accessed by native methods
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNativeContext;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Surface mSurface;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mPath;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private FileDescriptor mFd;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EventHandler mEventHandler;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnErrorListener mOnErrorListener;
77ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private OnInfoListener mOnInfoListener;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default constructor.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MediaRecorder() {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Looper looper;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((looper = Looper.myLooper()) != null) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEventHandler = new EventHandler(this, looper);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ((looper = Looper.getMainLooper()) != null) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEventHandler = new EventHandler(this, looper);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEventHandler = null;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* Native setup requires a weak reference to our object.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * It's easier to create it here than in C++.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setup(new WeakReference<MediaRecorder>(this));
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets a Camera to use for recording. Use this function to switch
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * quickly between preview and capture mode without a teardown of
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the camera object. Must call before prepare().
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c the Camera to use for recording
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setCamera(Camera c);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets a Surface to show a preview of recorded media (video). Calls this
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before prepare() to make sure that the desirable preview display is
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sv the Surface to use for the preview
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPreviewDisplay(Surface sv) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSurface = sv;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the audio source. These constants are used with
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MediaRecorder#setAudioSource(int)}.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class AudioSource {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      /* Do not change these values without updating their counterparts
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       * in include/media/mediarecorder.h!
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       */
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private AudioSource() {}
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DEFAULT = 0;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Microphone audio source */
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MIC = 1;
1314bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
1324bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent        /** Voice call uplink (Tx) audio source */
1334bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent        public static final int VOICE_UPLINK = 2;
1344bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
1354bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent        /** Voice call downlink (Rx) audio source */
1364bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent        public static final int VOICE_DOWNLINK = 3;
1374bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
1384bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent        /** Voice call uplink + downlink audio source */
1394bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent        public static final int VOICE_CALL = 4;
1406869df3a5db0ca0037394f0fd14aecc1d80b5b42Jean-Michel Trivi
141941136fd089d40a80d63fcaf99b4a0bdeb6e349cJean-Michel Trivi        /** Microphone audio source with same orientation as camera if available, the main
142941136fd089d40a80d63fcaf99b4a0bdeb6e349cJean-Michel Trivi         *  device microphone otherwise */
1436869df3a5db0ca0037394f0fd14aecc1d80b5b42Jean-Michel Trivi        public static final int CAMCORDER = 5;
1446869df3a5db0ca0037394f0fd14aecc1d80b5b42Jean-Michel Trivi
145941136fd089d40a80d63fcaf99b4a0bdeb6e349cJean-Michel Trivi        /** Microphone audio source tuned for voice recognition if available, behaves like
146941136fd089d40a80d63fcaf99b4a0bdeb6e349cJean-Michel Trivi         *  {@link #DEFAULT} otherwise. */
1476869df3a5db0ca0037394f0fd14aecc1d80b5b42Jean-Michel Trivi        public static final int VOICE_RECOGNITION = 6;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the video source. These constants are used with
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MediaRecorder#setVideoSource(int)}.
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class VideoSource {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      /* Do not change these values without updating their counterparts
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       * in include/media/mediarecorder.h!
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private VideoSource() {}
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DEFAULT = 0;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Camera video source */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CAMERA = 1;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the output format. These constants are used with
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MediaRecorder#setOutputFormat(int)}.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class OutputFormat {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      /* Do not change these values without updating their counterparts
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       * in include/media/mediarecorder.h!
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private OutputFormat() {}
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DEFAULT = 0;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** 3GPP media file format*/
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int THREE_GPP = 1;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** MPEG4 media file format*/
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MPEG_4 = 2;
1782bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang
1792bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** The following formats are audio only .aac or .amr formats **/
1802bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @deprecated  Deprecated in favor of AMR_NB */
181e1a7ad23e0cefefc1e5c762a3d88179971077dccDianne Hackborn        /** TODO: change link when AMR_NB is exposed. Deprecated in favor of MediaRecorder.OutputFormat.AMR_NB */
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RAW_AMR = 3;
1832bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide AMR NB file format */
1842bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int AMR_NB = 3;
1852bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide AMR WB file format */
1862bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int AMR_WB = 4;
1872bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide AAC ADIF file format */
1882bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int AAC_ADIF = 5;
1892bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide AAC ADTS file format */
1902bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int AAC_ADTS = 6;
19157648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber
19257648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber        /** @hide Stream over a socket, limited to a single stream */
19357648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber        public static final int OUTPUT_FORMAT_RTP_AVP = 7;
1949adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huber
1959adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huber        /** @hide H.264/AAC data encapsulated in MPEG2/TS */
1969adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huber        public static final int OUTPUT_FORMAT_MPEG2TS = 8;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the audio encoding. These constants are used with
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MediaRecorder#setAudioEncoder(int)}.
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class AudioEncoder {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      /* Do not change these values without updating their counterparts
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       * in include/media/mediarecorder.h!
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       */
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private AudioEncoder() {}
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DEFAULT = 0;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AMR (Narrowband) audio codec */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int AMR_NB = 1;
2112bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide AMR (Wideband) audio codec */
2122bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int AMR_WB = 2;
2132bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide AAC audio codec */
2142bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int AAC = 3;
2152bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide enhanced AAC audio codec */
2162bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int AAC_PLUS = 4;
2172bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        /** @hide enhanced AAC plus audio codec */
2182bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang        public static final int EAAC_PLUS = 5;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the video encoding. These constants are used with
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MediaRecorder#setVideoEncoder(int)}.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class VideoEncoder {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      /* Do not change these values without updating their counterparts
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       * in include/media/mediarecorder.h!
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private VideoEncoder() {}
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DEFAULT = 0;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int H263 = 1;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int H264 = 2;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MPEG_4_SP = 3;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the audio source to be used for recording. If this method is not
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called, the output file will not contain an audio track. The source needs
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to be specified before setting recording-parameters or encoders. Call
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this only before setOutputFormat().
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param audio_source the audio source to use
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called after setOutputFormat()
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaRecorder.AudioSource
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setAudioSource(int audio_source)
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalStateException;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2504bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent     * Gets the maximum value for audio sources.
2514bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent     * @see android.media.MediaRecorder.AudioSource
2524bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent     */
2536869df3a5db0ca0037394f0fd14aecc1d80b5b42Jean-Michel Trivi    public static final int getAudioSourceMax() { return AudioSource.VOICE_RECOGNITION; }
2544bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
2554bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the video source to be used for recording. If this method is not
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called, the output file will not contain an video track. The source needs
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to be specified before setting recording-parameters or encoders. Call
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this only before setOutputFormat().
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param video_source the video source to use
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called after setOutputFormat()
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaRecorder.VideoSource
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setVideoSource(int video_source)
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalStateException;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
269e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * Uses the settings from a CamcorderProfile object for recording. This method should
270e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * be called after the video AND audio sources are set, and before setOutputFile().
271e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     *
272e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * @param profile the CamcorderProfile to use
273e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * @see android.media.CamcorderProfile
274e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     */
275e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public void setProfile(CamcorderProfile profile) {
276e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setOutputFormat(profile.fileFormat);
277e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setVideoFrameRate(profile.videoFrameRate);
278e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
279e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setVideoEncodingBitRate(profile.videoBitRate);
280e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setAudioEncodingBitRate(profile.audioBitRate);
281e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setAudioChannels(profile.audioChannels);
282e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setAudioSamplingRate(profile.audioSampleRate);
283e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setVideoEncoder(profile.videoCodec);
284e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        setAudioEncoder(profile.audioCodec);
285e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    }
286e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong
287e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    /**
288ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * Sets the orientation hint for output video playback.
2895aa95dd36cd0708d25accd8d745ae8ebc255758fJames Dong     * This method should be called before prepare(). This method will not
290ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * trigger the source video frame to rotate during video recording, but to
291ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * add a composition matrix containing the rotation angle in the output
292ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * video if the output format is OutputFormat.THREE_GPP or
293ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * OutputFormat.MPEG_4 so that a video player can choose the proper
294ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * orientation for playback. Note that some video players may choose
295ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * to ignore the compostion matrix in a video during playback.
296ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     *
297ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * @param degrees the angle to be rotated clockwise in degrees.
298ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * The supported angles are 0, 90, 180, and 270 degrees.
299ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     * @throws IllegalArgumentException if the angle is not supported.
300ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     *
301ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong     */
302ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong    public void setOrientationHint(int degrees) {
303ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong        if (degrees != 0   &&
304ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong            degrees != 90  &&
305ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong            degrees != 180 &&
306ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong            degrees != 270) {
307ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong            throw new IllegalArgumentException("Unsupported angle: " + degrees);
308ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong        }
3092450830c0c41a45d333838f4dcf3ba1e4a2409a2Henrik Backlund        setParameter("video-param-rotation-angle-degrees=" + degrees);
310ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong    }
311ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong
312ad8f19c6b3167cadc90a35f4d795b07aa2f04ffaJames Dong    /**
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the format of the output file produced during recording. Call this
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after setAudioSource()/setVideoSource() but before prepare().
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3162170312ab0b6766e8b73b806efbe6abdbb702bbcDave Sparks     * <p>It is recommended to always use 3GP format when using the H.263
3172170312ab0b6766e8b73b806efbe6abdbb702bbcDave Sparks     * video encoder and AMR audio encoder. Using an MPEG-4 container format
3182170312ab0b6766e8b73b806efbe6abdbb702bbcDave Sparks     * may confuse some desktop players.</p>
3192170312ab0b6766e8b73b806efbe6abdbb702bbcDave Sparks     *
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param output_format the output format to use. The output format
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * needs to be specified before setting recording-parameters or encoders.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called after prepare() or before
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setAudioSource()/setVideoSource().
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaRecorder.OutputFormat
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setOutputFormat(int output_format)
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalStateException;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the width and height of the video to be captured.  Must be called
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after setVideoSource(). Call this after setOutFormat() but before
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prepare().
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param width the width of the video to be captured
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param height the height of the video to be captured
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called after
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prepare() or before setOutputFormat()
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setVideoSize(int width, int height)
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalStateException;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the frame rate of the video to be captured.  Must be called
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after setVideoSource(). Call this after setOutFormat() but before
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prepare().
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rate the number of frames per second of video to capture
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called after
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prepare() or before setOutputFormat().
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: On some devices that have auto-frame rate, this sets the
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * maximum frame rate, not a constant frame rate. Actual frame rate
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will vary according to lighting conditions.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setVideoFrameRate(int rate) throws IllegalStateException;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
358ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Sets the maximum duration (in ms) of the recording session.
359ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Call this after setOutFormat() but before prepare().
360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * After recording reaches the specified duration, a notification
361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * will be sent to the {@link android.media.MediaRecorder.OnInfoListener}
362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * with a "what" code of {@link #MEDIA_RECORDER_INFO_MAX_DURATION_REACHED}
363105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * and recording will be stopped. Stopping happens asynchronously, there
364105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * is no guarantee that the recorder will have stopped by the time the
365105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * listener is notified.
366ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
367ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param max_duration_ms the maximum duration in ms (if zero or negative, disables the duration limit)
368ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
369ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
370ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public native void setMaxDuration(int max_duration_ms) throws IllegalArgumentException;
371ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
372ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
373105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Sets the maximum filesize (in bytes) of the recording session.
374105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Call this after setOutFormat() but before prepare().
375105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * After recording reaches the specified filesize, a notification
376105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * will be sent to the {@link android.media.MediaRecorder.OnInfoListener}
377105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * with a "what" code of {@link #MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED}
378105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * and recording will be stopped. Stopping happens asynchronously, there
379105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * is no guarantee that the recorder will have stopped by the time the
380105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * listener is notified.
381105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
382105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param max_filesize_bytes the maximum filesize in bytes (if zero or negative, disables the limit)
383105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
384105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
385105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public native void setMaxFileSize(long max_filesize_bytes) throws IllegalArgumentException;
386105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
387105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the audio encoder to be used for recording. If this method is not
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called, the output file will not contain an audio track. Call this after
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() but before prepare().
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param audio_encoder the audio encoder to use.
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called before
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() or after prepare().
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaRecorder.AudioEncoder
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setAudioEncoder(int audio_encoder)
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalStateException;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the video encoder to be used for recording. If this method is not
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called, the output file will not contain an video track. Call this after
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() and before prepare().
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param video_encoder the video encoder to use.
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called before
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() or after prepare()
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaRecorder.VideoEncoder
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setVideoEncoder(int video_encoder)
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalStateException;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4140fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Sets the audio sampling rate for recording. Call this method before prepare().
4150fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Prepare() may perform additional checks on the parameter to make sure whether
4160fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * the specified audio sampling rate is applicable. The sampling rate really depends
4170fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * on the format for the audio recording, as well as the capabilities of the platform.
4180fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * For instance, the sampling rate supported by AAC audio coding standard ranges
4190fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * from 8 to 96 kHz. Please consult with the related audio coding standard for the
4200fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * supported audio sampling rate.
4210fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     *
4220fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * @param samplingRate the sampling rate for audio in samples per second.
4230fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     */
4240fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    public void setAudioSamplingRate(int samplingRate) {
4250fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        if (samplingRate <= 0) {
4260fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            throw new IllegalArgumentException("Audio sampling rate is not positive");
4270fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        }
4282450830c0c41a45d333838f4dcf3ba1e4a2409a2Henrik Backlund        setParameter("audio-param-sampling-rate=" + samplingRate);
4290fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    }
4300fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong
4310fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    /**
4320fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Sets the number of audio channels for recording. Call this method before prepare().
4330fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Prepare() may perform additional checks on the parameter to make sure whether the
4340fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * specified number of audio channels are applicable.
4352bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang     *
4360fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * @param numChannels the number of audio channels. Usually it is either 1 (mono) or 2
4370fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * (stereo).
4382bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang     */
4390fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    public void setAudioChannels(int numChannels) {
4400fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        if (numChannels <= 0) {
4410fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            throw new IllegalArgumentException("Number of channels is not positive");
4420fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        }
4432450830c0c41a45d333838f4dcf3ba1e4a2409a2Henrik Backlund        setParameter("audio-param-number-of-channels=" + numChannels);
4440fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    }
4450fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong
4460fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    /**
4470fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Sets the audio encoding bit rate for recording. Call this method before prepare().
4480fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Prepare() may perform additional checks on the parameter to make sure whether the
4490fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * specified bit rate is applicable, and sometimes the passed bitRate will be clipped
4500fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * internally to ensure the audio recording can proceed smoothly based on the
4510fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * capabilities of the platform.
4520fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     *
4530fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * @param bitRate the audio encoding bit rate in bits per second.
4540fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     */
4550fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    public void setAudioEncodingBitRate(int bitRate) {
4560fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        if (bitRate <= 0) {
4570fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            throw new IllegalArgumentException("Audio encoding bit rate is not positive");
4580fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        }
4592450830c0c41a45d333838f4dcf3ba1e4a2409a2Henrik Backlund        setParameter("audio-param-encoding-bitrate=" + bitRate);
4600fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    }
4610fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong
4620fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    /**
4630fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Sets the video encoding bit rate for recording. Call this method before prepare().
4640fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * Prepare() may perform additional checks on the parameter to make sure whether the
4650fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * specified bit rate is applicable, and sometimes the passed bitRate will be
4660fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * clipped internally to ensure the video recording can proceed smoothly based on
4670fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * the capabilities of the platform.
4680fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     *
4690fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     * @param bitRate the video encoding bit rate in bits per second.
4700fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong     */
4710fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    public void setVideoEncodingBitRate(int bitRate) {
4720fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        if (bitRate <= 0) {
4730fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong            throw new IllegalArgumentException("Video encoding bit rate is not positive");
4740fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong        }
4752450830c0c41a45d333838f4dcf3ba1e4a2409a2Henrik Backlund        setParameter("video-param-encoding-bitrate=" + bitRate);
4760fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    }
4772bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang
4782bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang    /**
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass in the file descriptor of the file to be written. Call this after
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() but before prepare().
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd an open file descriptor to be written into.
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called before
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() or after prepare()
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOutputFile(FileDescriptor fd) throws IllegalStateException
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPath = null;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFd = fd;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the path of the output file to be produced. Call this after
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() but before prepare().
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param path The pathname to use.
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called before
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFormat() or after prepare()
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOutputFile(String path) throws IllegalStateException
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFd = null;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPath = path;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // native implementation
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _setOutputFile(FileDescriptor fd, long offset, long length)
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws IllegalStateException, IOException;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _prepare() throws IllegalStateException, IOException;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prepares the recorder to begin capturing and encoding data. This method
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be called after setting up the desired audio and video sources,
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * encoders, file format, etc., but before start().
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called after
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * start() or before setOutputFormat().
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IOException if prepare fails otherwise.
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void prepare() throws IllegalStateException, IOException
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPath != null) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(mPath);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                _setOutputFile(fos.getFD(), 0, 0);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fos.close();
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mFd != null) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _setOutputFile(mFd, 0, 0);
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IOException("No valid output file");
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _prepare();
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Begins capturing and encoding data to the file specified with
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setOutputFile(). Call this after prepare().
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called before
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prepare().
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void start() throws IllegalStateException;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops recording. Call this after start(). Once recording is stopped,
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you will have to configure it again as if it has just been constructed.
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called before start()
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void stop() throws IllegalStateException;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restarts the MediaRecorder to its idle state. After calling
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method, you will have to configure it again as if it had just been
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * constructed.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reset() {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_reset();
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // make sure none of the listeners get called anymore
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventHandler.removeCallbacksAndMessages(null);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void native_reset();
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the maximum absolute amplitude that was sampled since the last
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call to this method. Call this only after the setAudioSource().
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the maximum absolute amplitude measured since the last call, or
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 0 when called for the first time
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if it is called before
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the audio source has been set.
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getMaxAmplitude() throws IllegalStateException;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Do not change this value without updating its counterpart
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in include/media/mediarecorder.h!
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Unspecified media recorder error.
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.media.MediaRecorder.OnErrorListener
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MEDIA_RECORDER_ERROR_UNKNOWN = 1;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when an error
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * occurs while recording.
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnErrorListener
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when an error occurs while recording.
5952bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang         *
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mr the MediaRecorder that encountered the error
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param what    the type of error that has occurred:
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <ul>
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li>{@link #MEDIA_RECORDER_ERROR_UNKNOWN}
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * </ul>
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param extra   an extra code, specific to the error type
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onError(MediaRecorder mr, int what, int extra);
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when an error occurs while
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * recording.
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l the callback that will be run
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnErrorListener(OnErrorListener l)
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnErrorListener = l;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
617ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /* Do not change these values without updating their counterparts
618ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * in include/media/mediarecorder.h!
619ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
620ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /** Unspecified media recorder error.
621ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @see android.media.MediaRecorder.OnInfoListener
622ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
623ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public static final int MEDIA_RECORDER_INFO_UNKNOWN              = 1;
624ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /** A maximum duration had been setup and has now been reached.
625ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @see android.media.MediaRecorder.OnInfoListener
626ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
627ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public static final int MEDIA_RECORDER_INFO_MAX_DURATION_REACHED = 800;
628105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /** A maximum filesize had been setup and has now been reached.
629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @see android.media.MediaRecorder.OnInfoListener
630105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
631105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED = 801;
632ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
633ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
634ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Interface definition for a callback to be invoked when an error
635ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * occurs while recording.
636ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
637ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public interface OnInfoListener
638ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    {
639ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        /**
640ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         * Called when an error occurs while recording.
6412bcda90c0234f67f210a96f195b355493ca7d1ffJianhong Jiang         *
642ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         * @param mr the MediaRecorder that encountered the error
643ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         * @param what    the type of error that has occurred:
644ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         * <ul>
645ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         * <li>{@link #MEDIA_RECORDER_INFO_UNKNOWN}
646105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project         * <li>{@link #MEDIA_RECORDER_INFO_MAX_DURATION_REACHED}
647105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project         * <li>{@link #MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED}
648ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         * </ul>
649ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         * @param extra   an extra code, specific to the error type
650ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project         */
651ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        void onInfo(MediaRecorder mr, int what, int extra);
652ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
653ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
654ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
655ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Register a callback to be invoked when an informational event occurs while
656ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * recording.
657ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
658ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param listener the callback that will be run
659ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
660ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void setOnInfoListener(OnInfoListener listener)
661ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    {
662ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mOnInfoListener = listener;
663ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
664ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class EventHandler extends Handler
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private MediaRecorder mMediaRecorder;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public EventHandler(MediaRecorder mr, Looper looper) {
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(looper);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMediaRecorder = mr;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
674ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        /* Do not change these values without updating their counterparts
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in include/media/mediarecorder.h!
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final int MEDIA_RECORDER_EVENT_ERROR = 1;
678ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        private static final int MEDIA_RECORDER_EVENT_INFO  = 2;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mMediaRecorder.mNativeContext == 0) {
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "mediarecorder went away with unhandled events");
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch(msg.what) {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MEDIA_RECORDER_EVENT_ERROR:
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mOnErrorListener != null)
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOnErrorListener.onError(mMediaRecorder, msg.arg1, msg.arg2);
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
693ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            case MEDIA_RECORDER_EVENT_INFO:
694ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (mOnInfoListener != null)
695ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mOnInfoListener.onInfo(mMediaRecorder, msg.arg1, msg.arg2);
696ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
697ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return;
698ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Unknown message type " + msg.what);
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called from native code when an interesting event happens.  This method
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * just uses the EventHandler system to post the event back to the main app thread.
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a weak reference to the original MediaRecorder object so that the native
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code is safe from the object disappearing from underneath it.  (This is
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the cookie passed to native_setup().)
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void postEventFromNative(Object mediarecorder_ref,
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            int what, int arg1, int arg2, Object obj)
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaRecorder mr = (MediaRecorder)((WeakReference)mediarecorder_ref).get();
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mr == null) {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mr.mEventHandler != null) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mr.mEventHandler.obtainMessage(what, arg1, arg2, obj);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mr.mEventHandler.sendMessage(m);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Releases resources associated with this MediaRecorder object.
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is good practice to call this method when you're done
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using the MediaRecorder.
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void release();
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7344935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    private static native final void native_init();
7354935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void native_setup(Object mediarecorder_this) throws IllegalStateException;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void native_finalize();
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7400fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong    private native void setParameter(String nameValuePair);
7410fc6bc4cac6391f048f0f2748b3e979effe0924bJames Dong
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() { native_finalize(); }
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
745