録音アプリ作成
音声を記録するには
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();
}
を追加する
これで実行すればできあがり
録音している画面は変化しないので
なにかエフェクトをつけるとおもしろいかもしれない
