
###前提・実現したいこと
AndroidstudioでAudiorecordを使用して録音をしようとすると毎回同じエラーが表示されてします。1つのサンプルではなく多くのAudioRecordを使用したソースコードやGithubからダウンロードしたものでも実機のログを確認すると同じエラーが表示されます。
参考にしているアプリでは作動しているのに私が同じことするとエラーが出るということは私のPCのAndroidStudioがおかしいのでしょうか。
同じ現象になったことがある方や解決法がわかる方、原因を推測できる方などがいましたらエラーを無くす協力をお願いいたします。
アプリ自体は立ち上がるのですが録音を開始する動作をするとアプリが落ちてしまいます。
毎回録音を開始するソースコード
audioRec.startRecording();
に問題があると表示されます。
###録音を開始するとログに表示されるエラーメッセージ
0-22 02:43:03.501 10965-10965/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.test.testfft004, PID: 10965 java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord. at android.media.AudioRecord.startRecording(AudioRecord.java:989) at com.test.testfft004.MainActivity.onClick(MainActivity.java:57) at android.view.View.performClick(View.java:5646) at android.view.View$PerformClick.run(View.java:22459) at android.os.Handler.handleCallback(Handler.java:761) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:156) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831) 10-22 02:43:03.522 10965-10965/? I/Process: Sending signal. PID: 10965 SIG: 9
###該当のソースコードの一例
import android.app.Activity; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import org.jtransforms.fft.DoubleFFT_1D; public class MainActivity extends Activity implements View.OnClickListener { /** Called when the activity is first created. */ final static int SAMPLING_RATE = 44100; AudioRecord audioRec = null; Button btn = null; boolean bIsRecording = false; int bufSize; final static int FFT_SIZE = 512; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button)findViewById(R.id.button_id); btn.setOnClickListener(this); // バッファサイズの計算 bufSize = AudioRecord.getMinBufferSize( SAMPLING_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); if (FFT_SIZE > bufSize) { bufSize = FFT_SIZE; } // AudioRecordの作成 audioRec = new AudioRecord( MediaRecorder.AudioSource.MIC, SAMPLING_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufSize); } @Override public void onClick(View v) { // TODO Auto-generated method stub if (v == btn) { if (bIsRecording) { bIsRecording = false; } else { // 録音開始 Log.v("AudioRecord", "startRecording"); audioRec.startRecording(); bIsRecording = true; // 録音スレッド new Thread(new Runnable() { @Override public void run() { byte buf[] = new byte[bufSize]; // TODO Auto-generated method stub // 録音データ読み込み audioRec.read(buf, 0, buf.length); // 録音停止 //audioRec.stop(); //高速フーリエ変換 DoubleFFT_1D fft = new DoubleFFT_1D(FFT_SIZE); double[] FFTdata = new double[FFT_SIZE]; for (int i = 0; i < FFT_SIZE; i++) { FFTdata[i] = (double) buf[i]; } fft.realForward(FFTdata); double[] dbfs = new double[FFT_SIZE / 2]; double max_db = 0; int max_i = 0; for (int i = 0; i < FFT_SIZE / 2; i += 2) { dbfs[i / 2] = (int) (Math.sqrt(Math.pow(FFTdata[i], 2) + Math.pow(FFTdata[i + 1], 2))); if (max_db < dbfs[i / 2]) { max_db = dbfs[i / 2]; max_i = i / 2; } } //Log.d("db", "Hz" + (SAMPLING_RATE/ (double) FFT_SIZE)*max_i*2 + "maxdb" + max_db); } }).start(); } } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); audioRec.release(); } }
###試したこと
多くのサンプルコードを試したがaudioRec.startRecording();で落ちてしまう
Mediarecordでは録音はうまくいった
###補足情報(言語/FW/ツール等のバージョンなど)
androidstudio2.3.3
回答2件
あなたの回答
tips
プレビュー