#android #reflection #bluetooth #headset
#Android #отражение #bluetooth #гарнитура
Вопрос:
Мне нужно проверить, какие гарнитуры BT в данный момент подключены (не просто сопряжены) в OS 2.0 — 2.3. Такая функциональность не существует до версии API 11, где был введен класс гарнитуры Bluetooth. Но в предыдущих API-интерфейсах уже существовал класс под названием BluetoothHeadset, но он не был общедоступным. Вот документация к нему: http://www.kiwidoc.com/java/l/x/android/android/9/p/android.bluetooth/c/BluetoothHeadset . Итак, я пытался использовать отражение для вызова метода «isConnected», но у меня довольно плохо получается отражать, и я получаю ошибку java.lang.IllegalArgumentException: object is not an instance of the class
.
Я получил список сопряженных устройств, использующих BluetoothDevice.getBondedDevices()
, и я пытаюсь использовать isConnected()
метод на каждом из них. Вот код:
public boolean isBtDevConnected(BluetoothDevice btDev){
boolean connected = false;
try {
Class<?> BTHeadset = Class.forName("android.bluetooth.BluetoothHeadset");
Method isConnected = BTHeadset.getMethod("isConnected", new Class[] {BluetoothDevice.class});
connected = isConnected.invoke(BTHeadset, new Object[] {btDev});
}
}
} catch (Exception e) {
WriteToLog(e);
}
return connected;
}
Я получаю исключение в строке, которая вызывает метод, но я не уверен, что я делаю неправильно.
Комментарии:
1. Я думаю, я понял проблему — я должен вызвать invoke () для инициализированного объекта BluetothHeadset, а не для класса BluetothHeadset. Но это подводит меня к другой проблеме: как я могу инициализировать объект BluetoothHeadset?
Ответ №1:
BluetoothHeadset — это прокси-объект для управления сервисом Bluetooth-гарнитуры через IPC.
Используйте getProfileProxy(контекст, BluetoothProfile.ServiceListener, int) для получения прокси-объекта BluetoothHeadset. Используйте closeProfileProxy(int, BluetoothProfile), чтобы закрыть подключение к службе.
Android поддерживает только одну подключенную Bluetooth-гарнитуру одновременно. Каждый метод защищен соответствующим разрешением.
источник: http://developer.android.com/reference/android/bluetooth/BluetoothHeadset.html
Комментарии:
1. Как я уже указывал в исходном вопросе, это должно работать на более старых API (2.2 и выше), вот почему мне нужно было получить доступ к частным методам, которых нет в API
2. Кроме того, я решил проблему, с которой я изначально сталкивался, без необходимости вызывать эти API, поэтому, с технической точки зрения, этот вопрос больше не актуален
3. Привет, пользователь 496854, как вам удалось обойти проблему без вызова частных API? Я сталкиваюсь с той же проблемой