У меня есть 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"/>