Вызов частного (неопубликованного) метода в Android API

#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? Я сталкиваюсь с той же проблемой