7.2.6 MediaRecorderの例

21025 ワード

以下に、MediaRecorderクラスを使用したカスタムオーディオキャプチャと再生例の完全なコードを示します.
 1 package com.nthm.androidtestActivity;

 2 

 3 import java.io.File;

 4 import java.io.IOException;

 5 import com.nthm.androidtest.R;

 6 import android.app.Activity;

 7 import android.media.MediaPlayer;

 8 import android.media.MediaPlayer.OnCompletionListener;

 9 import android.media.MediaRecorder;

10 import android.os.Bundle;

11 import android.os.Environment;

12 import android.view.View;

13 import android.view.View.OnClickListener;

14 import android.widget.Button;

15 import android.widget.TextView;

CustomRecorderアクティビティはOnClickListenerを実現し、ユーザーがボタンを押したときに通知を得ることができる.同時にOnCompletionListenerを実現し、MediaPlayerがオーディオの再生を完了したときに応答することができる.
1 public class CustomRecorder extends Activity implements OnClickListener,

2         OnCompletionListener {

このアクティビティには、一連のユーザーインタフェースコンポーネントがあります.まずstatusTextViewというTextViewで、アプリケーションの状態を「Recording(録画中)」、「Ready to Play(再生準備中)」などに報告します.
1     private TextView statusTextView;

一連のボタンは、様々な態様を制御するために使用され、これらのボタンの名前は、それらの用途を記述する.
1     private Button startRecording;

2     private Button stopRecording;

3     private Button playRecording;

4     private Button finishButton;

また、オーディオを録画するためのMediaRecorderと、オーディオを再生するためのMediaPlayerもあります.
1     private MediaRecorder recorder;

2     private MediaPlayer player;

最後に、audioFileのFileオブジェクトがあり、そこに記録されたファイルを参照します.
1     private File audioFile;

2     @Override

3     protected void onCreate(Bundle savedInstanceState) {

4         super.onCreate(savedInstanceState);

5         setContentView(R.layout.customrecorder);

アクティビティを開始すると、statusTextViewが「Ready」(準備完了)に設定されます.
1         statusTextView=(TextView) findViewById(R.id.StatusTextView);

2         statusTextView.setText("Ready");

3         

4         stopRecording=(Button) findViewById(R.id.StopRecording);

5         startRecording=(Button) findViewById(R.id.StartRecording);

6         playRecording=(Button) findViewById(R.id.PlayRecording);

7         finishButton=(Button) findViewById(R.id.FinishButton);

すべてのボタンのOnClickListenerをthisに設定し、いずれかをクリックするとonClickメソッドが呼び出されます.
1         stopRecording.setOnClickListener(this);

2         startRecording.setOnClickListener(this);

3         playRecording.setOnClickListener(this);

4         finishButton.setOnClickListener(this);

最後に、stopRecordingボタンとplayRecordingボタンはonCreateメソッドで無効になります.録画が開始されるか完了するまで動作しないためです.
1         stopRecording.setEnabled(false);

2         playRecording.setEnabled(false);

3     }

以下のonClickメソッドでは、すべてのボタンを処理してイベントをクリックします.
1     @Override

2     public void onClick(View v) {

3         if(v==finishButton){

「finishButton」をクリックすると、アクティビティが終了します.
1             finish();

2         }else if(v==stopRecording){

stopRecordingボタンをクリックすると、録画を停止し、MediaRecorderオブジェクトを解放します.
1             recorder.stop();

2             recorder.release();

次にMediaPlayerオブジェクトを作成し、録画したオーディオファイルを再生する準備をします.
1             player=new MediaPlayer();

2             player.setOnCompletionListener(this);

MediaPlayerで使用する次の2つの方法setDataSourceとprepareは、さまざまな例外を放出する可能性があります.次のコードでは異常が投げ出されただけです.アプリケーション開発では、ファイルが存在しない場合にユーザーに警告するなど、これらの例外をより細かくキャプチャして処理することを望んでいる可能性があります.
 1             try {

 2                 player.setDataSource(audioFile.getAbsolutePath());

 3             } catch (IllegalArgumentException e) {

 4                 e.printStackTrace();

 5             } catch (SecurityException e) {

 6                 e.printStackTrace();

 7             } catch (IllegalStateException e) {

 8                 e.printStackTrace();

 9             } catch (IOException e) {

10                 e.printStackTrace();

11             }

12             try {

13                 player.prepare();

14             } catch (IllegalStateException e) {

15                 e.printStackTrace();

16             } catch (IOException e) {

17                 e.printStackTrace();

18             }

statusTextViewを設定して、オーディオファイルを再生する準備ができていることをユーザーに通知します.
1             statusTextView.setText("Ready to Play");

次にplayRecordingボタンとstartRecordingボタンを有効にし、stopRecordingボタンを無効にします.オーディオが録画されていないためです.
1             playRecording.setEnabled(true);

2             stopRecording.setEnabled(false);

3             startRecording.setEnabled(true);

4         }else if(v==startRecording){

startRecordingボタンを押すと、新しいMediaRecorderが作成され、setAudioSource、setOutputFormat、setAudioEncoderメソッドが呼び出されます.
1             recorder=new MediaRecorder();

2             recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

3             recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

4             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

その後、SDカードに新しいFileオブジェクトを作成し、MediaRecorderオブジェクトのsetOutputFileメソッドを呼び出します.
1             File path=new File(Environment.getExternalStorageDirectory()+"/ceshi");

2             path.mkdirs();

3             try {

4                 audioFile=File.createTempFile("recording", ".3gp", path);

5             } catch (IOException e) {

6                 e.printStackTrace();

7             }

8             recorder.setOutputFile(audioFile.getAbsolutePath());

MediaRecorderのprepareメソッドを呼び出し、録画を開始します.
1             try {

2                 recorder.prepare();

3             } catch (IllegalStateException e) {

4                 e.printStackTrace();

5             } catch (IOException e) {

6                 e.printStackTrace();

7             }

8             recorder.start();

最後にstatusTextViewを更新し、どのボタンが有効または無効になるかを変更します.
1             statusTextView.setText("Recording");

2             

3             playRecording.setEnabled(false);

4             stopRecording.setEnabled(true);

5             startRecording.setEnabled(false);

6         }else if(v==playRecording){

最後に応答する必要があるのはplayRecordingです.stopRecordingボタンを押すと、MediaPlayerオブジェクトプレイヤーが構築され、構成されます.PlayRecordingをクリックすると、再生を開始し、ステータスメッセージを設定し、どのボタンが有効になるかを変更する必要があります.
1             player.start();

2             statusTextView.setText("Playing");

3             

4             playRecording.setEnabled(false);

5             stopRecording.setEnabled(false);

6             startRecording.setEnabled(false);

7         }

8     }

MediaPlayerオブジェクトが録音の再生を完了すると、onCompletionメソッドが呼び出されます.この方法を使用して、ステータスメッセージを変更し、どのボタンが有効になるかを設定します.
1     @Override

2     public void onCompletion(MediaPlayer mp) {

3         statusTextView.setText("Ready");

4         

5         playRecording.setEnabled(true);

6         stopRecording.setEnabled(false);

7         startRecording.setEnabled(true);

8     }

9 }

次に、上述のアクティビティのレイアウトXMLファイルcustomrecorderを示す.xml
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 2     android:layout_width="match_parent"

 3     android:layout_height="match_parent"

 4     android:orientation="vertical"

 5     >

 6  <TextView 

 7      android:id="@+id/StatusTextView"

 8      android:text="Status"

 9      android:layout_width="fill_parent"

10      android:layout_height="wrap_content"

11      android:textSize="35dip"></TextView>

12  <Button 

13      android:layout_width="wrap_content"

14      android:layout_height="wrap_content"

15      android:id="@+id/StartRecording"

16      android:text="Start Recording"/>

17  <Button 

18      android:layout_width="wrap_content"

19      android:layout_height="wrap_content"

20      android:id="@+id/StopRecording"

21      android:text="Stop Recording"/>

22  <Button 

23      android:layout_width="wrap_content"

24      android:layout_height="wrap_content"

25      android:id="@+id/PlayRecording"

26      android:text="Play Recording"/>

27  <Button 

28      android:layout_width="wrap_content"

29      android:layout_height="wrap_content"

30      android:id="@+id/FinishButton"

31      android:text="Finish"/>

32 </LinearLayout>

また、以下の権限をAndroidManifestに追加する必要がある.xmlファイル.
1     <uses-permission android:name="android.permission.RECORD_AUDIO"/>

2     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

私たちが見たように、MediaRecorderを使用してカスタムオーディオキャプチャプログラムを開発するのはあまり面倒ではありません.次に、MediaRecorderの他の方法を使用して他の機能を追加する方法を確認します.