我想调用一些方法,如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);
然而,它得到的是IBluetooth而不是BluetoothService,尽管BluetoothService扩展了IBluetooth。存根。
所以我的问题如下:
(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。添加我需要的方法,因为BluetoothService扩展了IBluetooth。如果我能得到IBluetooth实例,我就能调用我需要的方法。也许,这不是一个好的解决方案,但我认为它会工作。