2013-06-18 15 views
30

Pracuję nad aplikacją, w której chcę podłączyć główne urządzenie Bluetooth. Nie chcę, aby użytkownik wprowadzał wymagany kod PIN, zamiast tego powinien sam to zrobić ... Ja nie. mieć jakiś problem związany z połączeniem ... Tylko chcesz wstawić i zakończyć proces uwierzytelniania przez samą aplikację.Jak sparować urządzenie Bluetooth programowo? Android

Znalazłem następujący kod Jestem pewien, że działa, ale nie wiesz, jak dodać pin w tym kodzie?

private void pairDevice(BluetoothDevice device) { 
     try { 
      Log.d("pairDevice()", "Start Pairing..."); 
      Method m = device.getClass().getMethod("createBond", (Class[]) null); 
      m.invoke(device, (Object[]) null); 
      Log.d("pairDevice()", "Pairing finished."); 
     } catch (Exception e) { 
      Log.e("pairDevice()", e.getMessage()); 
     } 
    } 

Czy ktoś wie, jak wprowadzić kod PIN w powyższym kodzie lub podobnego kodu rozwiązania problemu .. Dziękuję

+0

Może to ci pomoże. http://stackoverflow.com/questions/5885438/bluetooth-pairing-without-user-confirmation Cheers, –

+0

@ManolescuSebastian - Chcę stworzyć bezpieczne połączenie ... –

+0

Spróbuj moją odpowiedź. Mam nadzieję, że to działa dla ciebie –

Odpowiedz

3

Spróbuj kod:

public void pairDevice(BluetoothDevice device) 
{ 
    String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST"; 
    Intent intent = new Intent(ACTION_PAIRING_REQUEST); 
    String EXTRA_DEVICE = "android.bluetooth.device.extra.DEVICE"; 
    intent.putExtra(EXTRA_DEVICE, device); 
    String EXTRA_PAIRING_VARIANT = "android.bluetooth.device.extra.PAIRING_VARIANT"; 
    int PAIRING_VARIANT_PIN = 0; 
    intent.putExtra(EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(intent); 
} 

Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST); 
intent.putExtra(EXTRA_DEVICE, device); 
int PAIRING_VARIANT_PIN = 272; 
intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN); 
sendBroadcast(intent); 

Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS); 
startActivityForResult(intent, REQUEST_PAIR_DEVICE); 

Mam nadzieję, że to pomoże

referencyjny: http://pastebin.com/N8dR4Aa1

+0

Proszę mi pomóc .. ... Chcę listę urządzeń z włączoną obsługą BT i po kliknięciu na konkretne urządzenie Bluetooth, jest ono sparowane z naszym urządzeniem –

+2

Otrzymuję pierwszą metodę, ale co sugerujesz zrobić z pozostałymi dwoma blokami kodu? – gregm

1

Spróbuj tego,

BluetoothDevice device = intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); 
device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true); 
device.getClass().getMethod("cancelPairingUserInput", boolean.class).invoke(device); 
8

Tak, miałem na to pytanie, jeśli ktoś potrzebuje odpowiedź na to działa w Androidzie 4.4.2.

IntentFilter filter = new IntentFilter(
       "android.bluetooth.device.action.PAIRING_REQUEST"); 


     /* 
     * Registering a new BTBroadcast receiver from the Main Activity context 
     * with pairing request event 
     */ 
     registerReceiver(
       new PairingRequest(), filter); 

Kod dla odbiorcy.

public static class PairingRequest extends BroadcastReceiver { 
     public PairingRequest() { 
      super(); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals("android.bluetooth.device.action.PAIRING_REQUEST")) { 
       try { 
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        int pin=intent.getIntExtra("android.bluetooth.device.extra.PAIRING_KEY", 0); 
        //the pin in case you need to accept for an specific pin 
        Log.d("PIN", " " + intent.getIntExtra("android.bluetooth.device.extra.PAIRING_KEY",0)); 
        //maybe you look for a name or address 
        Log.d("Bonded", device.getName()); 
        byte[] pinBytes; 
        pinBytes = (""+pin).getBytes("UTF-8"); 
        device.setPin(pinBytes); 
        //setPairing confirmation if neeeded 
        device.setPairingConfirmation(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

I w pliku manifestu.

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

And the broadcastReceiver.

<receiver android:name=".MainActivity$PairingRequest"> 
       <intent-filter> 
        <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" /> 
        <action android:name="android.bluetooth.device.action.PAIRING_CANCEL" /> 
       </intent-filter> 
</receiver> 
1
BluetoothSocket bluetoothSocket = null; 
    try { 
     bluetoothSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(UUID_DIVING)); 
    } catch (IOException e) { 
     Log.i("Bluetooth", "IOException = " + e.getMessage()); 
     e.printStackTrace(); 
    } 

    try { 
     byte[] pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class).invoke(BluetoothDevice.class, "0000"); 
     Method m = device.getClass().getMethod("setPin", byte[].class); 
     m.invoke(device, (Object) pin); 
     device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true); 
    } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
     Log.i("Bluetooth", "IOException = " + e.getMessage()); 
     e.printStackTrace(); 
    } 

    try { 
     if (bluetoothSocket != null) { 
      bluetoothSocket.connect(); 
      Log.i("Bluetooth", "bluetoothSocket.connect() "); 
      InputStream inputStream = bluetoothSocket.getInputStream(); 
      OutputStream outputStream = bluetoothSocket.getOutputStream(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
0

Jak ustawić kod pin zostało odebrane powyżej (i to pomogło mi). Mimo to udostępniam poniższy prosty kod, który działa z systemem Android 6:

BluetoothAdapter mBTA = BluetoothAdapter.getDefaultAdapter(); 
if (mBTA.isDiscovering()) mBTA.cancelDiscovery(); 
mBTA.startDiscovery(); 
... 

/** In a broadcast receiver: */ 

if (BluetoothDevice.ACTION_FOUND.equals(action)) { // One device found. 

    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
    Log.d(TAG, "Start Pairing... with: " + device.getName()); 
    device.createBond(); 
} 

// If you want to auto-input the pin#: 
else if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)){ 

        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        device.setPin("1234".getBytes()); 
} 
Powiązane problemy