我想调用某些方法,例如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实例,则可以调用所需的方法。也许这不是一个好的解决方案,但我认为它会起作用。

非常感谢。

09-27 09:40