録音アプリ作成

録音アプリ作成

今回できたのは
audio

音声を記録するには
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();
}

を追加する

これで実行すればできあがり

録音している画面は変化しないので
なにかエフェクトをつけるとおもしろいかもしれない

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です