2012-02-27 24 views
8

Tôi muốn nghe kết nối/ngắt kết nối với một số thiết bị bluetooth cụ thể có địa chỉ MAC mà tôi biết, nhưng không nhất thiết phải ghép nối (tôi không muốn gây rối với danh sách thiết bị được ghép nối của người dùng và ngược lại). Tôi chỉ quan tâm đến việc khám phá sự hiện diện của họ, không giao tiếp với họ.Cách xác định * thiết bị bluetooth nào gây ra phát sóng ACTION_ACL_CONNECTED?

Điều này hoạt động rất tốt với mã của tôi bên dưới! Nhưng vấn đề của tôi là tôi không thể tìm ra thiết bị cụ thể nào đang kết nối/ngắt kết nối, chỉ có nó xảy ra với một người nào đó. Làm thế nào tôi có thể tìm ra hành động nào liên quan đến hành động nào?

Trước tiên tôi nhanh chóng đối tượng cho hai thiết bị bluetooth vật lý cụ thể của tôi và thêm chúng vào bộ lọc ý định của tôi:

BluetoothDevice myPinkHeadset = mBluetoothAdapter.getRemoteDevice("18:17:0C:EB:9C:81"); 
    BluetoothDevice myPcBluetoothDongle = mBluetoothAdapter.getRemoteDevice("5A:7A:CC:4B:C5:08"); 

    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(myPinkHeadset.ACTION_ACL_CONNECTED); 
    intentFilter.addAction(myPinkHeadset.ACTION_ACL_DISCONNECTED); 
    intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_CONNECTED); 
    intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_DISCONNECTED); 

Sau đó, tôi lắng nghe chương trình phát sóng về họ:

final BroadcastReceiver intentReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

Bây giờ tôi muốn tìm cái nào đã được kết nối và/hoặc ngắt kết nối, và tôi không thấy làm thế nào tôi có thể làm điều đó.

Hoặc 1) Tôi sử dụng "BluetoothDevice" trực tiếp. Nó phản ứng với chương trình phát sóng, nhưng nó không nói cho tôi biết về hai thiết bị vật lý mà hành động liên quan. Là cách của họ để tìm hiểu? Không được phép sử dụng Bluetooth.getName() vì đây không phải là lớp tĩnh.

if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
     } 

hoặc 2) Tôi lắng nghe cả hai hành động cho cả hai thiết bị.

 if (myPinkHeadset .ACTION_ACL_CONNECTED.equals(action)) { 
      Log.v(TAG, "Connected to myPinkHeadset "); 
     } 
     else if (myPinkHeadset .ACTION_ACL_DISCONNECTED.equals(action)) { 
      Log.v(TAG, "Disconnected from myPinkHeadset "); 
     } 
     else if (myPcBluetoothDongle .ACTION_ACL_CONNECTED.equals(action)) { 
      Log.v(TAG, "Connected to myPcBluetoothDongle "); 
     } 
     else if (myPcBluetoothDongle .ACTION_ACL_DISCONNECTED.equals(action)) { 
      Log.v(TAG, "Disconnected from myPcBluetoothDongle "); 

Nhưng sau đó nó ghi nhật ký kết nối với myPinkHeadset ngay cả khi nó là myPvBluetoothDongle tôi kích hoạt vật lý. Nó luôn luôn đi cho một trong đó đến đầu tiên của các xét nghiệm nếu. Nó chỉ quan tâm đến hành động, không phải về đối tượng mà nó quan tâm.

Tôi thấy rằng EXTRA_DEVICE là "Được sử dụng làm trường bổ sung Bluetooth có thể kiện trong mọi mục đích được phát bởi lớp này". Nhưng nó chỉ trả về null với tôi:

String extra = intent.getStringExtra(BluetoothDevice.EXTRA_DEVICE); 

Trả lời

14

Điều này cho phép các thiết bị kết nối:

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

Là một newbie, tôi hiểu lầm khái niệm parcelable. EXTRA_DEVICE là một String, nhưng nó chỉ là một thẻ cho đối tượng. Vì vậy, không cần phải đăng ký hoặc nghe từng cá thể của BluetoothDevice. Khi một hành động được phát, ý định sẽ cho biết thiết bị vật lý nào gây ra nó. (Tôi có thể +1 bản thân mình cho :-D này)

+0

đã phạm sai lầm tương tự với bưu kiện, Chuỗi gây nhầm lẫn – NikkyD

1
intentFilter.addAction(myPinkHeadset.ACTION_ACL_CONNECTED); 
intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_CONNECTED); 

intentFilter.addAction(myPinkHeadset.ACTION_ACL_DISCONNECTED); 
intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_DISCONNECTED); 

là những giá trị như nhau. Đó là giá trị tĩnh. BluetoothDevice.ACTION_ACL_CONNECTED và BluetoothDeviceACTION_ACL_DISCONNECTED

private void register() { 
    context.registerReceiver(bluetoothBroadCast, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED)); 
    context.registerReceiver(bluetoothBroadCast, new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED)); 
} 

private final BroadcastReceiver bluetoothBroadCast = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    switch (action) { 
     case BluetoothDevice.ACTION_ACL_CONNECTED: { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      if(device.getAddress().equals(myPinkHeadset.getAddress)) { 
       //Do what you want 
      } 
      break; 
     } 

     case BluetoothDevice.ACTION_ACL_DISCONNECTED: { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      break; 
     } 
    } 
} 

};

Tôi hy vọng điều này có thể giúp bạn

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