в настоящее время я пытаюсь настроить приложение, чтобы два устройства обменивались данными через Bluetooth.
У меня есть экран, показывающий одну Button
. При нажатии этой кнопки устройство должно обнаруживать и отключать кнопку. Когда устройство перестает обнаруживаться, кнопка должна быть включена снова.
Как предложено в руководстве Dev, я регистрирую BroadcastReceiver
для получения уведомления о завершении обнаружения.
Проблема:
Иногда я не получаю никакой трансляции, когда устройство больше не может быть обнаружено. С другой стороны, я обычно получаю 2 трансляции, отправленные при входе в открываемость. Обнаружение отлично работает, доказано LogCat и устройствами, которые видят мой телефон (HTC Desire HD) в течение 120 секунд.
Это запись из LogCat, показывающая 2 трансляции, которые принимаются сразу после начала обнаружения:
03-25 23:01:47.557: INFO/System.out(16905): --------broadcast received-------------
03-25 23:01:47.557: DEBUG/MuliplayerServerActivity(16905): current scan mode: 21
03-25 23:01:47.557: DEBUG/MuliplayerServerActivity(16905): previous scan mode: 23
03-25 23:01:47.557: INFO/System.out(16905): --------broadcast received-------------
03-25 23:01:47.557: DEBUG/MuliplayerServerActivity(16905): current scan mode: 23
03-25 23:01:47.557: DEBUG/MuliplayerServerActivity(16905): previous scan mode: 21
Мой код, начинающий обнаружение, следующий:
private void becomeVisible() {
Intent discoverableIntent = new Intent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(discoverableIntent,
CODE_REQUEST_MAKE_DISCOVERABLE);
}
Мой BroadcastReceiver
выглядит так:
private final BroadcastReceiver discoverableModeChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("--------broadcast received-------------");
int scanMode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,
0);
int scanModePrevious = intent.getIntExtra(
BluetoothAdapter.EXTRA_PREVIOUS_SCAN_MODE, 0);
Log.d(TAG, "current scan mode: " + scanMode);
Log.d(TAG, "previous scan mode: " + scanModePrevious);
if (scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
// show button
findViewById(R.id.btn_become_visible).setEnabled(false);
} else {
// hide button
findViewById(R.id.btn_become_visible).setEnabled(true);
}
}
};
Сначала необходимо зарегистрировать действие:
IntentFilter intent = new IntentFilter();
intent.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
intent.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
registerReceiver(discoverableModeChangedReceiver, intent);