Маршрутизация аудио в Bluetooth-гарнитуру (не A2DP) на Android

У меня есть гарнитура для наушников без наушников A2DP (Plantronics 510), и я хотел бы использовать ее с Android HTC Magic для прослушивания звука низкого качества, например, подкастов / аудиокниг.

После долгих поисковых запросов я обнаружил, что только телефонные звонки могут быть направлены на гарнитуры, отличные от A2DP BT. (Я хотел бы узнать, нашли ли вы готовое решение для маршрутизации всех видов аудио в не-A2DP BT-гарнитуры)

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

import android.content.*; import android.app.Activity; import android.os.Bundle; import android.media.*; import java.io.*; import android.util.Log; public class BTAudioActivity extends Activity { private static final String TAG = "BTAudioActivity"; private MediaPlayer mPlayer = null; private AudioManager amanager = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); amanager.setBluetoothScoOn(true); amanager.setMode(AudioManager.MODE_IN_CALL); mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(new FileInputStream( "/sdcard/sample.mp3").getFD()); mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); mPlayer.prepare(); mPlayer.start(); } catch(Exception e) { Log.e(TAG, e.toString()); } } @Override public void onDestroy() { mPlayer.stop(); amanager.setMode(AudioManager.MODE_NORMAL); amanager.setBluetoothScoOn(false); super.onDestroy(); } } 

Как вы можете видеть, я пробовал сочетания различных методов, которые, как я думал, обманут телефон, чтобы поверить, что мой звук – это телефонный звонок:

  • Использование setAudioStreamType для MediaPlayer (STREAM_VOICE_CALL)
  • С помощью набора AudioManager setBluetoothScoOn (true)
  • Используя setMode AudioManager (MODE_IN_CALL)

Но ничего из этого не было. Если я удалю вызовы AudioManager в вышеуказанном коде, звук воспроизводится с динамика, и если я их заменим, как показано выше, звук перестанет поступать от динамиков, но он не будет проходить через гарнитуру BT. Так что это может быть частичным успехом.

Я проверил, что гарнитура BT работает нормально с телефонными звонками.

Должна быть причина, по которой Android не поддерживает это. Но я не могу отпустить ощущение, что невозможно программно перенаправить звук. Есть идеи?

PS над кодом необходимо следующее разрешение

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

Solutions Collecting From Web of "Маршрутизация аудио в Bluetooth-гарнитуру (не A2DP) на Android"

Эта ветка может быть долгой, но для тех, кто может попробовать одно и то же, некоторые заметки из документов AudioManager могут быть полезными. Похоже, что отсутствующим элементом является команда startBluetoothSco (), но есть ограничения на использование этого канала. С сайта Android Dev здесь :

Public void startBluetoothSco () Начиная с: API уровня 8 Запустите Bluetooth-соединение SCO аудио.

Требуется разрешение: MODIFY_AUDIO_SETTINGS.

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

Поскольку установка соединения SCO может занять несколько секунд, приложения не должны полагаться на соединение, которое будет доступно, когда метод вернется, но вместо этого зарегистрируйтесь для получения намерения ACTION_SCO_AUDIO_STATE_CHANGED и дождитесь, пока состояние будет SCO_AUDIO_STATE_CONNECTED.

Поскольку соединение не гарантирует успеха, приложения должны ждать этого намерения с таймаутом.

По завершении соединения SCO или при истечении срока действия приложения приложение должно вызвать stopBluetoothSco (), чтобы очистить запрос и отключить соединение Bluetooth.

Даже если установлено соединение SCO, для аудиовыходных потоков применяются следующие ограничения, чтобы их можно было перенаправить на гарнитуру SCO: – тип потока должен быть STREAM_VOICE_CALL – формат должен быть моно – выборка должна быть 16 кГц или 8 кГц

Следующие ограничения применяются к входным потокам: – формат должен быть моно – выборка должна быть 8 кГц

Обратите внимание, что приложение телефона всегда имеет приоритет при использовании соединения SCO для телефонии. Если этот метод вызывается во время вызова телефона, он будет проигнорирован. Аналогично, если вызов получен или отправлен, когда приложение использует соединение SCO, соединение будет потеряно для приложения и НЕ будет возвращено автоматически, когда вызов закончится.

См. Также stopBluetoothSco () ACTION_SCO_AUDIO_STATE_CHANGED

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

Включать:

  localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); localAudioManager.setMode(0); localAudioManager.setBluetoothScoOn(true); localAudioManager.startBluetoothSco(); localAudioManager.setMode(AudioManager.MODE_IN_CALL); 

Выключить:

  localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); localAudioManager.setBluetoothScoOn(false); localAudioManager.stopBluetoothSco(); localAudioManager.setMode(AudioManager.MODE_NORMAL); 

Я взял это отсюда

Great Work работает отлично для меня, пожалуйста, сделайте модификацию бит в своем коде, он будет работать отлично, т.е.

 mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); to mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

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

Невозможно увидеть ясное принятое рабочее приложение, поэтому добавьте новый ответ. Это приложение направляет музыку и аудио в гарнитуры Non A2dp. Попробуйте мое приложение и найдите исходный код также в github для ссылочного кода. https://github.com/sauravpradhan/AnySound2BT