2010-08-11 12 views
10

En Android 2.1, para desvincular un dispositivo Bluetooth, puede ir a la configuración de Bluetooth, hacer un clic largo en un dispositivo y seleccionar Desvincular para desvincular ese dispositivo. Quiero poder hacer esto desde mi aplicación. Puedo recuperar una lista de dispositivos paired/bonded utilizando BluetoothAdapter.getBondedDevices(), pero no puedo encontrar cómo deshacer la vinculación. Exploré el ejemplo de BluetoothChat y busqué el SDK, pero aún no puedo encontrar una API que lo permita.Cómo desvincular un dispositivo bluetooth usando android 2.1 sdk

¿Cómo puedo desvincular un dispositivo Bluetooth?

Respuesta

0

Es posible desvincular manualmente un dispositivo a través de droide java.

Puede invocar un método oculto para eliminar la unión.

+0

Puede que quiera hacer esta pregunta o buscar esta vista más, pero la sugerencia que tengo arriba es la forma en que encontré para desvincular programáticamente. Para desvincularlo manualmente, usa el programa Bluettooth que ya está en el teléfono. – JPM

11

Así es como se desvincula/elimina un dispositivo enlazado, llame a este método, donde macAddress es la cadena de la dirección MAC del dispositivo ... es decir. "00: 02: 00: A3: 03: 05"

IBluetooth ib =getIBluetooth(); 
ib.removeBond(macAddress); 

Para obtener el iBluetooth objeto que tiene que ir a través de un par de pasos

  1. crear un paquete en su proyecto llamado android.bluetooth
  2. crear dos archivos, IBluetooth.aidl y IBluetoothCallback.aidl
  3. método create en sus archivos llamado getBluetooth()

    private IBluetooth getIBluetooth() { 
    IBluetooth ibt = null; 
    
    try { 
    
        Class c2 = Class.forName("android.os.ServiceManager"); 
    
        Method m2 = c2.getDeclaredMethod("getService",String.class); 
        IBinder b = (IBinder) m2.invoke(null, "bluetooth"); 
    
        Class c3 = Class.forName("android.bluetooth.IBluetooth"); 
    
        Class[] s2 = c3.getDeclaredClasses(); 
    
        Class c = s2[0]; 
        Method m = c.getDeclaredMethod("asInterface",IBinder.class); 
        m.setAccessible(true); 
        ibt = (IBluetooth) m.invoke(null, b); 
    
    
    } catch (Exception e) { 
        Log.e("flowlab", "Erroraco!!! " + e.getMessage()); 
    } 
    
    return ibt; 
    } 
    

    /* ** * ** * ** * ** IBluetooth.aidl * ** * ** * ** * **/

    package android.bluetooth; 
    
    import android.bluetooth.IBluetoothCallback; 
    import android.os.ParcelUuid; 
    
    /** 
        * System private API for talking with the Bluetooth service. 
        * 
        * {@hide} 
        */ 
    interface IBluetooth 
    { 
        boolean isEnabled(); 
        int getBluetoothState(); 
        boolean enable(); 
        boolean disable(boolean persistSetting); 
    
        String getAddress(); 
        String getName(); 
        boolean setName(in String name); 
    
        int getScanMode(); 
        boolean setScanMode(int mode, int duration); 
    
        int getDiscoverableTimeout(); 
        boolean setDiscoverableTimeout(int timeout); 
    
        boolean startDiscovery(); 
        boolean cancelDiscovery(); 
        boolean isDiscovering(); 
    
        boolean createBond(in String address); 
        boolean cancelBondProcess(in String address); 
        boolean removeBond(in String address); 
        String[] listBonds(); 
        int getBondState(in String address); 
    
        String getRemoteName(in String address); 
        int getRemoteClass(in String address); 
        ParcelUuid[] getRemoteUuids(in String address); 
        boolean fetchRemoteUuids(in String address, in ParcelUuid uuid, in IBluetoothCallback callback); 
        int getRemoteServiceChannel(in String address, in ParcelUuid uuid); 
    
        boolean setPin(in String address, in byte[] pin); 
        boolean setPasskey(in String address, int passkey); 
        boolean setPairingConfirmation(in String address, boolean confirm); 
        boolean cancelPairingUserInput(in String address); 
    
        boolean setTrust(in String address, in boolean value); 
        boolean getTrustState(in String address); 
    
        int addRfcommServiceRecord(in String serviceName, in ParcelUuid uuid, int channel, IBinder b); 
        void removeServiceRecord(int handle); 
    } 
    

/* ** * ** * ** * ** IBluetoothCallback.aidl * ** * ** * ** * **/

package android.bluetooth; 

    /** 
    * System private API for Bluetooth service callbacks. 
    * 
    * {@hide} 
    */ 
    interface IBluetoothCallback 
    { 
     void onRfcommChannelFound(int channel); 
    } 
+0

¿podría compartir este paquete en un archivo zip? –

+0

Disculpa por ignorancia pero no entiendo el punto 3) "¿crear método en tus archivos llamado getBluetooth()"? Donde es eso ? ¿Por qué obtengo un "no puedo resolver el símbolo IBluetooth" –

+0

Lol Escribí esto hace 6 años ...Ya no recuerdo los puntos más finos. Lo más probable es que su IBlueTooth.aidl no esté en el lugar correcto o no se haya importado en el script de compilación. – JPM

3

Otra forma:

public void clear(View v) { 
    Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices(); 
    try { 
     Class<?> btDeviceInstance = Class.forName(BluetoothDevice.class.getCanonicalName()); 
     Method removeBondMethod = btDeviceInstance.getMethod("removeBond"); 
     String currentMac = getCurrentMAC(); 
     boolean cleared = false; 
       for (BluetoothDevice bluetoothDevice : bondedDevices) { 
      String mac = bluetoothDevice.getAddress(); 
      if(mac.equals(currentMac)) { 
       removeBondMethod.invoke(bluetoothDevice); 
       Log.i(TAG,"Cleared Pairing"); 
       cleared = true; 
       break; 
      } 
     } 

       if(!cleared) { 
      Log.i(TAG,"Not Paired"); 
       } 
    } catch (Throwable th) { 
     Log.e(TAG, "Error pairing", th); 
    } 
} 
+1

Gracias! ¡Esto funciono muy bien para mi! ¿Dónde se define el método "removeBond (BluetoothDevice device)"? ¿Por qué tenemos que invocar la reflexión para llamar a esto? – ossys

Cuestiones relacionadas