2011-09-07 37 views
40

Tôi có một ứng dụng mà tôi đang điều khiển theo chương trình ghép nối Bluetooth và hủy ghép nối. Tôi có thể ghép nối trước khi kết nối và hủy ghép nối sau đó. Lý do tôi cần thực hiện điều này là cụ thể đối với đơn đăng ký của tôi chứ không phải trong phạm vi câu hỏi của tôi.Làm cách nào để tránh hoặc loại bỏ thông báo ghép nối Bluetooth của Android khi tôi đang thực hiện ghép nối có lập trình?

Về cơ bản những gì tôi đang làm là:

  1. Nhận một tài liệu tham khảo ib để IBluetooth đối tượng như mô tả trong this answer
  2. Đăng ký một BroadcastReceiver cho android.bluetooth.device.action.PAIRING_REQUEST
  3. Gọi ib.createBond(address)
  4. Chờ BroadcastReceiver để kích hoạt
  5. Chuyển đổi pin người dùng thành byte với convertPinToBytes()
  6. Gọi ib.setPin(address, pinBytes) từ bên trong BroadcastReceiver

Anyways, phương pháp này hoạt động tuyệt vời, ngoại trừ một thực tế rằng khi tôi làm ghép nối, tôi nhận được một thông báo trong thanh Status yêu cầu mà người dùng nhập mã PIN để hoàn thành ghép nối. Nhưng điều này thực tế là không cần thiết, bởi vì khi người dùng thấy điều này, ứng dụng của tôi đã sử dụng setPin(). Tôi thực sự muốn cho thông báo đó hoặc a) không xuất hiện ở tất cả, hoặc b) được loại bỏ tự động bằng cách nào đó.

Tôi nhận ra điều này thậm chí không thể, nhưng tôi nghĩ tôi sẽ hỏi trong trường hợp ai đó có ý tưởng sáng tạo.

+1

Bạn có thể vui lòng thêm một số mã mẫu (hoặc liên kết tới mã nguồn của bạn) không. Điều tôi muốn làm thực sự giống như bạn. Tôi muốn kết nối với thiết bị không có yêu cầu mật khẩu. Trân trọng, Jeroen – Jeroen

+1

Tôi không thể chia sẻ mã nguồn của mình một cách không may, nhưng bước từng bước mà tôi có ở trên rất gần với mã thực tế. Bạn có thể bắt đầu với mã nguồn trong câu trả lời tôi liên kết đến ở Bước 1. –

+0

@ JoelF bạn đã giải quyết được vấn đề của mình chưa? Bởi vì tôi không. Thực sự đánh giá cao nếu bạn có thể chia sẻ cách bạn giải quyết, nếu đó là trường hợp. – Tiago

Trả lời

1

Làm điều này trong trường hợp thông báo PAIRING_REQUEST:

BluetoothDevice localBluetoothDevice = (BluetoothDevice)intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); 

Class localClass = localBluetoothDevice.getClass(); 
Class[] arrayOfClass = new Class[0]; 
localClass.getMethod("cancelPairingUserInput", arrayOfClass).invoke(paramBluetoothDevice, null)).booleanValue(); 

Nhưng bạn gotta cho tôi biết làm thế nào bạn ghép thiết bị điều khiển từ xa mà không cần người dùng phải nhập mã xác nhận/PIN? tắt khóa học, bạn biết mã PIN cho thiết bị từ xa đang cố ghép nối với thiết bị của bạn nhưng làm cách nào bạn cung cấp mã PIN đó cho thiết bị từ xa.

+0

Thú vị, hãy để tôi thử. Tôi đã cập nhật câu trả lời của mình để cụ thể hơn một chút về cách tôi đã thực hiện ghép nối có lập trình mà không có sự tương tác của người dùng. Hy vọng rằng sẽ giúp. –

+0

Bạn có thể giải thích chính xác paramBluetoothDevice là gì không? – Tiago

14

Hãy thử thiết lập thư xác nhận đầu tiên trong PAIRING_REQUEST

BluetoothDevice device = intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); 

device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true); 
device.getClass().getMethod("cancelPairingUserInput").invoke(device); 

này làm việc cho tôi giữa hai thiết bị Android sử dụng RFCOMM nhưng tôi không tham gia bất kỳ mã PIN

+0

Là một lưu ý phụ, gọi hàm cancelPairingUserInput không cần thiết trong các thử nghiệm của tôi. – domsom

+1

Điều này không hoạt động. Nếu tôi sử dụng mã này quá trình ghép nối không bắt đầu và tôi nhận được thông báo lỗi rằng không có phương pháp nào được gọi là 'cancelPairingUserInput' – Mulgard

+0

Tôi vừa nhận thấy rằng điều này cũng hoạt động để ngăn chặn yêu cầu ghép nối gây phiền toái khi kết nối với các thiết bị đã ghép nối trên một số mẫu máy chạy các phiên bản Android mới nhất (GT-I9295, Android 4.4.2) – dhakim

9

Kể từ Android API 19 Google chuyển sang những phương pháp để phương pháp công cộng, vì vậy không cần phải phản ánh nữa. :)

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