2011-11-07 49 views
6

Tôi có thiết bị bluetooth có cấu hình SPP và phiên bản bluetooth 2.1.
Tôi có một ứng dụng kết nối với thiết bị đó và liên lạc với thiết bị đó. Thiết bị sử dụng kỹ thuật ghép nối "Chỉ hoạt động".Android bluetooth: Danh sách thiết bị được ghép nối

Tôi đang phải đối mặt với một vấn đề về điện thoại nhất định như Samsung Galaxy tablet, Galaxy S.

Vấn đề là sau khi thoát khỏi người dùng từ ứng dụng, tôi đang đóng ổ cắm và ngắt kết nối từ thiết bị. Sau khi ngắt kết nối thành công, nó được quan sát thấy rằng mục nhập của thiết bị được lấy ra khỏi danh sách các thiết bị ghép nối.

Trả lời

13

Tôi chưa từng làm việc với máy tính bảng, nhưng tôi đã viết một ứng dụng sử dụng SPP cho điện thoại Android. Điều tôi thấy là để có được Bluetooth ổn định, tôi phải liên kết thủ công với thiết bị mà tôi muốn liên lạc. Chúng tôi đã sử dụng mã bên dưới để bắt đầu liên kết từ bên trong ứng dụng và cần giữ lại liên kết giống như khi bạn ghép nối thủ công thông qua menu cài đặt.

Đây là dòng chảy chung: 1) Đăng ký một BroadcastReceiver để nghe cho BluetoothDevice.ACTION_BOND_STATE_CHANGED
2) Sau khi phát hiện thiết bị mà bạn nên có một đối tượng BluetoothDevice.
3) Sử dụng phản ánh để gọi phương thức 'createBond' trên BluetoothDeviceObject
3a) Chờ cho các sự kiện thay đổi trạng thái trái phiếu trước khi mở ổ cắm

BluetoothDevice device = {obtained from device discovery}; 
Method m = device.getClass().getMethod("createBond", (Class[])null); 
m.invoke(device, (Object[])null); 

int bondState = device.getBondState(); 
if (bondState == BluetoothDevice.BOND_NONE || bondState == BluetoothDevice.BOND_BONDING) 
{ 
    waitingForBonding = true; // Class variable used later in the broadcast receiver 

    // Also...I have the whole bluetooth session running on a thread. This was a key point for me. If the bond state is not BOND_BONDED, I wait here. Then see the snippets below 
    synchronized(this) 
    { 
     wait(); 
    } 
} 

4) Chờ cho tình trạng trái phiếu để thay đổi từ BOND_BONDING để BOND_BONDED

Bên trong một BroadcastReciever:

public void onReceive(Context context, Intent intent) 
{ 
    if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) 
    { 
     int prevBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1); 
     int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1); 

     if (waitingForBonding) 
     { 
      if (prevBondState == BluetoothDevice.BOND_BONDING) 
      { 
       // check for both BONDED and NONE here because in some error cases the bonding fails and we need to fail gracefully. 
       if (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_NONE) 
       { 
        // safely notify your thread to continue 
       } 
      } 
     } 
    } 
} 

5) socket mở và giao tiếp

Bạn cũng có thể sử dụng phương pháp 'removeBond' thông qua phản chiếu để xóa thiết bị của bạn khỏi danh sách ghép nối.

Hy vọng điều này sẽ hữu ích!

0

Nếu ghép nối xảy ra do kết nối ứng dụng của bạn, tôi đoán rằng một số thiết bị sẽ coi đó là ghép nối tạm thời và sẽ không giữ thiết bị trong danh sách được ghép nối sau khi ngắt kết nối. Để giữ thiết bị trong danh sách được ghép nối, bạn nên ghép nối thủ công thông qua menu cài đặt Bluetooth. Sau khi ghép nối chương trình của bạn có thể kết nối/ngắt kết nối và thiết bị sẽ tự giữ nguyên trong danh sách được ghép nối.

+0

Tôi sẽ xem xét chi tiết về hành vi ghép nối tạm thời này ở đâu; Tài liệu Android hoặc bluetooth 2.1 tài liệu đặc điểm kỹ thuật? Nếu đó là vấn đề Android, nó sẽ được tái sản xuất trên tất cả các điện thoại. Hoặc là nó liên quan đến việc thực hiện nhà sản xuất trên ngăn xếp bluetooth? – Ashwini

+0

Nhà sản xuất phụ thuộc vào tùy chọn mà nó cung cấp cho cặp/trái phiếu so với chỉ xác thực để kết nối tạm thời. Thông thường hành động rõ ràng để ghép nối (điều này cũng ngụ ý việc lưu thiết bị được ghép nối là thông qua bluetooth hệ thống - menu cài đặt) –

0

Tôi cũng gặp phải vấn đề tương tự với Sony Xperia X10. Tôi quản lý để làm cho nó "nhớ" các cặp bằng cách thay đổi các thiết lập mức độ bảo mật ở phía thiết bị bluetooth (như tôi đang phát triển các thiết bị cũng).

Tôi không chắc chắn về giải thích "ghép nối tạm thời", điều đó phụ thuộc vào nhà sản xuất, không có ý nghĩa gì khi các điện thoại khác nhau phản ứng khác với kết nối với cùng một thiết bị.

Tuy nhiên, đó là phần không thể tin được là một vấn đề đối với tôi. Thông thường, ngăn xếp Bluetooth dường như bị lỗi khi người dùng hủy ghép nối thiết bị trong khi ứng dụng được kết nối trong nền. Tôi vẫn chưa tìm ra cách quản lý sự kiện ACTION_BOND_STATE_CHANGED đúng cách.

+0

Bạn có thể cho tôi biết cài đặt mức bảo mật nào cần thiết để nhớ thiết bị trong danh sách thiết bị ghép nối không? Tôi có thể tái tạo điều này một cách dễ dàng trên máy tính bảng với android 3.0+, vì vậy tôi nghĩ rằng nó có liên quan đến phiên bản Android. – Ashwini

+0

Tôi đã thay đổi phần mềm thiết bị để trả lời đó là loại thiết bị "chỉ hiển thị" khi nhận được yêu cầu khai báo dung lượng I/O từ điện thoại (được đặt thành "không có đầu vào và không có đầu ra" trước đó). Thương lượng này là một phần của giao thức ghép đôi Bluetooth và được ghi lại trong thông số kỹ thuật Bluetooth, nhưng tôi không biết tại sao nó ảnh hưởng đến hành vi của điện thoại. –

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