Skip to content

Commit 99b70f3

Browse files
committed
DO NOT MERGE
cherrypick from master Change-Id: I63bc055991405c56e9dcc83a54b106b870cf6b29 Change-Id: Ia5150288ce6fe57460159dd7555c6786023b1d9e
1 parent 8c7951a commit 99b70f3

File tree

7 files changed

+2185
-952
lines changed

7 files changed

+2185
-952
lines changed

docs/html/guide/appendix/media-formats.jd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ page.title=Android Supported Media Formats
1414

1515
<h2>See also</h2>
1616
<ol>
17-
<li><a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a></li>
17+
<li><a href="{@docRoot}guide/topics/media/index.html">Multimedia and Camera</a></li>
1818
</ol>
1919

2020
<h2>Key classes</h2>

docs/html/guide/guide_toc.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,26 @@ localized titles are added in the language order specified below.
268268
</ul>
269269
</li>
270270

271-
<li><a href="<?cs var:toroot ?>guide/topics/media/index.html">
272-
<span class="en">Media</span>
273-
</a></li>
271+
<li class="toggle-list">
272+
<div><a href="<?cs var:toroot ?>guide/topics/media/index.html">
273+
<span class="en">Multimedia and Camera</span>
274+
</a><span class="new">updated</span></div>
275+
<ul>
276+
<li><a href="<?cs var:toroot ?>guide/topics/media/mediaplayer.html">
277+
<span class="en">Media Playback</span></a>
278+
</li>
279+
<li><a href="<?cs var:toroot ?>guide/topics/media/jetplayer.html">
280+
<span class="en">JetPlayer</span></a>
281+
</li>
282+
<li><a href="<?cs var:toroot ?>guide/topics/media/camera.html">
283+
<span class="en">Camera</span></a>
284+
<span class="new">new!</span>
285+
</li>
286+
<li><a href="<?cs var:toroot ?>guide/topics/media/audio-capture.html">
287+
<span class="en">Audio Capture</span></a>
288+
</li>
289+
</ul>
290+
</li>
274291
<li>
275292
<a href="<?cs var:toroot ?>guide/topics/clipboard/copy-paste.html">
276293
<span class="en">Copy and Paste</span>
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
page.title=Audio Capture
2+
parent.title=Multimedia and Camera
3+
parent.link=index.html
4+
@jd:body
5+
6+
<div id="qv-wrapper">
7+
<div id="qv">
8+
9+
<h2>In this document</h2>
10+
<ol>
11+
<li><a href="#audiocapture">Performing Audio Capture</a>
12+
<ol>
13+
<li><a href='#example'>Code Example</a></li>
14+
</ol>
15+
</li>
16+
</ol>
17+
18+
<h2>Key classes</h2>
19+
<ol>
20+
<li>{@link android.media.MediaRecorder}</li>
21+
</ol>
22+
23+
<h2>See also</h2>
24+
<ol>
25+
<li><a href="{@docRoot}guide/appendix/media-formats.html">Android Supported Media Formats</a></li>
26+
<li><a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a></li>
27+
<li><a href="{@docRoot}guide/topics/media/mediaplayer.html">MediaPlayer</a>
28+
</ol>
29+
30+
</div>
31+
</div>
32+
33+
<p>The Android multimedia framework includes support for capturing and encoding a variety of common
34+
audio formats, so that you can easily integrate audio into your applications. You can record audio
35+
using the {@link android.media.MediaRecorder} APIs if supported by the device hardware.</p>
36+
37+
<p>This document shows you how to write an application that captures audio from a device
38+
microphone, save the audio and play it back.</p>
39+
40+
<p class="note"><strong>Note:</strong> The Android Emulator does not have the ability to capture
41+
audio, but actual devices are likely to provide these capabilities.</p>
42+
43+
<h2 id="audiocapture">Performing Audio Capture</h2>
44+
45+
<p>Audio capture from the device is a bit more complicated than audio and video playback, but still
46+
fairly simple:</p>
47+
<ol>
48+
<li>Create a new instance of {@link android.media.MediaRecorder android.media.MediaRecorder}.</li>
49+
<li>Set the audio source using
50+
{@link android.media.MediaRecorder#setAudioSource MediaRecorder.setAudioSource()}. You will
51+
probably want to use
52+
<code>MediaRecorder.AudioSource.MIC</code>.</li>
53+
<li>Set output file format using
54+
{@link android.media.MediaRecorder#setOutputFormat MediaRecorder.setOutputFormat()}.
55+
</li>
56+
<li>Set output file name using
57+
{@link android.media.MediaRecorder#setOutputFile MediaRecorder.setOutputFile()}.
58+
</li>
59+
<li>Set the audio encoder using
60+
{@link android.media.MediaRecorder#setAudioEncoder MediaRecorder.setAudioEncoder()}.
61+
</li>
62+
<li>Call {@link android.media.MediaRecorder#prepare MediaRecorder.prepare()}
63+
on the MediaRecorder instance.</li>
64+
<li>To start audio capture, call
65+
{@link android.media.MediaRecorder#start MediaRecorder.start()}. </li>
66+
<li>To stop audio capture, call {@link android.media.MediaRecorder#stop MediaRecorder.stop()}.
67+
<li>When you are done with the MediaRecorder instance, call
68+
{@link android.media.MediaRecorder#release MediaRecorder.release()} on it. Calling
69+
{@link android.media.MediaRecorder#release MediaRecorder.release()} is always recommended to
70+
free the resource immediately.</li>
71+
</ol>
72+
73+
<h3 id="example">Example: Record audio and play the recorded audio</h3>
74+
<p>The example class below illustrates how to set up, start and stop audio capture, and to play the
75+
recorded audio file.</p>
76+
<pre>
77+
/*
78+
* The application needs to have the permission to write to external storage
79+
* if the output file is written to the external storage, and also the
80+
* permission to record audio. These permissions must be set in the
81+
* application's AndroidManifest.xml file, with something like:
82+
*
83+
* &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;
84+
* &lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;
85+
*
86+
*/
87+
package com.android.audiorecordtest;
88+
89+
import android.app.Activity;
90+
import android.widget.LinearLayout;
91+
import android.os.Bundle;
92+
import android.os.Environment;
93+
import android.view.ViewGroup;
94+
import android.widget.Button;
95+
import android.view.View;
96+
import android.view.View.OnClickListener;
97+
import android.content.Context;
98+
import android.util.Log;
99+
import android.media.MediaRecorder;
100+
import android.media.MediaPlayer;
101+
102+
import java.io.IOException;
103+
104+
105+
public class AudioRecordTest extends Activity
106+
{
107+
private static final String LOG_TAG = "AudioRecordTest";
108+
private static String mFileName = null;
109+
110+
private RecordButton mRecordButton = null;
111+
private MediaRecorder mRecorder = null;
112+
113+
private PlayButton mPlayButton = null;
114+
private MediaPlayer mPlayer = null;
115+
116+
private void onRecord(boolean start) {
117+
if (start) {
118+
startRecording();
119+
} else {
120+
stopRecording();
121+
}
122+
}
123+
124+
private void onPlay(boolean start) {
125+
if (start) {
126+
startPlaying();
127+
} else {
128+
stopPlaying();
129+
}
130+
}
131+
132+
private void startPlaying() {
133+
mPlayer = new MediaPlayer();
134+
try {
135+
mPlayer.setDataSource(mFileName);
136+
mPlayer.prepare();
137+
mPlayer.start();
138+
} catch (IOException e) {
139+
Log.e(LOG_TAG, "prepare() failed");
140+
}
141+
}
142+
143+
private void stopPlaying() {
144+
mPlayer.release();
145+
mPlayer = null;
146+
}
147+
148+
private void startRecording() {
149+
mRecorder = new MediaRecorder();
150+
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
151+
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
152+
mRecorder.setOutputFile(mFileName);
153+
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
154+
155+
try {
156+
mRecorder.prepare();
157+
} catch (IOException e) {
158+
Log.e(LOG_TAG, "prepare() failed");
159+
}
160+
161+
mRecorder.start();
162+
}
163+
164+
private void stopRecording() {
165+
mRecorder.stop();
166+
mRecorder.release();
167+
mRecorder = null;
168+
}
169+
170+
class RecordButton extends Button {
171+
boolean mStartRecording = true;
172+
173+
OnClickListener clicker = new OnClickListener() {
174+
public void onClick(View v) {
175+
onRecord(mStartRecording);
176+
if (mStartRecording) {
177+
setText("Stop recording");
178+
} else {
179+
setText("Start recording");
180+
}
181+
mStartRecording = !mStartRecording;
182+
}
183+
};
184+
185+
public RecordButton(Context ctx) {
186+
super(ctx);
187+
setText("Start recording");
188+
setOnClickListener(clicker);
189+
}
190+
}
191+
192+
class PlayButton extends Button {
193+
boolean mStartPlaying = true;
194+
195+
OnClickListener clicker = new OnClickListener() {
196+
public void onClick(View v) {
197+
onPlay(mStartPlaying);
198+
if (mStartPlaying) {
199+
setText("Stop playing");
200+
} else {
201+
setText("Start playing");
202+
}
203+
mStartPlaying = !mStartPlaying;
204+
}
205+
};
206+
207+
public PlayButton(Context ctx) {
208+
super(ctx);
209+
setText("Start playing");
210+
setOnClickListener(clicker);
211+
}
212+
}
213+
214+
public AudioRecordTest() {
215+
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
216+
mFileName += "/audiorecordtest.3gp";
217+
}
218+
219+
&#64;Override
220+
public void onCreate(Bundle icicle) {
221+
super.onCreate(icicle);
222+
223+
LinearLayout ll = new LinearLayout(this);
224+
mRecordButton = new RecordButton(this);
225+
ll.addView(mRecordButton,
226+
new LinearLayout.LayoutParams(
227+
ViewGroup.LayoutParams.WRAP_CONTENT,
228+
ViewGroup.LayoutParams.WRAP_CONTENT,
229+
0));
230+
mPlayButton = new PlayButton(this);
231+
ll.addView(mPlayButton,
232+
new LinearLayout.LayoutParams(
233+
ViewGroup.LayoutParams.WRAP_CONTENT,
234+
ViewGroup.LayoutParams.WRAP_CONTENT,
235+
0));
236+
setContentView(ll);
237+
}
238+
239+
&#64;Override
240+
public void onPause() {
241+
super.onPause();
242+
if (mRecorder != null) {
243+
mRecorder.release();
244+
mRecorder = null;
245+
}
246+
247+
if (mPlayer != null) {
248+
mPlayer.release();
249+
mPlayer = null;
250+
}
251+
}
252+
}
253+
</pre>

0 commit comments

Comments
 (0)