2015-08-06 32 views
5

Tôi đang viết một ứng dụng Android mà tôi muốn liên kết theo chương trình với thiết bị BLE tùy chỉnh. Tôi có liên kết thủ công trong đó người dùng nhập mã PIN bằng hộp thoại ghép nối Android Bluetooth chuẩn, nhưng tôi không thể tìm thấy bất kỳ thông tin nào về cách tự động liên kết thiết bị BLE theo chương trình mà không cần sự can thiệp của người dùng. Điều đó có thể không? Nếu vậy, quy trình là gì?Liên kết lập trình với thiết bị BLE trên Android

Trả lời

-1

Tất cả những gì bạn có thể làm để tránh tương tác của người dùng là bắt buộc ghép nối Hoạt động. Để làm điều đó, hãy lập trình thiết bị ngoại vi để chấp nhận ghép nối với khả năng IO của NoInputNoOutput.

2

Tôi đã có thể thực hiện công việc này KHUYẾT TẬT CỦA THỜI GIAN bằng cách đăng ký một BroadcastReceiver để nhận ý định BluetoothDevice.ACTION_BOND_STATE_CHANGED và sau đó gọi BluetoothDevice.setPin sau khi nhận được thông báo BluetoothDevice.BOND_BONDING. Như trường hợp với hầu hết các thứ BLE trong Android, điều này dường như hoạt động hơi khác nhau tùy thuộc vào thiết bị và phiên bản Android. Thật không may, tôi dường như không thể ngăn Android cũng nhận được ý định bluetooth, vì vậy màn hình nhập mã PIN vẫn bật lên trong một giây trước khi liên kết hoàn tất.

private final BroadcastReceiver mReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      final String action = intent.getAction(); 
      Logger("Broadcast Receiver:" + action); 

      if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) 
      { 
       final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); 

       if(state == BluetoothDevice.BOND_BONDING) 
       { 
        Logger("Bonding..."); 
        if (mDevice != null) { 
         mDevice.setPin(BONDING_CODE.getBytes()); 
         Logger("Setting bonding code = " + BONDING_CODE); 
        } 
       } 
       else if(state == BluetoothDevice.BOND_BONDED) 
       { 
        Logger("Bonded!!!"); 
        mOwner.unregisterReceiver(mReceiver); 
       } 
       else if(state == BluetoothDevice.BOND_NONE) 
       { 
        Logger("Not Bonded"); 
       } 
      } 
     } 
    }; 
+0

Hóa ra bạn không muốn 'ACTION_BOND_STATE_CHANGE'. Xem [câu trả lời khác của tôi] (http://stackoverflow.com/a/38241240/265521). – Timmmm

1

Tôi đã làm được điều này - xem câu trả lời của tôi here.

TL; DR là: quên khoảng ACTION_BOND_STATE_CHANGED; bạn không cần nó. Thay vào đó, hãy nghe theo số ACTION_PAIRING_REQUESTđặt mức độ ưu tiên cao. Trong bộ thu phát sóng khi bạn nhận được ACTION_PAIRING_REQUEST, hãy gọi setPin() bằng mã PIN và sau đó abortBroadcast() để ngăn hệ thống hiển thị thông báo.

Các vấn đề liên quan