Android – Получение звука для воспроизведения через динамик

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

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

Я хочу, чтобы он играл через ухо на устройстве.

Вот мой код:

public class LoopProg extends Activity { boolean isRecording; //currently not used AudioManager am; int count = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); am.setMicrophoneMute(true); while(count <= 1000000){ Record record = new Record(); record.run(); count ++; Log.d("COUNT", "Count is : " + count); } } public class Record extends Thread{ static final int bufferSize = 200000; final short[] buffer = new short[bufferSize]; short[] readBuffer = new short[bufferSize]; public void run() { isRecording = true; android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); int buffersize = AudioRecord.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize); AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM); am.setRouting(AudioManager.MODE_NORMAL,1, AudioManager.STREAM_MUSIC); int ok = am.getRouting(AudioManager.ROUTE_EARPIECE); Log.d("ROUTING", "getRouting = " + ok); setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); //am.setSpeakerphoneOn(true); Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn()); am.setSpeakerphoneOn(false); Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn()); atrack.setPlaybackRate(11025); byte[] buffer = new byte[buffersize]; arec.startRecording(); atrack.play(); while(isRecording) { arec.read(buffer, 0, buffersize); atrack.write(buffer, 0, buffer.length); } arec.stop(); atrack.stop(); isRecording = false; } } } 

Как вы можете видеть, был ли код, который я попытался использовать с классом AudioManager и его методами, включая устаревший метод setRouting, и ничего не работает, метод setSpeakerphoneOn, похоже, вообще не действует, и метод маршрутизации не работает.

У кого-нибудь есть какие-то идеи о том, как заставить его играть через динамик, а не на телефоне с spaker?

Solutions Collecting From Web of "Android – Получение звука для воспроизведения через динамик"

Просто ему пришлось работать над 2.2. Мне все еще нужна настройка In_Call, которая мне не нравится, но сейчас я буду заниматься этим. Я смог отбросить данные о маршрутизации вызовов, которые теперь устарели. Я обнаружил, что вам определенно нужно разрешение Modify_Audio_Settings , без него нет ошибки, но метод setSpeakerPhone просто ничего не делает. Вот макет кода, который я использовал.

 private AudioManager m_amAudioManager; m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); m_amAudioManager.setSpeakerphoneOn(false); 

В этом недавнем вопросе шла некоторая дискуссия:
Android – можно ли отключить звук в настоящее время в аудио-приложениях?

Основываясь на исходном коде AudioManager , кажется, что вы должны находиться в режиме «вызова» до того, setSpeakerphoneOn метод setSpeakerphoneOn имеет какой-либо эффект.

Однако недавно я увидел приложение, которое могло бы легко переключаться между динамиком и громкой связью, пока показывая текущий поток как поток «media», поэтому меня бы интересовали дальнейшие ответы.

Некоторое количество ответов здесь немного пропущено. Я использую Android 2.2. "AudioManager.setSpeakerphoneOn (ложь);" работает.

 audioManager.setSpeakerphoneOn(false); ... mediaPlayer.setDataSource(..); mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); mediaPlayer.prepare(); 

Используйте этот код, он хорошо работает:

  //PLAY ON EARPIECE mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(false); //PLAY ON SPEAKER mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(true); 
 public MediaPlayer m_mpSpeakerPlayer; private AudioManager m_amAudioManager; m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); // 從Receiver Earpiece發音m_amAudioManager.setSpeakerphoneOn(false); m_amAudioManager.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL); Log.i(TAG, String.valueOf(m_amAudioManager.getRouting(AudioManager.ROUTE_EARPIECE))); setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); // 把聲音設定成從Earpiece出來// 重點在這行,要把它設定為正在通話中m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); // 開始放音樂m_mpSpeakerPlayer.reset(); m_mpSpeakerPlayer.setDataSource("sdcard/receiver.mp3"); m_mpSpeakerPlayer.prepare(); m_mpSpeakerPlayer.start(); //最後再把它設定從Speaker放音,達成! m_amAudioManager.setMode(AudioManager.MODE_NORMAL); 

Кажется, я работал над 1.6.

Поэтому я сказал, что опубликую здесь, как я это сделал.

Чтобы заставить его работать в 1.6 I:

Использовал класс AudioManager для установки setSpeakerphoneOn(false) , затем я использовал Voice_Call_Stream и добавил регулятор громкости в Voice_Call_Stream .

Метод setSpeakerphoneOn(false) используется в onCreate() и это появляется для маршрутизации на гарнитуру, затем я использовал кнопку и использовал метод setSpeakerphoneOn(true) и звук передавался в динамик.

Метод работает только тогда, когда он используется в onCreate() для меня, и я не тестировал его широко, но на данный момент он позволяет мне переключаться между гарнитурой и динамиком на устройстве 1.6

Если слуховой аппарат подключен к телефону с помощью bluetooth (как я предполагаю), попробовали ли вы вызов AudioManager.setBluetoothScoOn(true) ?

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