Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

BroadcastReceiver не определяет включённый Bluetooth при включении из области уведомлений

#java #android #bluetooth


Имеется код:

brEnableBt = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(action)) {
            int scanStatus = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, 0);
            Log.d(TAG, String.valueOf(scanStatus));
            if (scanStatus == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
                checkBluetooth.setChecked(true);
                checkBluetooth.setClickable(false);
            } else {
                checkBluetooth.setChecked(false);
                checkBluetooth.setClickable(true);
            }
        }
    }
};
IntentFilter edBtBrIntent = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
registerReceiver(brEnableBt, edBtBrIntent);


Он должен отлавливать состояние Bluetooth "включён, видим".
Если включать Bluetooth через настройки, то всё нормально.
Но если я включаю Bluetooth из области уведомлений, то ничего не случается. В логи
ничего не пишется. Зато при отключении записывается статус "отключен" (20). Что с этим
делать?
    


Ответы

Ответ 1



После непродолжительного гугления придумал вот такое решение: brEnableBt = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0); Log.d(TAG, String.valueOf(state)); if (state == BluetoothAdapter.STATE_ON) { adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter.getScanMode() == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { checkBluetooth.setChecked(true); checkBluetooth.setClickable(false); } else { checkBluetooth.setChecked(false); checkBluetooth.setClickable(true); } //Toast.makeText(context, "Bluetooth is enabled", Toast.LENGTH_LONG).show(); } else { checkBluetooth.setChecked(false); checkBluetooth.setClickable(true); //Toast.makeText(context, "Bluetooth is disabled", Toast.LENGTH_LONG).show(); } } } }; Решение вроде бы работает. Но есть одно но. При изменении состояния видимости уже включённого блютуза отметка у чекбокса опять же не меняется. UPD: Интересная вещь получается. Если использовать код из вопроса, то он будет работать как раз при изменении видимости включённого блютуза. Если использовать код из моего ответа, то он будет определять видимость при включении блютуза. Следовательно, эти два решения надо совместить. UPD2: Разобрался. Перепробовал разные способы, сработал вот такой: зарегистрировать два разных ресивера на включение и на смену статуса. Правда, похоже, оперативку они будут жрать за милую душу...

Комментариев нет:

Отправить комментарий