Из моего опыта (так как я также разрабатываю и поддерживаю приложение, которое подключается к Bluetooth-принтеру), соединение между устройством и устройством Bluetooth иногда может быть потеряно, хотя это действительно редко.Это ошибка, распространяющаяся между различными устройствами и версиями Android.
Что я в итоге сделал, так это принял возможность, что это может когда-нибудь произойти, и внедрил широковещательный приемник, чтобы получить уведомление о том, что соединение потеряно.В это время я снова создаю связь программно, а также подключаю принтер.
При попытке создать связь появляется диалоговое окно по умолчанию, в котором пользователь может ввести PIN-код, который использует принтер. Однако, поскольку я знаю PIN-код, я ввожу этот PIN-код программно, поэтому диалоговое окно просто отображается для разделениязатем исчезает.
После нескольких месяцев борьбы с этой проблемой это оказалось самым элегантным решением, которое я смог найти. Надеюсь, оно вам тоже поможет.
В onCreate
создайте фильтри зарегистрируйте получателя:
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(mReceiver, filter);
Метод вызова, когда вы хотите выполнить сопряжение с устройством:
private void pairDevice(BluetoothDevice device) {
try {
//Log.d("AutoPairing", "Start Pairing... with: " + device.getName());
device.createBond();
Log.d("AutoPairing", "Pairing finished.");
} catch (Exception e) {
Log.e("AutoPairing", e.getMessage());
}
}
Приемник вещания:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
}else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
}else if (BluetoothDevice.ACTION_FOUND.equals(action)){
}else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
}else if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
try {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// If you want to auto_insert the pin, uncomment the following lines
//String PinNew = "HereIsThePinThePrinterUses";
//device.setPin(PinNew.getBytes());
} catch (Exception e) {
Log.e("AutoPairing", "Error occurs when trying to auto pair");
e.printStackTrace();
}
}else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() == 12) {
// Pairing was succesful. Do what you would normally do after that. Perhaps connect the printer now.
} else {
// Pairing was unsuccesful. **This is also what get's triggered when the pairing is getting lost**. Let's pair the device then.
pairDevice(device);
}
}
}
};
Надеюсь, яне забывая что-нибудь.
PM: Все эти пустые if statements
есть на тот случай, если вы захотите подключить и принтер.Если вы сделаете это другим способом, вы можете удалить их и удалить эти действия из фильтра.