Intereting Posts
Как передать «данные» между двумя устройствами (Android, iphone)? Фоновая частичная параллельная развертка метки GC Извлечь список пользователей из Firebase Authentication Android, указанный для свойства 'signedConfig.storeFile', не существует Чтение активов или файлов raw или ресурсов в качестве объекта File в Android Как программно установить градиент фона на пользовательской панели заголовка? Значения-21, значения-22 или значения-xx исчезли после Android Studio 1.0 Поддержка множественного соотношения сторон в Unity Как я могу использовать библиотеки поддержки v4 и v13 в одном проекте? Как сделать windowSoftInputMode = "adjustPan" pan more Как добавить округленный угол к чертежу, который я использую в качестве фона в Android? Ссылки на getCurrentActivity делают невозможным создание InputMethodService на Android Одноранговая связь между мобильным приложением и браузером ПК Получить название видео на YouTube Как изменить новый цвет и высоту индикатора TabLayout

Объект AudioRecord не инициализируется

В приведенном ниже коде мой объект audioRecord не инициализируется. Я попытался переместить его в метод onCreate и сделал его глобальным. Я зарегистрировал состояние и возвращает значение 1 что означает готовность к использованию. Отладчик говорит, что startRecording вызывается на неинициализированном объекте. Он также говорит, что он не может получить источник звука.

Почему я получаю эти ошибки?

  package com.tecmark; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.TextView; public class recorder extends Activity { private Thread thread; private boolean isRecording; private AudioRecord recorder; private FileOutputStream os; private BufferedOutputStream bos; private DataOutputStream dos; private TextView text; private int audioSource = MediaRecorder.AudioSource.MIC; private int sampleRate = 22050; private int channel = AudioFormat.CHANNEL_CONFIGURATION_MONO; private int encoding = AudioFormat.ENCODING_PCM_16BIT; private int result = 0; private int bufferSize; private byte[] buffer; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.v("onCreate", "layout set, about to init audiorec obj"); text = (TextView)findViewById(R.id.TextView01); bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,encoding); buffer = new byte[bufferSize]; recorder = new AudioRecord(audioSource, sampleRate,channel,encoding, AudioRecord.getMinBufferSize(sampleRate, channel,encoding)); Log.i("recorder obj state",""+recorder.getRecordingState()); } public void onClickPlay(View v){ } public void record(){ Log.i("inside record method", "******"); File path = Environment.getExternalStorageDirectory(); Log.v("file path", ""+path.getAbsolutePath()); File file = new File(path, "test.wav"); if(file.exists()){ file.delete(); } path.mkdirs(); Log.v("file path", ""+file.getAbsolutePath()); try { os = new FileOutputStream(file); bos = new BufferedOutputStream(os); dos = new DataOutputStream(bos); } catch (Exception e1) { e1.printStackTrace(); } int bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,encoding); byte[] buffer = new byte[bufferSize]; recorder.startRecording(); isRecording = true; try{ while (isRecording){ result = recorder.read(buffer, 0, bufferSize); for(int a=0; a<result;a++){ dos.write(buffer[a]); if(!isRecording){ recorder.stop(); break; } } } dos.flush(); dos.close(); }catch(Exception e){ e.printStackTrace(); } }// end of record method public void onClickStop(View v){ Log.v("onClickStop", "stop clicked"); isRecording=false; } public void onClickReverse(View v){ Log.v("onClickReverse", "reverse clicked"); } public void onClickRecord(View v){ Log.v("onClickRecourd", "record clicked, thread gona start"); text.setText("recording"); thread = new Thread(new Runnable() { public void run() { isRecording = true; record(); } }); thread.start(); isRecording = false; } }//end of class 

Logcat

 01-30 15:23:16.724: ERROR/AudioRecord(12817): Could not get audio input for record source 1 01-30 15:23:16.729: ERROR/AudioRecord-JNI(12817): Error creating AudioRecord instance: initialization check failed. 01-30 15:23:16.729: ERROR/AudioRecord-Java(12817): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object. 01-30 15:23:16.729: INFO/recorder obj state(12817): 1 01-30 15:23:16.729: WARN/dalvikvm(12817): threadid=13: thread exiting with uncaught exception (group=0x4001b180) 01-30 15:23:16.729: ERROR/AndroidRuntime(12817): Uncaught handler: thread Thread-7 exiting due to uncaught exception 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord. 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at android.media.AudioRecord.startRecording(AudioRecord.java:495) 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at com.tecmark.recorder.record(recorder.java:114) 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at com.tecmark.recorder$1.run(recorder.java:175) 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at java.lang.Thread.run(Thread.java:1096) 

Solutions Collecting From Web of "Объект AudioRecord не инициализируется"

Трюк с использованием AudioRecord заключается в том, что у каждого устройства могут быть разные настройки инициализации, поэтому вам придется создать метод, который объединяет все возможные комбинации скоростей передачи, кодирования и т. Д.

 private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 }; public AudioRecord findAudioRecord() { for (int rate : mSampleRates) { for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) { for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) { try { Log.d(C.TAG, "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig); int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { // check if we can instantiate and have a success AudioRecord recorder = new AudioRecord(AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize); if (recorder.getState() == AudioRecord.STATE_INITIALIZED) return recorder; } } catch (Exception e) { Log.e(C.TAG, rate + "Exception, keep trying.",e); } } } } return null; } AudioRecord recorder = findAudioRecord(); recorder.release(); 

У меня была та же проблема, она была решена путем

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

В манифест

Согласно javadocs, всем устройствам гарантируется поддержка этого формата (для записи):

44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT.

Для воспроизведения нажмите CHANNEL_OUT_MONO.

Теперь, с леденцом, вам нужно конкретно спросить пользователя о каждом разрешении. Убедитесь, что разрешение предоставлено.

Проблема с инициализацией нескольких объектов AudioRecord может быть исправлена ​​с помощью audioRecord.release(); Перед созданием следующего объекта … Подробнее здесь: Android AudioRecord – не будет инициализировать второй раз

Даже после выполнения всех вышеперечисленных шагов я получал ту же проблему, что сработало для меня, так это то, что мой os был зефиром, и я должен был просить разрешения .

Просто была та же проблема. Решением было перезапустить устройство. Во время игры с кодом я не выпустил объект AudioRecord, который, очевидно, заставлял звуковое устройство застревать. Чтобы проверить, работает ли аудиоустройство или нет, я загрузил Audalyzer из Google Play.

Если ваша мобильная телефонная система – Android M или выше, возможно, вам нужно применить разрешение записи звука в Android M. http://developer.android.com/guide/topics/security/permissions.html

Я заметил, что когда SDCard на avd, который я запускаю, заполняется, конструктор AudioRecord возвращает null. Вы пробовали очистить SDCard?

Я думаю, что это связано с потоком, не зная, что вы приостановили основное действие и все еще пытаетесь записать после того, как остановили рекордер.

Я решил это, изменив методы onResume () и onPause (), чтобы изменить isRecording boolean.

 public void onResume() { ... isRecording = true; } public void onPause() { ... isRecording = false; } 

Затем в вашем потоке startRecording() оба параметра startRecording() и stop() с проверкой if-statements на isRecording:

 if(isRecording) recorder.startRecording(); ... if(isRecording) recorder.stop(); // which you've done 

Я переписал ответ от @DustinB для тех, кто использует Xamarin Android AudioRecord с C #.

 int[] sampleRates = new int[] { 44100, 22050, 11025, 8000 }; Encoding[] encodings = new Encoding[] { Encoding.Pcm8bit, Encoding.Pcm16bit }; ChannelIn[] channelConfigs = new ChannelIn[]{ ChannelIn.Mono, ChannelIn.Stereo }; //Not all of the formats are supported on each device foreach (int sampleRate in sampleRates) { foreach (Encoding encoding in encodings) { foreach (ChannelIn channelConfig in channelConfigs) { try { Console.WriteLine("Attempting rate " + sampleRate + "Hz, bits: " + encoding + ", channel: " + channelConfig); int bufferSize = AudioRecord.GetMinBufferSize(sampleRate, channelConfig, encoding); if (bufferSize > 0) { // check if we can instantiate and have a success AudioRecord recorder = new AudioRecord(AudioSource.Mic, sampleRate, channelConfig, encoding, bufferSize); if (recorder.State == State.Initialized) { mBufferSize = bufferSize; mSampleRate = sampleRate; mChannelConfig = channelConfig; mEncoding = encoding; recorder.Release(); recorder = null; return true; } } } catch (Exception ex) { Console.WriteLine(sampleRate + "Exception, keep trying." + ex.Message); } } } }