Android BluetoothService类的反射问题



我想调用一些方法,如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实例,我就能调用我需要的方法。也许,这不是一个好的解决方案,但我认为它会工作。

相关内容

  • 没有找到相关文章

最新更新