10

我有一些代码可以通过调用 createBond() 自动与蓝牙设备配对,为 android.bluetooth.device.action.PAIRING_REQUEST 注册广播接收器,然后手动输入 PIN 码进行配对。

到目前为止,这对所有测试到 Andoid 4.0 的设备都非常有效,但今天我在我的 Nexus 7 和 Android 4.2.1 上尝试了这个并得到了以下错误:

java.lang.noSuchMethodException: android.bluetooth.IBluetooth.createBond

他们真的从库中删除了这个函数吗?

更新

实际发生的是我用来调用 createBond 的 IBluetooth 接口对象没有被初始化。在下面的代码中,尝试获取名为 BTBinder 的 IBinder 的行在此过程失败时返回 null,导致 BTInterface 在最后设置为 null。所以,我现在的问题是为什么在我的带有 Android 4.2.1 的 Nexus 7 上调用获取活页夹返回 null 但在我测试过的其他 5 台设备上正常工作?

public static IBluetooth getBluetoothInterface()
{
    //Gets a bluetooth interface from private Android system API
    IBluetooth BTInterface = null;

    try
    {
        Class<?> ServiceManager = Class.forName("android.os.ServiceManager");
        Method getService = ServiceManager.getDeclaredMethod("getService", String.class);
        IBinder BTBinder = (IBinder) getService.invoke(null, "bluetooth");
        Class<?> IBluetooth = Class.forName("android.bluetooth.IBluetooth");
        Class<?>[] IBluetoothClasses = IBluetooth.getDeclaredClasses();
        Class<?> IBluetoothClass0 = IBluetoothClasses[0];
        Method asInterface = IBluetoothClass0.getDeclaredMethod("asInterface",IBinder.class);
        asInterface.setAccessible(true);
        BTInterface = (IBluetooth) asInterface.invoke(null, BTBinder);
    }
    catch (Exception e)
    {
        return null;
    }

    return BTInterface;
}
4

2 回答 2

6

在 Android 4.2 中,他们更改了蓝牙堆栈实现。

“Android 4.2 引入了一种针对 Android 设备进行了优化的新蓝牙协议栈。谷歌和博通合作开发的新蓝牙协议栈取代了基于 BlueZ 的协议栈,并提供了更高的兼容性和可靠性。”

即使使用 Nexus 7 上的公共 api,也有很多与 bt 相关的事情。

于 2012-12-19T12:15:17.720 回答
2
 public boolean createBond(BluetoothDevice btDevice)  
        throws Exception  
        { 
            Class class1 = Class.forName("android.bluetooth.BluetoothDevice");
            Method createBondMethod = class1.getMethod("createBond");  
            Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);  
            return returnValue.booleanValue();  
    }

这适用于 4.2.1 Galaxy Nexus。没有在 Nexus 7 上尝试过,但是当我使用 IBluetooth 方法时,我遇到了同样的 MethodNotFoundException 问题。所以它也可能适用于 Nexus 7。

于 2013-01-15T21:48:49.583 回答