Сопряжение Bluetooth случайно удалено - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть приложение, которое работает на планшете Android 6.0, в котором используется Bluetooth-принтер Zebra iMZ220.Конечно, приложение требует сопряжения принтера с планшетом.

Время от времени принтер получает новый запрос на сопряжение с планшета, к которому он уже подключен, с конечным результатом:разрыв связи.

Мне не удалось определить точную причину этого, поскольку в журнале нет ошибок, и, похоже, это происходит случайно.

Я нашел эти строкикоторый, я думаю, должен сопрягать принтер:

Method method = device.getClass().getMethod("createBond", (Class[]) null);
method.invoke(device, (Object[]) null);

в последовательности

String printerMac = settings.getString("printerMac","");
if (!stampante.isEmpty()) {
    BluetoothDevice device = bluetoothAdapter.getRemoteDevice(stampante);
    try {
        Method method = device.getClass().getMethod("createBond", (Class[]) null);
        method.invoke(device, (Object[]) null);
    } catch (Exception e) {
        e.printStackTrace();    
    }
}

Может ли он по какой-то причине удалить скрепку на принтере, даже если он долженсделать наоборот?

Я не смог воспроизвести эту ошибку на устройстве Android 8.

1 Ответ

0 голосов
/ 25 сентября 2018

Из моего опыта (так как я также разрабатываю и поддерживаю приложение, которое подключается к 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 есть на тот случай, если вы захотите подключить и принтер.Если вы сделаете это другим способом, вы можете удалить их и удалить эти действия из фильтра.

...