2016-03-15 28 views
6

Sono in grado di accoppiare una tastiera Bluetooth ma non riesco a connettermi in modo da renderlo un dispositivo di input. Sono andato attraverso la documentazione fornita al sito degli sviluppatori - http://developer.android.com/guide/topics/connectivity/bluetooth.html#ProfilesCome associare e connettere a livello di codice un dispositivo bluetooth HID (tastiera Bluetooth) su Android

Si dice che l'API Bluetooth Android fornisce implementazioni per i seguenti profili Bluetooth, ma è possibile implementare l'interfaccia BluetoothProfile di scrivere le proprie classi per supportare un particolare profilo Bluetooth.

  • auricolare
  • A2DP
  • dispositivo di salute

Non v'è alcuna documentazione come implementare BluetoothProfile per il dispositivo Bluetooth HID (tastiera)

Android ha messo in atto in sé di connessione Bluetooth per dispositivi HID ma quelle API sono nascoste. Ho provato a riflettere anche per usarli. Non ricevo alcun errore, ma la tastiera non viene collegata come dispositivo di input. Questo è quello che ho fatto -

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

Sei riuscito a far funzionare una connessione HID? Sono bloccato con il problema che la versione Android più recente non ha il profilo HID bluetooth. Quale versione di Android hai usato? – DutchKevv

+0

@DutchKev - L'ho provato su Android 4.4.2 e come ho risposto di seguito non è possibile collegarlo programmaticamente. Inoltre non sono a conoscenza delle versioni Android più recenti se forniscono profilo HID bluetooth o meno. – Passiondroid

+0

Grazie o risposta. guarda il codice qui sotto .. Ho continuato a lavorare sullo stesso problema la scorsa notte, e ho fatto qualche passo in più .. Quando mi collego 'manualmente' tramite il normale gestore di connessione bluetooth Android .. Posso quindi, con la riflessione, creare un L2CAP presa bluetooth – DutchKevv

risposta

3

Per motivi di sicurezza, non è possibile per le applicazioni di terze parti per la connessione a una tastiera Bluetooth, come l'applicazione può essere un keylogger. Quindi può essere fatto solo manualmente dall'utente.

0

Ecco il codice che ho usato su Android Marshmallow (6,0) .. Per ottenere una connessione L2CAP iniziate (Necessario per 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; 
} 

Si può ancora avere problemi durante la creazione del Servizio, ed è necessario impostare il PSAM L2CAP corretto per il dispositivo, ma spero che possa essere d'aiuto ..

+0

Così sei in grado di connettere la tastiera bluetooth in modo programmatico su Android 6.0 – Passiondroid