Cómo emparejar y conectar mediante programación un dispositivo Bluetooth HID (teclado Bluetooth) en Android

Puedo emparejar un teclado bluetooth pero no puedo conectarlo para convertirlo en un dispositivo de entrada. Revisé la documentación proporcionada en el sitio del desarrollador:http://developer.android.com/guide/topics/connectivity/bluetooth.html#Profiles

Dice que la API Bluetooth de Android proporciona implementaciones para los siguientes perfiles Bluetooth, pero puede implementar la interfaz BluetoothProfile para escribir sus propias clases para admitir un perfil Bluetooth particular.

AuricularesA2DPDispositivo de salud

No hay documentación sobre cómo implementar BluetoothProfile para el dispositivo Bluetooth HID (teclado)

Android mismo implementó una conexión bluetooth para dispositivos HID, pero esas API están ocultas. Intenté reflexionar para usarlos también. No recibo ningún error, pero el teclado no se conecta como dispositivo de entrada. Esto es lo que he hecho.

private void connect(final BluetoothDevice bluetoothDevice) {
    if(bluetoothDevice.getBluetoothClass().getDeviceClass() == 1344){
        final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
                @Override
                public void onServiceConnected(int profile, BluetoothProfile proxy) {
                    Log.i("btclass", profile + "");

                    if (profile == getInputDeviceHiddenConstant()) {
                        Class instance = null;
                        try {
                            //instance = Class.forName("android.bluetooth.IBluetoothInputDevice");
                            instance = Class.forName("android.bluetooth.BluetoothInputDevice");
                            Method connect = instance.getDeclaredMethod("connect", BluetoothDevice.class);
                            Object value = connect.invoke(proxy, bluetoothDevice);
                            Log.e("btclass", value.toString());
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        } catch (InvocationTargetException e) {
                            e.printStackTrace();
                        } catch (NoSuchMethodException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }



                    }
                }

                @Override
                public void onServiceDisconnected(int profile) {

                }
            };

            mBluetoothAdapter.getProfileProxy(this, mProfileListener,getInputDeviceHiddenConstant());


    }

}

public static int getInputDeviceHiddenConstant() {
    Class<BluetoothProfile> clazz = BluetoothProfile.class;
    for (Field f : clazz.getFields()) {
        int mod = f.getModifiers();
        if (Modifier.isStatic(mod) && Modifier.isPublic(mod) && Modifier.isFinal(mod)) {
            try {
                if (f.getName().equals("INPUT_DEVICE")) {
                    return f.getInt(null);
                }
            } catch (Exception e) {
                Log.e("", e.toString(), e);
            }
        }
    }
    return -1;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta