2016-06-29 17 views
3

Ich habe alle anderen Threads seit mehreren Stunden überprüft und ausprobiert, und keine der Lösungen funktioniert.Android AudioRecord kann nicht initialisiert werden (Andere Lösungen funktionieren nicht)

Ich habe versucht, durch alle verfügbaren Audio-Optionen zu filtern. Ich habe der App die entsprechenden Berechtigungen erteilt.

Ziel: Ich versuche, diesen Audio-Stream zu bekommen, damit ich die Frequenz des Audios bekommen kann.

Media-Pool

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 

später ...

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(); 
    } 

Dieses wird folgende Fehler wirft (http://pastebin.com/raw/3wmA4cku):

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

Können Sie den vollständigen Quellcode einfügen? Haben Sie eine Record-Schleife in einem anderen Thread ausgeführt? Was ist deine Android-Version? – lucky1928

Antwort

4

Schritt 1) ​​Überprüfen Sie Ihre Manifest hinzufügen Abschnitt RECORD_AUDIO Erlaubnis unter Anwendung sicherzustellen. z.B.

<?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> 

Schritt 2) Wenn Ihr Gerät ist M oder später, müssen Sie die permssion von Einstellungen-> App-> Ihre App-> Berechtigungen erteilen.

Schritt 3) Siehe unten Code-Snippet, wenn immer noch nicht funktioniert.

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(); 
    } 

Es sollte jetzt funktionieren!

1

denke ich das Problem, dass Sie hatte sein kann fesselte die Audio-Ressourcen mit einem vorherigen Versuch, dann bekam der Code den richtigen Code und jetzt funktioniert es nicht mehr Da sind keine Audio-Ressourcen verfügbar. Siehe this SO question. Sie werfen auch eine Ausnahme, wenn der Konstruktor ein nicht initialisiertes AudioRecord zurückgibt, aber Sie fangen Ihre eigene Ausnahme ab und dies führt zu einer zweiten Ausnahme (..., die nicht initialisiertes AudioRecord aufgerufen wird ...) im Protokoll, die so ignoriert werden kann ein Ergebnis des ersten.

Sie müssen möglicherweise einige try/finally-Abschnitte und/oder eine OnDestroy-Methode und/oder OnPause-Methode in Ihre Aktivität einfügen, um sicherzustellen, dass der audioRecord freigegeben wird, wenn er nicht mehr verwendet wird.

Sobald Sie den Bereinigungscode installiert haben, müssen Sie möglicherweise Ihre App beenden und/oder das Telefon neu starten, um die Audio-Ressourcen freizugeben.

Natürlich ist es möglich, dass Sie eine andere App laufen gelassen haben, die das Mikrofon hält, aber ich bezweifle es.

+0

Ich habe gerade den Fang endlich umgesetzt. Ich habe mein Telefon neu gestartet. Ich habe versucht, einen Emulator zu verwenden. Zuerst versuche ich jedes Mal, wenn ich den Fehler bekomme, dass 'java.lang.IllegalStateException: startRecording() eine nicht initialisierte AudioRecord.java.lang.IllegalStateException aufgerufen: startRecording() aufgerufen auf einem nicht initialisierten AudioRecord.' – Chris

+0

@Chris Sie sollten sich nicht darauf verlassen der Emulator, um schwierige Probleme zu beheben, absolut nicht. – Josh

1

Dies ist die Antwort. Es ist dumm, dass dies nicht etwas ist, das Android hat.

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.

Verwandte Themen