Intereting Posts
Фрагмент onSaveInstanceState () никогда не вызывается Задать список из JSON Вызывается onResume () перед onActivityResult ()? Шифрование и дешифрование между Android, PHP и node.js Служба не останавливается при вызове метода stopService Как управлять состоянием пользовательского интерфейса и задним стеком в макете с одним / двумя панелями Видеофрагмент не отображается на фрагменте Как запускать службу каждый день в полдень и при каждой загрузке Остановить событие touch от перехвата ViewPager, если в веб-просмотре есть событие touch Как настроить параметры сухого хода и уровня журнала через XML в Google Analytics v4 SDK для Android? Ошибка компиляции студии Android «Содержимое не допускается в прологе» Начать распознавание речи через голос фразой типа «О'кей, Google»? Почему getView возвращает неверные объекты convertView в SeparatedListAdapter? Идентификаторы ресурсов Android Вставка или обновление Android SQLite

Что инициирует вещание BluetoothDevice.ACTION_ACL?

Я хотел бы знать, какие события в удаленных физических устройствах вызывают ACTION_ACL_CONNECTED и ACTION_ACL_DISCONNECTED в прослушивающем устройстве. Мои результаты не имеют смысла. Я собрал несколько устройств в нескольких дециметрах друг от друга:

Galaxy Tab P7500 под управлением Android 3.1

Телефон i5500 под управлением Android 2.2

ПК winXP с USB-ключ Bluetooth

Две гарнитуры с кнопками включения / выключения

Во-первых, я пару вручную со всеми устройствами из Tab. Ни ПК, ни телефон не соединены ни с каким другим устройством, кроме Tab. (Одна из гарнитур никогда не может быть найдена вкладкой каким-либо образом, но ее можно легко найти с телефона как вручную, так и программно). Затем у меня есть простое приложение для начала обнаружения и которое прослушивает и отображает трансляции ACL. И это то, что происходит (одно и то же, каждый раз, в соответствии с его безумием):

  • StartDiscovery () из Tab со всеми включенными устройствами: – ПК является единственным найденным устройством
  • Отключить bluetooth на ПК: – Отсутствие реакции на вкладке
  • Включить bluetooth на ПК: – Отсутствие реакции на вкладке

  • Включить гарнитуру в первый раз: – ACTION_ACL_CONNECTED на вкладке

  • Отключите гарнитуру: – Отсутствие реакции на вкладке
  • Снова включите гарнитуру: ACTION_ACL_DISCONNECTED и ACTION_ACL_CONNECTED в быстрой последовательности на вкладке

  • Отключить bluetooth на вкладке: – Отсутствие реакции на вкладке

  • Включить bluetooth на вкладке: – Гарнитура ACTION_ACL_CONNECTED на вкладке

  • StartDiscovery () с телефона: – ПК является единственным устройством, найденным телефоном, хотя телефон только в паре с вкладкой, а не с ПК. В противном случае телефон реагирует только на гарнитуру, на которую Tab никогда не реагирует.

Что из этого беспорядка? Нельзя ли полагаться на устройство, вызывающее ACTION_ACL_CONNECT, даже если оно сопряжено и включено в пределах диапазона?

Вот методы BroadcastReceiver и действия onCreate, но я не ожидаю, что детали этого кода будут иметь значение:

BroadcastReceiver intentReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device != null) { name = device.getName(); Log.v(TAG, "Device="+device.getName()); } else { name = "None"; } if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { text1.setText(name+" connected "+(checkCounter++)); Log.v(TAG, "connected: "+device); } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { text2.setText(name+" disconnected "+(checkCounter++)); Log.v(TAG, "disconnected: "+device); } else if (BluetoothDevice.ACTION_FOUND.equals(action)) { text3.setText(name+" found "+(checkCounter++)); Log.v(TAG, "found:"+device+"); } else if (blueAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { text4.setText("Started "+(checkCounter++)); Log.v(TAG, "Discovery started"); } else if (blueAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { text4.setText("Finished "+(checkCounter++)); Log.v(TAG, "Discovery finished"); } } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bluetoothlayout); text1 = (TextView)findViewById(R.id.textView1); text2 = (TextView)findViewById(R.id.textView2); text3 = (TextView)findViewById(R.id.textView3); text4 = (TextView)findViewById(R.id.textView4); BluetoothDevice mw600 = blueAdapter.getRemoteDevice("58:17:0C:EB:C5:08"); BluetoothDevice bt500 = blueAdapter.getRemoteDevice("00:1D:43:00:C4:54"); BluetoothDevice galaxyTab = blueAdapter.getRemoteDevice("00:07:AB:6A:96:7D"); BluetoothDevice pcDongle = blueAdapter.getRemoteDevice("00:15:83:4D:8B:57"); intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_STARTED); intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_FINISHED); if (!isReceiverRegistered) { registerReceiver(intentReceiver, intentFilter); isReceiverRegistered = true; } if (!blueAdapter.isEnabled()) { blueAdapter.enable(); } blueAdapter.startDiscovery(); } 

Solutions Collecting From Web of "Что инициирует вещание BluetoothDevice.ACTION_ACL?"

Я работаю с андроидами, которые действительно перепутались в течение довольно долгого времени,

Вот что я могу вам сказать:

ACTION_ACL_CONNECTED отправляется всякий раз, когда было установлено успешное соединение. Это так же просто, как и получается.

Сейчас довольно раздражающая часть.

ACTION_ACL_DISCONNECTED отправляется всякий раз, когда соединение было закрыто на уровне HARDWARE. КОГДА это происходит немного до самого устройства. Если вы вручную отключите / подключите другое устройство, оно каким-то образом не отправит сигнал «чувак, im gone» в дроид, вместо этого после 20 секунд некоторые сторожевые лайки и соединение закрываются, и намерение отправляется.

Теперь я попробовал это только с устройствами SPP, к которым я подключаюсь. Гарнитура afaik активно соединяется сама по себе, потому что ее не SPP. Поэтому он автоматически подключается к вам, если вы спарены и находитесь в режиме прослушивания. Теперь я не знаю, что делает гарнитура, если вы «отключите ее». Возможно, он отключается должным образом или, может быть, просто нарушает соединение, не прощаясь. В последнем случае потребуется, чтобы сторожевой таймер отключился от стороны дроида, который может занять от 0 до 20 секунд, не спрашивайте меня, почему это просто мое наблюдение.