2016-06-29 3 views
3

今日は他のスレッドを何時間もチェックして試してみましたが、何も解決しません。Android AudioRecordの初期化に失敗しました(他の解決策は動作しません)

私はすべてのavaibleオーディオオプションを介してフィルタリングを試みました。私は、アプリケーションに適切な権限を与えている。

目的:この音声ストリームを取得しようとしているため、音声の周波数を取得できます。これは、次のエラー(http://pastebin.com/raw/3wmA4cku)スロー

int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioEncoding); 
    AudioRecord audioeeeeRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioEncoding, bufferSize); // The RAW PCM sample recording 
    audioRecord = audioeeeeRecord; 
    if (audioRecord != null && audioRecord.getState() != AudioRecord.STATE_INITIALIZED) 
     try { 
      throw new Exception("AudioRecord init failed");     //audioRecord = findAudioRecord(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    final short[] buffer = new short[blockSize]; 

    try { 

     audioRecord.startRecording(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

マイもの

public int audioSource = MediaRecorder.AudioSource.MIC; 
public int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
public int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 
public AudioRecord audioRecord = null; 
private Thread recordingThread = null; 
public int blockSize = 256;        // deal with this many samples at a time 
public int sampleRate = 8000;        // Sample rate in Hz 

後に...:

AudioRecord: AudioFlinger could not create record track, status: -1 
     E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -1. 
     E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object. 
     W/System.err: java.lang.Exception: AudioRecord init failed 
     W/System.err:  at app.mobile.mobileecg.MainActivity.startReading(MainActivity.java:102) 
     W/System.err:  at app.mobile.mobileecg.MainActivity$1.onClick(MainActivity.java:58) 
     W/System.err:  at android.view.View.performClick(View.java:5697) 
     W/System.err:  at android.view.View$PerformClick.run(View.java:22526) 
     W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
     W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
     W/System.err:  at android.os.Looper.loop(Looper.java:158) 
     W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:7229) 
     W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
     W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
     W/System.err: java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord. 
     W/System.err:  at android.media.AudioRecord.startRecording(AudioRecord.java:943) 
     W/System.err:  at app.mobile.mobileecg.MainActivity.startReading(MainActivity.java:114) 
     W/System.err:  at app.mobile.mobileecg.MainActivity$1.onClick(MainActivity.java:58) 
     W/System.err:  at android.view.View.performClick(View.java:5697) 
     W/System.err:  at android.view.View$PerformClick.run(View.java:22526) 
     W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
     W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
     W/System.err:  at android.os.Looper.loop(Looper.java:158) 
     W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:7229) 
     W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
     W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
+0

完全なソースコードを貼り付けることはできますか?別のスレッドでレコードループを実行しましたか?あなたのアンドロイド版は何ですか? – lucky1928

答えて

4

ステップ1)アプリケーションセクションの下RECORD_AUDIO許可を追加確保するために、あなたのマニフェストを確認してください。例えばお使いのデバイスがMまたはそれ以降、あなたは>あなたのAPP->権限を設定 - > APP-からPERMSSIONを付与する必要がある場合は

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.colibri.audioloopback"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

    <uses-permission android:name="android.permission.RECORD_AUDIO" /> 

</manifest> 

ステップ2)。

手順3)まだ動作しない場合は、下記のコードスニペットを参照してください。

public void audioRecordLoop() throws Exception { 
     Log.e(TAG,"start audioRecordLoop"); 
     int channelConfig = mChannels == 2? 
       AudioFormat.CHANNEL_IN_STEREO: 
       AudioFormat.CHANNEL_IN_MONO; 
     int bufferSize = AudioRecord.getMinBufferSize(
       mSampleRateHz, channelConfig, mAudioEncoding); 
     mAudioRecord = new AudioRecord(
       mAudioSource, mSampleRateHz, channelConfig, mAudioEncoding, bufferSize);// The RAW PCM sample recording 

     if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) { 
      Log.e(TAG,"AudioRecord init failed"); 
      return; 
     } 
     final short[] buffer = new short[mBlockSize]; 
     mAudioRecord.startRecording(); 
     int len = 0; 
     while (mbExit == false) { 
      len = mAudioRecord.read(buffer, 0, mBlockSize); 
      if (len < 0) { 
       Log.e(TAG,"read error " + len); 
       return; 
      } 
     } 
     mAudioRecord.stop(); 
     mAudioRecord.release(); 
    } 

これで動作します。

1

は、私はこの問題は、あなたが持っていたことかもしれないと思います以前の試みでオーディオリソースを結びつけて、コードを正しいものにしました。そして今はそれが正しく動作しません利用可能なオーディオリソースがありません。 this SO questionを参照してください。また、コンストラクタが初期化されていないAudioRecordを返すときに例外をスローしていますが、独自の例外をキャッチすると、無視されることがあるログ内の2番目の例外(...は初期化されていないAudioRecord ...で呼び出されます)最初の結果。

あなたのアクティビティにtry/finallyセクションやOnDestroyやOnPauseメソッドを配置して、使用しなくなったときにaudioRecordが解放されるようにする必要があります。

クリーンアップコードを用意したら、アプリを終了したり、携帯電話を再起動してオーディオリソースを解放する必要があります。

もちろん、マイクを持っている別のアプリを実行させておきましたが、私は疑いがあります。

+0

私は最終的にキャッチを実装しました。私は私の電話を再起動しました。 Iveはエミュレータを使って試しました。最初に、初期化されていないAudioRecordで呼び出された、初期化されていないAudioRecord.java.lang.IllegalStateException:startRecording()でjava.lang.IllegalStateException:startRecording()が呼び出されたというエラーが発生するたびに試してください。 ' – Chris

+0

@Chris厳しい問題を解決するためのエミュレータ、絶対にそうではありません。 – Josh

1

これは答えです。これはアンドロイドが持っているものではないことはばかげている。

https://stackoverflow.com/a/33769527/6530367 I know this is a very old question but in Android Marshmallow you have to go on "Settings > Apps > Your App > Permissions" and enble Microphone permission.

関連する問題