Бих искал да знам какви събития в отдалечени физически устройства задействат ACTION_ACL_CONNECTED
и ACTION_ACL_DISCONNECTED
в слушателно устройство. Резултатите от теста ми нямат смисъл. Събрах няколко устройства на няколко дециметра едно от друго:
- Galaxy Tab P7500 с Android 3.1
- телефон i5500 с Android 2.2
- компютър с WinXP с Bluetooth USB ключ
- две слушалки с бутони за включване/изключване
Първо сдвоявам ръчно всички устройства от раздела. Нито компютърът, нито телефонът са сдвоени с друго устройство освен Tab. (Една от слушалките никога не може да бъде намерена от раздела по никакъв начин, но може лесно да бъде намерена от телефона както ръчно, така и програмно). След това имам просто приложение, за да започна откриване и което слуша и показва ACL излъчванията. И ето какво се случва (едно и също нещо всеки път, то е последователно в своята лудост):
startDiscovery()
от Tab с активирани всички устройства: - Компютърът е единственото намерено устройство- Деактивирайте bluetooth на компютър: - Няма реакция на раздела
- Активирайте bluetooth на компютър: - Няма реакция на раздела
- Включване на слушалките за първи път: -
ACTION_ACL_CONNECTED
в раздела - Изключване на слушалките: - Няма реакция на раздела
- Включете отново слушалките: -
ACTION_ACL_DISCONNECTED
иACTION_ACL_CONNECTED
в бърза последователност в раздела
- Деактивиране на bluetooth на Tab: - Няма реакция на Tab
- Активирайте bluetooth в раздела: - Слушалки
ACTION_ACL_CONNECTED
в раздела
startDiscovery()
от телефона: - Компютърът е единственото устройство, открито от телефона, въпреки че телефонът е сдвоен само с Tab, а не с компютъра. В противен случай телефонът реагира само на слушалките, на които 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();
}