2010-07-02 3 views
21

Да, я знаю, что Android уже реализовал Bluetooth-гарнитуру Профиль, но он находится в роли Audio Gateway, а не в роли HeadSet.Как сделать телефон Android в качестве Bluetooth-гарнитуры?

Что я хочу сделать, это разработать приложение на Android-телефоне, которое будет выступать в качестве гарнитуры Bluetooth, поэтому оно может подключаться к моему ноутбуку с помощью bluetooth. Когда я пытаюсь позвонить кому-нибудь, я могу использовать свой телефон, чтобы набрать его, и мое приложение переведет голос через Bluetooth на мой ноутбук, и еще одно приложение, работающее на ноутбуке, получит голосовые данные и переслает их в Skype или GTalk, или какой-либо другой VoIP-программы.

Другими словами, как я могу реализовать профиль гарнитуры в гарнитуре Роль на телефоне Android? Заранее спасибо!

+0

Я хочу похожую funcationality. Я хочу, чтобы звонки с компьютера имели аудио (VOICE_DOWNLINK), отправленные обратно на компьютер в качестве громкоговорителя. но держите микрофон по телефону – Mark

+0

Это не тривиальный запрос; в bluez в minumum вам нужно будет: a) добавить роль громкой связи в запись SDP. b) Удалите аудио-шлюз из записи SDP. c) Измените класс устройства телефона, чтобы имитировать гарнитуру. Это просто подключение к профилю громкой связи. Что касается отправки звука и т. Д., Это еще одна проблема. Я не уверен, что у bluedroid даже есть поддержка для этого, вам может понадобиться настраиваемое ядро. – TwinPrimesAreEz

ответ

4

С андроида стороны, я думаю, что лучшим решением будет открыть подключение к услуге в вашем компьютере:

URL url = new URL("http://192.186.0.1/path/to/service"); 
URLConnection connection = url.openConnection(); 

Получить его как OutputStream:

OutputStream out = new BufferedStream(connection.getOutputStream()); 

, а затем используйте AudioRecord для отправки по записанным данным:

public static final int DEFAULT_SAMPLE_RATE = 8000; 
private static final int DEFAULT_BUFFER_SIZE = 4096; 
private static final int CALLBACK_PERIOD = 4000; 

AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 
      DEFAULT_SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, 
      AudioFormat.ENCODING_DEFAULT, DEFAULT_BUFFER_SIZE); 
recorder.setPositionNotificationPeriod(CALLBACK_PERIOD); 

int bytesRead = 0; 
ByteBuffer buffer = ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE); 
while ((bytesRead = recorder.read(buffer, DEFAULT_BUFFER_SIZE)) > 0) { 
    out.write(buffer.array(), 0, bytesRead); 
} 

Все это должно выполняться в отдельном потоке, чтобы избежать сбоя приложения и механизма для обработки, когда запись прекращается или соединение теряется. Кроме того, я уверен, что он должен работать через Wi-Fi, хотя я не уверен, будет ли он одинаковым с bluetooth (хотя большинство устройств с BT имеют Wi-Fi теперь через несколько дней, и вы получаете больше полосы пропускания)

У меня нет протестировал этот код, чтобы я не был на 100% уверен, что он сработает.

Следующая вещь будет на машине для передачи звука в приложение желания, но это выше моего опыта. Я думаю, вам придется делать виртуальный драйвер или что-то в этом роде. Также нужно будет сделать обратный механизм для звука, отправленного из настольного приложения в телефон (я довольно заинтересован в этой части, так как сделал бы хорошую беспроводную гарнитуру для просмотра фильмов).

Вот мои 2 цента; Я очень хочу знать, работает ли это. ;)

+0

Запись аудиопотока с телефонной линии во время голосового вызова заблокирована на большинстве телефонов Android на уровне прошивки/драйвера. Вы можете использовать собственное ядро ​​для разблокировки таких функций на некоторых телефонах. – kord

1

Я не знаю, понял ли я настоящий вопрос или вашу главную цель ... но я опубликовал here, как получать и отправлять звук с гарнитуры через Bluetooth в Android.

Я надеюсь помочь вам ...

 Смежные вопросы

  • Нет связанных вопросов^_^