録音アプリ作成
音声を記録するには
android.media.MeiaRecorder クラスの
setAudioSource() を使う
MediaRecorder は録画にも使うけど
ソースとして音声のみを指定すれば録音に使える
ソース
記録フォーマット
コーデック
に指定する定数は
MediaRecorder.AudioSource
MediaRecorder.OutputFormat
MediaRecorder.AudioEncoder
となる
なお、録音を使うには
権限として
RECORD_AUDIO
と
WRITE_EXTERNAL_STORAGE
が必要になる
まずは実践
新しくプロジェクトを
RecordAudio で作成
対象は Android 4.0.3
プロジェクトができたら
新しくレイアウトファイルをつくるので
file > new > other > Android XML Layout File
で
record.xml
を作成
RootElement には
LinearLayout を選択
これで作成されるので
次にテキストで録音中と表示し
停止するボタンも設置する
1 2 3 4 5 6 7 8 9 | < TextView android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "録音中" /> < Button android:id = "@+id/stop" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "録音停止" /> |
を追加する
次に
AndroidManifest.xml へ権限を追加する
1 2 | < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" /> < uses-permission android:name = "android.permission.RECORD_AUDIO" /> |
を追記する
ここまでできたら
MainActivity で処理を書く
Android アプリでは基本的に
HTMLのような画面をXMLで作成
Javascript の処理のようなものを
java で書く
まず
1 | extends ActionBarActivity |
を
1 | extends Activity |
にして
Ctrl + shift + o で import を補完
使用する画面を変更したので
1 | setContentView(R.layout.record); |
にする
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 | if (savedInstanceState == null ) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true ; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true ; } return super .onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false ); return rootView; } } |
はいらないので削除
そして使うものを宣言しておく
1 2 | private Button executeBtn; private MediaRecorder mRecorder; |
ここからの処理は onCreate() の中へ書く
まず MediaRecorder インスタンス作成
1 | mRecorder = new MediaRecorder(); |
次に入力ソースをマイクに設定する
1 | mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); |
そして記録するときのフォーマットを3GPP にするので
1 | mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); |
次に音声コーデックをAMR-N8 にする
1 | mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); |
次に出力ファイルのパスを設定する
このときにSDカードに書き込むので権限がほしい
1 | mRecorder.setOutputFile( "/sdcard/audio.3gp" ); |
今回はテストだけど
実際にこれをやると以前のものが上書きされるので注意
次にレコーダを準備
例外対策のため
try catch で書く
1 2 3 4 5 6 7 8 9 | try { //レコーダを準備 mRecorder.prepare(); } catch (IllegalStateException e){ e.printStackTrace(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } |
次に録音開始
1 | mRecorder.start(); |
次に、終了ボタンをタップしたときの処理を追加
1 | this .executeBtn =(Button)findViewById(R.id.stop); |
これでボタンを判別
挙動は
setOnClickListener で設定する
途中でエラーがでるので
マウスオーバーして指示にしたがい補完する
もしくは
Ctrl + shift + o で候補を出して補完する
最初に
1 | import android.view.View.OnClickListener; |
を書いてもいいけど
なれない内は補完したほうがいい
挙動は例外対策を考えて
try catch で書いていく
ソースは
1 2 3 4 5 6 7 8 | try { //録音停止 mRecorder.stop(); //再使用に備えレコーダ状態のリセット } catch (IllegalStateException e) { // TODO: handle exception e.printStackTrace(); } |
あと、メモリ管理みたいに使ったら開放をわすれずに行うので
1 2 3 4 5 6 7 8 | @Override protected void onDestroy() { // TODO Auto-generated method stub super .onDestroy(); //使わなくなったらレコードリソースを開放 mRecorder.release(); } |
を追加する
これで実行すればできあがり
録音している画面は変化しないので
なにかエフェクトをつけるとおもしろいかもしれない