在Android API中调用私有(未发布)方法

时间:2011-05-16 16:31:16

标签: android reflection bluetooth headset

我需要检查OS 2.0 - 2.3中当前连接的BT耳机(不仅仅是配对)。在引入蓝牙耳机类的API版本11之前,此类功能不存在。但是在先前的API中已经存在一个名为BluetoothHeadset的类,但它不能公开访问。这是它的文档:http://www.kiwidoc.com/java/l/x/android/android/9/p/android.bluetooth/c/BluetoothHeadset。所以,我试图使用反射来调用“isConnected”方法,但我反思非常糟糕,我收到错误java.lang.IllegalArgumentException: object is not an instance of the class

我使用BluetoothDevice.getBondedDevices()获得了配对设备列表,我尝试在每个设备上使用isConnected()方法。这是代码:

public boolean isBtDevConnected(BluetoothDevice btDev){
    boolean connected  = false;
    try {
        Class<?> BTHeadset = Class.forName("android.bluetooth.BluetoothHeadset");
        Method isConnected = BTHeadset.getMethod("isConnected", new Class[] {BluetoothDevice.class});
                connected = isConnected.invoke(BTHeadset, new Object[] {btDev});
            }
        }
    } catch (Exception e) {
        WriteToLog(e);
    }
    return connected;
}

我在调用该方法的行上得到了异常,但我不确定我做错了什么。

1 个答案:

答案 0 :(得分:0)

BluetoothHeadset是一个代理对象,用于通过IPC控制蓝牙耳机服务。

使用getProfileProxy(Context,BluetoothProfile.ServiceListener,int)获取BluetoothHeadset代理对象。使用closeProfileProxy(int,BluetoothProfile)关闭服务连接。

Android一次只支持一个连接的蓝牙耳机。每种方法都有适当的权限保护。

来源:http://developer.android.com/reference/android/bluetooth/BluetoothHeadset.html