録音アプリ作成
音声を記録するには
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 を選択
これで作成されるので
次にテキストで録音中と表示し
停止するボタンも設置する
<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 へ権限を追加する
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
を追記する
ここまでできたら
MainActivity で処理を書く
Android アプリでは基本的に
HTMLのような画面をXMLで作成
Javascript の処理のようなものを
java で書く
まず
extends ActionBarActivity
を
extends Activity
にして
Ctrl + shift + o で import を補完
使用する画面を変更したので
setContentView(R.layout.record);
にする
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; } }
はいらないので削除
そして使うものを宣言しておく
private Button executeBtn; private MediaRecorder mRecorder;
ここからの処理は onCreate() の中へ書く
まず MediaRecorder インスタンス作成
mRecorder = new MediaRecorder();
次に入力ソースをマイクに設定する
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
そして記録するときのフォーマットを3GPP にするので
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
次に音声コーデックをAMR-N8 にする
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
次に出力ファイルのパスを設定する
このときにSDカードに書き込むので権限がほしい
mRecorder.setOutputFile("/sdcard/audio.3gp");
今回はテストだけど
実際にこれをやると以前のものが上書きされるので注意
次にレコーダを準備
例外対策のため
try catch で書く
try { //レコーダを準備 mRecorder.prepare(); }catch(IllegalStateException e){ e.printStackTrace(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); }
次に録音開始
mRecorder.start();
次に、終了ボタンをタップしたときの処理を追加
this.executeBtn =(Button)findViewById(R.id.stop);
これでボタンを判別
挙動は
setOnClickListener で設定する
途中でエラーがでるので
マウスオーバーして指示にしたがい補完する
もしくは
Ctrl + shift + o で候補を出して補完する
最初に
import android.view.View.OnClickListener;
を書いてもいいけど
なれない内は補完したほうがいい
挙動は例外対策を考えて
try catch で書いていく
ソースは
try { //録音停止 mRecorder.stop(); //再使用に備えレコーダ状態のリセット } catch (IllegalStateException e) { // TODO: handle exception e.printStackTrace(); }
あと、メモリ管理みたいに使ったら開放をわすれずに行うので
@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //使わなくなったらレコードリソースを開放 mRecorder.release(); }
を追加する
これで実行すればできあがり
録音している画面は変化しないので
なにかエフェクトをつけるとおもしろいかもしれない