2016-03-15 2 views
6

Je peux coupler un clavier Bluetooth mais je n'arrive pas à me connecter pour en faire un périphérique d'entrée. Je suis passé par la documentation fournie sur le site des développeurs - http://developer.android.com/guide/topics/connectivity/bluetooth.html#ProfilesComment connecter et connecter par programme un périphérique Bluetooth HID (clavier Bluetooth) sur Android

Il dit que l'API Android Bluetooth fournit des implémentations pour les profils Bluetooth suivants mais vous pouvez implémenter l'interface BluetoothProfile pour écrire vos propres classes pour soutenir un profil Bluetooth particulier.

  • Casque
  • A2DP
  • Appareil de santé

Il n'y a pas de documentation comment implémenter BluetoothProfile pour périphérique Bluetooth HID (clavier)

Android lui-même a mis en place une connexion Bluetooth pour les périphériques HID mais ces API sont cachés. J'ai essayé la réflexion pour les utiliser aussi. Je ne reçois aucune erreur mais le clavier ne se connecte pas en tant que périphérique d'entrée. C'est ce que je l'ai fait -

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; 
} 
+0

Avez-vous réussi à obtenir une connexion HID fonctionnant? Je suis bloqué avec le problème que la nouvelle version Android n'a pas le profil Bluetooth HID. Quelle version Android avez-vous utilisée? – DutchKevv

+0

@DutchKev - Je l'ai essayé sur Android 4.4.2 et comme je l'ai répondu ci-dessous, vous ne pouvez pas le connecter par programmation. Aussi, je ne suis pas au courant des nouvelles versions Android, qu'ils fournissent ou non le profil HID bluetooth. – Passiondroid

+0

Merci ou répondre. voir le code ci-dessous .. J'ai continué à travailler sur le même problème la nuit dernière, et a obtenu quelques étapes plus loin .. Quand je me connecte pour la première fois 'manuellement' par le biais du gestionnaire de connexion Android normal .. Je peux alors, avec réflexion, créer un L2CAP prise bluetooth – DutchKevv

Répondre

3

Pour des raisons de sécurité, il est impossible pour des applications tierces de se connecter à un clavier Bluetooth que l'application peut être un keylogger. Donc, cela ne peut être fait que manuellement par l'utilisateur.

0

Voici le code je sur Android Marshmallow (6.0) .. Pour obtenir une connexion L2CAP Démarrage rapide (nécessaire pour HID)

public static BluetoothSocket createL2CAPBluetoothSocket(String address, int psm){ 
    return createBluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, false,false, address, psm); 
} 

// method for creating a bluetooth client socket 
private static BluetoothSocket createBluetoothSocket(int type, int fd, boolean auth, boolean encrypt, String address, int port){ 
    Log.e(TAG, "Creating socket with " + address + ":" + port); 

    try { 
     Constructor<BluetoothSocket> constructor = BluetoothSocket.class.getDeclaredConstructor(
       int.class, int.class,boolean.class,boolean.class,String.class, int.class); 
     constructor.setAccessible(true); 
     BluetoothSocket clientSocket = (BluetoothSocket) constructor.newInstance(type,fd,auth,encrypt,address,port); 
     return clientSocket; 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

public Boolean connect(View v) { 

    try { 
     // TODO: Check bluetooth enabled 
     mDevice = getController(); 

     if (mDevice != null) { 
      Log.e(TAG, "Controller is paired"); 

      // Create socket 
      mSocket = createL2CAPBluetoothSocket(mDevice.getAddress(), 0x1124); 

      if (mSocket != null) { 

       if (!mSocket.isConnected()) { 
        mSocket.connect(); 
       } 

       Log.e(TAG, "Socket successfully created"); 

       ConnectedThread mConnectedThread = new ConnectedThread(mSocket); 
       mConnectedThread.run(); 
      } 

     } else { 
      showToast("Controller is not connected"); 
     } 

     return true; 

    } catch (Exception e) { 
     e.printStackTrace(); 

     if (e instanceof IOException){ 
      // handle this exception type 
     } else { 
      // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy. 

     } 

     return false; 
    } 
} 

private BluetoothDevice getController() { 
    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 

    if (pairedDevices.size() > 0) { 
     for (BluetoothDevice device : pairedDevices) { 
      if (device.getName().equals("Wireless Controller")) // Change to match DS4 - node name 
      { 
       Log.d(TAG, "Found device named: " + device.getName()); 

       return device; 
      } 
     } 
    } 

    return null; 
} 

Il peut encore avoir des problèmes pour créer le service, et vous devez définir le PSAM L2CAP correct pour le périphérique, mais espérons qu'il peut aider ..

+0

Vous êtes donc capable de connecter le clavier Bluetooth sur Android 6.0 – Passiondroid