Android подключается к сопряженной Bluetooth-гарнитуре - PullRequest
1 голос
/ 28 мая 2011

Я хочу смоделировать действие «Настройки»> «Беспроводная связь»> «Bluetooth» и программно подключить сопряженную гарнитуру Bluetooth. Я выполнил некоторый поиск в Stackoverflow и Google, и оба указали, что до уровня API 11 решения не существует. Однако я заинтересован в его разработке, посмотрев на исходный код реализации Android на bluetooth. Проблема в том, что я не знаю, какой именно исходный код мне следует просмотреть. Какие-либо предложения? Большое спасибо.

Ответы [ 4 ]

8 голосов
/ 29 мая 2011

После нескольких дней борьбы мне удалось это сделать, ура :) 1001 * Добавьте android.bluetooth.IBluetoothA2dp.aidl в каталог / src своего приложения; Добавьте этот приватный метод в свой код: private IBluetoothA2dp getIBluetoothA2dp() { IBluetoothA2dp ibta = null; try { Class c2 = Class.forName("android.os.ServiceManager"); Method m2 = c2.getDeclaredMethod("getService", String.class); IBinder b = (IBinder) m2.invoke(null, "bluetooth_a2dp"); Log.d("Felix", "Test2: " + b.getInterfaceDescriptor()); Class c3 = Class.forName("android.bluetooth.IBluetoothA2dp"); Class[] s2 = c3.getDeclaredClasses(); Class c = s2[0]; // printMethods(c); Method m = c.getDeclaredMethod("asInterface", IBinder.class); m.setAccessible(true); ibta = (IBluetoothA2dp) m.invoke(null, b); } catch (Exception e) { Log.e("flowlab", "Erroraco!!! " + e.getMessage()); } Проверьте это с помощью: private void testBluetoothA2dp(BluetoothDevice device) { // TODO Auto-generated method stub // TODO Auto-generated method stub IBluetoothA2dp ibta = getIBluetoothA2dp(); try { Log.d("Felix", "Here: " + ibta.getSinkPriority(device)); ibta.connectSink(device); } catch (RemoteException e) { // * TODO Auto-generated catch block e.printStackTrace(); } } Я не могу предоставить ссылки на этот код, поскольку я потратил много времени на поиск, проверку стека и просмотр исходного кода Android, но не смог отследить источники. Большое спасибо вам, ребята, в Stackoverflow:)

2 голосов
/ 20 ноября 2012

Я пробовал это на Android 4.2 и следующая строка возвращает ноль. Работало на 4.1, есть идеи?

IBinder b = (IBinder) m2.invoke(null, "bluetooth_a2dp");
2 голосов
/ 11 января 2012

ОК, я получил это обновление для поддержки Honeycomb и выше.Вам необходимо добавить новые функции в интерфейс.Я сделал это здесь:

interface IBluetoothA2dp {
boolean connectSink(in BluetoothDevice device); // Pre API 11 only
boolean disconnectSink(in BluetoothDevice device); // Pre API 11 only
boolean connect(in BluetoothDevice device); // API 11 and up only
boolean disconnect(in BluetoothDevice device); // API 11 and up only
boolean suspendSink(in BluetoothDevice device); // all
boolean resumeSink(in BluetoothDevice device); // all
BluetoothDevice[] getConnectedSinks();  // change to Set<> once AIDL supports, pre API 11 only
BluetoothDevice[] getNonDisconnectedSinks();  // change to Set<> once AIDL supports, 
int getSinkState(in BluetoothDevice device);
boolean setSinkPriority(in BluetoothDevice device, int priority); // Pre API 11 only
boolean setPriority(in BluetoothDevice device, int priority); // API 11 and up only
int getPriority(in BluetoothDevice device); // API 11 and up only
int getSinkPriority(in BluetoothDevice device); // Pre API 11 only
boolean isA2dpPlaying(in BluetoothDevice device); // API 11 and up only

}

Затем вам нужно проверить версию API перед вызовом функций в этом интерфейсе.Вот мой пример:

            if (android.os.Build.VERSION.SDK_INT < 11) {

            IBluetoothA2dp ibta = getIBluetoothA2dp();
            try {
                Log.d(LOG_TAG, "Here: " + ibta.getSinkPriority(device));
                if (ibta != null)
                    ibta.connectSink(device);
            } catch (Exception e) {
                Log.e(LOG_TAG, "Error " + e.getMessage());
            }
        } else {
            IBluetoothA2dp ibta = getIBluetoothA2dp();
            try {
                Log.d(LOG_TAG, "Here: " + ibta.getPriority(device));
                if (ibta != null)
                    ibta.connect(device);
            } catch (Exception e) {
                Log.e(LOG_TAG, "Error " + e.getMessage());
            }
        }

Надеюсь, это поможет.Мне удалось заставить одно и то же приложение работать с обоими интерфейсами.

0 голосов
/ 24 июня 2013

это ВИД, связанный с проблемой подключения / переподключения (ОТВЕТ, являющийся скриптом яблока) ..

Я только что купил Android HD VV и использую его в качестве точки доступа через приложение PdaNet (установлен как на моем телефоне, так и на моем компьютере Mac OS 10.5.8 ppc).

Кажется, я не могу заставить модем работать в Wi-Fi через Wi-Fi или USB, но он хорошо работает с BLUETOOTH!Единственная проблема заключается в том, что соединение длится от 2 минут до 40 минут (сейчас это видно, ха, запись), и мне нужно заново подключиться вручную, что занимает всего 2 секунды, но было бы неплохо, если бы сетевой аспект моего Mac могАВТО переподключение.

Моя ячейка не проблема, так как она посылает постоянный сигнал (хотя я мог временно потерять сигнал из своей ячейки, что является нормальным соединением) ... проблема в том, что мой ноутбук авто RE-connect.мой ноутбук и htc one v ДОЛЖНЫ оставаться в паре, просто нет АВТО-РЕКОННЕКТА на стороне ноутбука.

Хотелось бы, чтобы я знал сценарии Apple, bcs, тогда я мог бы написать сценарий Apple, который АВТО-РЕКОНСТРУКТУРУЕТ потерянное соединение Bluetooth.. или, возможно, виджет мог сделать это?если это так, я бы сделал это в тени, так как модем Bluetooth работает НИЧЕГО.

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

...