Android.bluetooth.IBluetooth.createBond() не найден в 4.2.1, но работает в более ранних версиях ОС

У меня есть код, который автоматически соединяется с устройством bluetooth, вызывая createBond(), регистрируя широковещательный приемник для android.bluetooth.device.action.PAIRING_REQUEST, а затем вручную вводит PIN-код для пары.

Это отлично работает со всеми проверенными до сих пор устройствами до Andoid 4.0, но сегодня я пробовал это на своем Nexus 7 с Android 4.2.1 и получил следующую ошибку:

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

Удалили ли они эту функцию из библиотеки?

UPDATE

То, что на самом деле происходит, - это объект интерфейса IBluetooth, который я использую для вызова createBond, не инициализируется. В следующем коде строка, которая пытается получить IBinder с именем BTBinder, возвращает значение null, когда этот процесс выходит из строя, в результате чего BTInterface будет иметь значение null в конце. Итак, теперь мой вопрос заключается в том, почему на моем Nexus 7 с Android 4.2.1 вызов, чтобы получить связующее, возвращает 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;
}

Ответ 1

В Android 4.2 они изменили реализацию пакета bluetooth.

"Android 4.2 представляет новый стек Bluetooth, оптимизированный для использования с устройствами Android. Новый стек Bluetooth, разработанный в сотрудничестве между Google и Broadcom, заменяет стек на основе BlueZ и обеспечивает улучшенную совместимость и надежность".

Есть много связанных с Bt вещей, которые не работают даже с публичным api на Nexus 7.

Ответ 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, но у меня была такая же проблема MethodNotFoundException, когда я использую метод IBluetooth. Поэтому он также может исправить и Nexus 7.