Я хочу вызвать некоторые методы, такие как isEnabled (), getAddressFromObjectPath () и т. Д. Класса BluetoothService, но этот класс помечен @ hide.
Я знаю, что у меня есть два возможных способа сделать то, что я хочу, один - удалить @hide, а другой - использовать отражение. Я решил использовать второй.
На примере исходного кода я обнаружил, что
Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
IBinder b = (IBinder) method.invoke(null, "bluetooth");
if (b == null) {
throw new RuntimeException("Bluetooth service not available");
}
IBluetooth mBluetoothService = IBluetooth.Stub.asInterface(b);
Однако он получает IBluetooth, а не BluetoothService, хотя BluetoothService действительно расширяет IBluetooth.Stub.
Итак, мои вопросы таковы:
(1) Могу ли я получить класс BluetoothService путем отражения, как в предыдущем примере кода?
(2) Если мой первый вопрос отрицательный, я вызываю getAddressFromObjectPath () напрямую методом отражения, как показано ниже
Method method = Class.forName("android.server.BluetoothService").getMethod("getAddressFromObjectPath", String.class);
String b = (String) method.invoke(???, PATH);
какую дозу объекта мне нужно заполнить в методе invoke (), BluetoothService ???
Любое предложение будет с благодарностью !!!