2016-06-29 1 views
3

Я проверил и пробовал все остальные темы в течение нескольких часов сегодня, и ни одно из решений не работает.Android AudioRecord не инициализируется (другие решения не работают)

Я пробовал фильтровать все доступные аудио параметры. Я дал правильные разрешения для приложения.

Цель: Я пытаюсь получить этот аудиопоток, чтобы получить частоту звука.

Мой материал

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 

позже ...

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

Это выдает следующее сообщение об ошибке (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

Можете ли вы вставить полный исходный код? Вы запустили цикл записи в другом потоке? Какая у вас версия для Android? – lucky1928

ответ

4

Шаг 1) Проверьте ваш манифест, чтобы обеспечить добавление разрешения RECORD_AUDIO в разделе приложения. например

<?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) Если устройство M или более поздней версии, вам необходимо предоставить permssion от Настройки-> App-> Ваши app-> Права доступа.

Шаг 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

Я думаю, что проблема может быть, что у вас связал аудио ресурсы с предыдущей попыткой, затем получил код правильно и теперь он не работает becau se нет доступных аудиоресурсов. См. this SO question. Кроме того, вы бросаете исключение, когда конструктор возвращает неинициализированный AudioRecord, но вы улавливаете свое собственное исключение, и это приводит к второму исключению (... вызываемому неинициализированным AudioRecord ...) в журнале, который можно игнорировать, поскольку он результат первого.

Возможно, вам понадобится указать некоторые разделы try/finally и/или OnDestroy и OnPause в вашей активности, чтобы обеспечить освобождение аудиозаписей, когда они больше не используются.

После того, как у вас есть код очистки, вам может потребоваться убить приложение и/или перезагрузить телефон, чтобы освободить аудио ресурсы.

Конечно, возможно, что вы оставили приложение, в котором находится микрофон, но я сомневаюсь.

+0

Я только что реализовал окончательный улов. Я перезапустил свой телефон. Ive пытался использовать эмулятор. Сначала попробуйте каждый раз, когда я получаю сообщение об ошибке, которое 'java.lang.IllegalStateException: startRecording() вызвано неинициализированным AudioRecord.java.lang.IllegalStateException: startRecording() вызвано неинициализированным AudioRecord.' – 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.

 Смежные вопросы

  • Нет связанных вопросов^_^