Направление звука на Bluetooth-гарнитуру (не A2DP) на Android - PullRequest
39 голосов
/ 27 января 2010

У меня есть BT-гарнитура без 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)
  • с использованием setMluetoothScoOn AudioManager (true)
  • с использованием setMode AudioManager (MODE_IN_CALL)

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

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

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

P.S. Приведенный выше код требует следующего разрешения

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

Ответы [ 5 ]

14 голосов
/ 07 февраля 2011

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

public void startBluetoothSco () Начиная с: API Level 8 Запуск Bluetooth SCO аудио соединение.

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

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

Как установление соединения ШОС может занять несколько секунд, приложения не следует полагаться на соединение с быть доступным, когда метод возвращает но вместо этого зарегистрироваться, чтобы получить намерение ACTION_SCO_AUDIO_STATE_CHANGED и ждать, пока государство будет SCO_AUDIO_STATE_CONNECTED.

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

Когда закончите с соединением SCO или если истечение времени истекает, приложение должно позвонить stopBluetoothSco (), чтобы очистить запросить и выключить блютус подключение.

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

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

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

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

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

6 голосов
/ 17 июня 2013

Для включения:

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

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

2 голосов
/ 24 июня 2014

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

mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

to 

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
2 голосов
/ 04 февраля 2010

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

1 голос
/ 19 августа 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...