我想调用某些方法,例如BluetoothService类的isEnabled(),getAddressFromObjectPath()等,但是此类用@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);
但是,尽管BluetoothService确实扩展了IBluetooth.Stub,但得到的是IBluetooth而不是BluetoothService。
所以我的问题如下:
(1)是否可以像前面的示例代码一样通过反射获取BluetoothService类?
(2)如果我的第一个问题是否定的,我可以通过如下所示的反射方法直接调用getAddressFromObjectPath()
Method method = Class.forName("android.server.BluetoothService").getMethod("getAddressFromObjectPath", String.class);
String b = (String) method.invoke(???, PATH);
我需要在哪个对象中填写invoke()方法BluetoothService?
任何建议将不胜感激!
最佳答案
在互联网上进行调查后,我得到了答案。如果要调用非静态方法,则需要先获取类和构造函数。使用构造函数构造实例,然后可以通过该实例调用非静态方法。
但是,我无法在BluetoothService类上执行此操作,因为如果再次执行构造函数,则会导致很多问题!
我决定修改IBluetooth.aidl以添加所需的方法,因为BluetoothService扩展了IBluetooth。如果可以获取IBluetooth实例,则可以调用所需的方法。也许这不是一个好的解决方案,但我认为它会起作用。
非常感谢。