summaryrefslogtreecommitdiffstats
path: root/docs/html/guide/topics/media/audio-capture.jd
blob: 75d294b570921bf7668150ba40946c56923f4b43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
page.title=Audio Capture
parent.title=Multimedia and Camera 
parent.link=index.html
@jd:body

    <div id="qv-wrapper">
    <div id="qv">

<h2>In this document</h2>
<ol>
<li><a href="#audiocapture">Performing Audio Capture</a>
   <ol>
      <li><a href='#example'>Code Example</a></li>
   </ol>
</li>
</ol>

<h2>Key classes</h2>
<ol>
<li>{@link android.media.MediaRecorder}</li>
</ol>

<h2>See also</h2>
<ol>
  <li><a href="{@docRoot}guide/appendix/media-formats.html">Android Supported Media Formats</a></li>
  <li><a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a></li>
  <li><a href="{@docRoot}guide/topics/media/mediaplayer.html">MediaPlayer</a>
</ol>

</div>
</div>

<p>The Android multimedia framework includes support for capturing and encoding a variety of common
audio formats, so that you can easily integrate audio into your applications. You can record audio
using the {@link android.media.MediaRecorder} APIs if supported by the device hardware.</p>

<p>This document shows you how to write an application that captures audio from a device
microphone, save the audio and play it back.</p>

<p class="note"><strong>Note:</strong> The Android Emulator does not have the ability to capture
audio, but actual devices are likely to provide these capabilities.</p>

<h2 id="audiocapture">Performing Audio Capture</h2>

<p>Audio capture from the device is a bit more complicated than audio and video playback, but still
fairly simple:</p>
<ol>
  <li>Create a new instance of {@link android.media.MediaRecorder android.media.MediaRecorder}.</li>
  <li>Set the audio source using
        {@link android.media.MediaRecorder#setAudioSource MediaRecorder.setAudioSource()}. You will
probably want to use
  <code>MediaRecorder.AudioSource.MIC</code>.</li>
  <li>Set output file format using
        {@link android.media.MediaRecorder#setOutputFormat MediaRecorder.setOutputFormat()}.
  </li>
  <li>Set output file name using
        {@link android.media.MediaRecorder#setOutputFile MediaRecorder.setOutputFile()}.
  </li>
  <li>Set the audio encoder using
        {@link android.media.MediaRecorder#setAudioEncoder MediaRecorder.setAudioEncoder()}.
  </li>
  <li>Call {@link android.media.MediaRecorder#prepare MediaRecorder.prepare()}
   on the MediaRecorder instance.</li>
  <li>To start audio capture, call
  {@link android.media.MediaRecorder#start MediaRecorder.start()}. </li>
  <li>To stop audio capture, call {@link android.media.MediaRecorder#stop MediaRecorder.stop()}.
  <li>When you are done with the MediaRecorder instance, call
{@link android.media.MediaRecorder#release MediaRecorder.release()} on it. Calling
{@link android.media.MediaRecorder#release MediaRecorder.release()} is always recommended to
free the resource immediately.</li>
</ol>

<h3 id="example">Example: Record audio and play the recorded audio</h3>
<p>The example class below illustrates how to set up, start and stop audio capture, and to play the
recorded audio file.</p>
<pre>
/*
 * The application needs to have the permission to write to external storage
 * if the output file is written to the external storage, and also the
 * permission to record audio. These permissions must be set in the
 * application's AndroidManifest.xml file, with something like:
 *
 * &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;
 * &lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;
 *
 */
package com.android.audiorecordtest;

import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;

import java.io.IOException;


public class AudioRecordTest extends Activity
{
    private static final String LOG_TAG = "AudioRecordTest";
    private static String mFileName = null;

    private RecordButton mRecordButton = null;
    private MediaRecorder mRecorder = null;

    private PlayButton   mPlayButton = null;
    private MediaPlayer   mPlayer = null;

    private void onRecord(boolean start) {
        if (start) {
            startRecording();
        } else {
            stopRecording();
        }
    }

    private void onPlay(boolean start) {
        if (start) {
            startPlaying();
        } else {
            stopPlaying();
        }
    }

    private void startPlaying() {
        mPlayer = new MediaPlayer();
        try {
            mPlayer.setDataSource(mFileName);
            mPlayer.prepare();
            mPlayer.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }

    private void stopPlaying() {
        mPlayer.release();
        mPlayer = null;
    }

    private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }

    private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }

    class RecordButton extends Button {
        boolean mStartRecording = true;

        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onRecord(mStartRecording);
                if (mStartRecording) {
                    setText("Stop recording");
                } else {
                    setText("Start recording");
                }
                mStartRecording = !mStartRecording;
            }
        };

        public RecordButton(Context ctx) {
            super(ctx);
            setText("Start recording");
            setOnClickListener(clicker);
        }
    }

    class PlayButton extends Button {
        boolean mStartPlaying = true;

        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onPlay(mStartPlaying);
                if (mStartPlaying) {
                    setText("Stop playing");
                } else {
                    setText("Start playing");
                }
                mStartPlaying = !mStartPlaying;
            }
        };

        public PlayButton(Context ctx) {
            super(ctx);
            setText("Start playing");
            setOnClickListener(clicker);
        }
    }

    public AudioRecordTest() {
        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/audiorecordtest.3gp";
    }

    &#64;Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        LinearLayout ll = new LinearLayout(this);
        mRecordButton = new RecordButton(this);
        ll.addView(mRecordButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        mPlayButton = new PlayButton(this);
        ll.addView(mPlayButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        setContentView(ll);
    }

    &#64;Override
    public void onPause() {
        super.onPause();
        if (mRecorder != null) {
            mRecorder.release();
            mRecorder = null;
        }

        if (mPlayer != null) {
            mPlayer.release();
            mPlayer = null;
        }
    }
}
</pre>