2012-03-02 27 views
22

Tôi muốn biết sự kiện nào trong các thiết bị vật lý từ xa kích hoạt ACTION_ACL_CONNECTED và ACTION_ACL_DISCONNECTED trong thiết bị nghe. Kết quả kiểm tra của tôi không có ý nghĩa. Tôi đã thu thập được nhiều thiết bị trong vòng vài Decimét nhau:Điều gì kích hoạt chương trình phát sóng BluetoothDevice.ACTION_ACL?

một Galaxy Tab P7500 chạy Android 3.1

một chiếc điện thoại i5500 chạy Android 2.2

một WinXP PC với bluetooth USB dongle

hai tai nghe có nút bật/tắt

Trước tiên, tôi ghép đôi thủ công với tất cả các thiết bị từ Tab. Cả PC và điện thoại đều không được ghép nối với bất kỳ thiết bị nào khác ngoài Tab. (Một trong những tai nghe không bao giờ có thể được tìm thấy bởi các tab trong bất kỳ cách nào, nhưng nó có thể dễ dàng được tìm thấy từ điện thoại cả hai bằng tay và lập trình). Sau đó, tôi có một ứng dụng đơn giản để bắt đầu khám phá và nghe và hiển thị các chương trình phát sóng ACL. Và đây là những gì xảy ra (điều tương tự mọi thời gian, phù hợp của nó trong sự điên loạn của nó):

  • startDiscovery() từ Tab với tất cả các thiết bị hỗ trợ: - Các máy tính là thiết bị chỉ được tìm thấy
  • Disable bluetooth trên máy tính: - Không phản ứng trên tab
  • Bật bluetooth trên máy tính: - Không phản ứng trên điện Tab

  • đúng thời hạn 1 tai nghe: - ACTION_ACL_CONNECTED trên Tab

  • Power off tai nghe: - Không có phản ứng o n Tab
  • Bật tai nghe một lần nữa: - ACTION_ACL_DISCONNECTED và ACTION_ACL_CONNECTED liên tiếp nhanh chóng trên Tab

  • Disable bluetooth trên Tab: - Không phản ứng trên tab

  • Bật bluetooth trên Tab: - tai nghe ACTION_ACL_CONNECTED trên Tab

  • startDiscovery() từ điện thoại: - các máy tính là thiết bị duy nhất được tìm thấy bởi các điện thoại , mặc dù điện thoại chỉ được ghép nối với các Tab, không phải với PC. Nếu không, điện thoại chỉ phản ứng với tai nghe mà Tab không bao giờ phản ứng.

Điều gì tạo nên sự lộn xộn này? Không thể dựa vào thiết bị gây ra ACTION_ACL_CONNECT ngay cả khi thiết bị được ghép nối và tăng quyền trong phạm vi?

Sau đây là các phương pháp để BroadcastReceiver và các hoạt động onCreate, nhưng tôi không mong đợi chi tiết trong mã này vào vấn đề:

BroadcastReceiver intentReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
     if (device != null) { 
      name = device.getName(); 
     Log.v(TAG, "Device=" + device.getName()); 
     } 
     else { 
      name = "None"; 
     } 

     if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
      text1.setText(name + " connected " + (checkCounter++)); 
      Log.v(TAG, "connected: " + device); 
     } 
     else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { 
      text2.setText(name + " disconnected " + (checkCounter++)); 
     Log.v(TAG, "disconnected: " + device); 
     } 
     else if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      text3.setText(name + " found " + (checkCounter++)); 
     Log.v(TAG, "found: " + device + ""); 
     } 
     else if (blueAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { 
      text4.setText("Started " + (checkCounter++)); 
      Log.v(TAG, "Discovery started"); 
     } 
     else if (blueAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
      text4.setText("Finished " + (checkCounter++)); 
      Log.v(TAG, "Discovery finished"); 
     } 
    } 
}; 


public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.bluetoothlayout); 

    text1 = (TextView)findViewById(R.id.textView1); 
    text2 = (TextView)findViewById(R.id.textView2); 
    text3 = (TextView)findViewById(R.id.textView3); 
    text4 = (TextView)findViewById(R.id.textView4); 

    BluetoothDevice mw600 =   blueAdapter.getRemoteDevice("58:17:0C:EB:C5:08"); 
    BluetoothDevice bt500 =   blueAdapter.getRemoteDevice("00:1D:43:00:C4:54"); 
    BluetoothDevice galaxyTab = blueAdapter.getRemoteDevice("00:07:AB:6A:96:7D"); 
    BluetoothDevice pcDongle = blueAdapter.getRemoteDevice("00:15:83:4D:8B:57"); 

    intentFilter = new IntentFilter(); 
    intentFilter.addAction(BluetoothDevice.ACTION_FOUND); 
    intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); 
    intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); 
    intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_STARTED); 
    intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_FINISHED); 
    if (!isReceiverRegistered) { 
     registerReceiver(intentReceiver, intentFilter); 
     isReceiverRegistered = true; 
    } 
    if (!blueAdapter.isEnabled()) { 
     blueAdapter.enable(); 
    } 
    blueAdapter.startDiscovery(); 
} 

Trả lời

14

Tôi đang làm việc với android thực sự sai lầm BT trong một thời gian khá bây giờ ,

đây là những gì tôi có thể cho bạn biết:

ACTION_ACL_CONNECTED được gửi bất cứ khi nào kết nối thành công được thiết lập. Điều này là đơn giản như nó được.

Bây giờ phần khá khó chịu.

ACTION_ACL_DISCONNECTED được gửi bất cứ khi nào kết nối được đóng trên cấp HARDWARE. KHI điều đó xảy ra là một chút cho chính thiết bị đó. Nếu bạn ngắt kết nối/cắm thiết bị khác theo cách thủ công, bằng cách nào đó, nó không gửi tín hiệu "dude, im gone" tới droid, thay vì sau 20 giây, một số chú chó gác và kết nối đang bị đóng và ý định được gửi đi.

Bây giờ tôi đã thử chỉ với các thiết bị SPP mà tôi kết nối. Một tai nghe afaik đang tích cực kết nối bởi chính nó vì nó không SPP. Vì vậy, nó sẽ tự động kết nối với bạn, nếu bạn đang ghép nối và trong chế độ nghe. Bây giờ tôi không biết những gì tai nghe không nếu bạn "tắt nguồn". Có thể nó ngắt kết nối đúng cách hoặc có thể nó chỉ phá vỡ kết nối mà không nói lời tạm biệt. Trong trường hợp sau nó sẽ mất một thời gian cho cơ quan giám sát để ngắt kết nối từ phía droid, có thể mất từ ​​0 đến 20 giây, không hỏi tôi tại sao, nó chỉ là quan sát của tôi.

+0

agrre với bạn. Sau khi có thể kết nối 10 giây, phát lại diconnect được lưu trữ –

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