Wykrywanie urządzeń Bluetooth w Androidzie-startDiscovery()
Cel: Zbuduj aplikację na Androida, która wykrywa nazwy i adresy urządzeń BT w zasięgu i przesyła ich wartości do serwisu internetowego. Urządzenia BT nie zostały wcześniej połączone z urządzeniem hosta, chcę tylko sprawdzić wszystko, jak chodzę.
Co zrobiłem:
-
Poored nad dokumentacją.
- zaimplementowano lokalną instancję adaptera BT urządzenia hosta.
- zaimplementowano powiadomienie, aby włączyć BT, jeśli nie jest włączone.
- zarejestrowanych odbiorników transmisji i zamierza analizować
ACTION_FOUNDs
wychodzące z startDiscovery () . - zarejestrowanyBluetooth iBLUETOOTH_ADMIN uprawnienia w manifeście.
Rzeczy działają (jak testowane z przyrostowym logowaniem konsoli) aż do startDiscovery()
.
frustracja:
- startDiscovery () -- podejrzewam, że przekazuję to w złym kontekście. W jakim kontekście powinna być ta metoda umieszczony wewnątrz, aby prawidłowo funkcjonować?
UPDATE - Oto skrócona uproszczona wersja kodu, która sprawia mi smutek; to uproszczenie podsumowuje mój błąd. Ten kod działa, nie wyrzuca żadnych błędów cat.log
ani innych błędów, po prostu nie daje żadnego wyjścia.
package aqu.bttest;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;
public class BT2Activity extends Activity {
private BluetoothAdapter mBTA;
private SingBroadcastReceiver mReceiver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//register local BT adapter
mBTA = BluetoothAdapter.getDefaultAdapter();
//check to see if there is BT on the Android device at all
if (mBTA == null){
int duration = Toast.LENGTH_SHORT;
Toast.makeText(this, "No Bluetooth on this handset", duration).show();
}
//let's make the user enable BT if it isn't already
if (!mBTA.isEnabled()){
Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBT, 0xDEADBEEF);
}
//cancel any prior BT device discovery
if (mBTA.isDiscovering()){
mBTA.cancelDiscovery();
}
//re-start discovery
mBTA.startDiscovery();
//let's make a broadcast receiver to register our things
mReceiver = new SingBroadcastReceiver();
IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mReceiver, ifilter);
}
private class SingBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); //may need to chain this to a recognizing function
if (BluetoothDevice.ACTION_FOUND.equals(action)){
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a Toast
String derp = device.getName() + " - " + device.getAddress();
Toast.makeText(context, derp, Toast.LENGTH_LONG);
}
}
}
}
1 answers
W jakim kontekście należy umieścić tę metodę, aby działała prawidłowo.
Mówiąc prościej, powinieneś użyć startDiscovery()
, Gdy chcesz, aby Twoja aplikacja wykrywała lokalne urządzenia Bluetooth... na przykład, jeśli chcesz zaimplementować ListActivity
, która skanuje i dynamicznie dodaje pobliskie urządzenia Bluetooth do ListView
(Zobacz DeviceListActivity
).
Twoje użycie metody startDiscovery()
powinno wyglądać mniej więcej tak:
-
Zdefiniuj zmienną klasy reprezentuje lokalny adapter Bluetooth.
BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
-
Sprawdź, czy Twoje urządzenie już "odkrywa". Jeśli tak, anuluj discovery.
if (mBtAdapter.isDiscovering()) { mBtAdapter.cancelDiscovery(); }
-
Od razu po sprawdzeniu (i ewentualnie anulowaniu) trybu discovery, rozpocznij wykrywanie przez wywołanie,
mBtAdapter.startDiscovery();
Ogólnie należy bardzo uważać na przypadkowe pozostawienie urządzenia w trybie discovery. Wykonywanie wykrywania urządzenia jest ciężką procedurą dla adaptera Bluetooth i będzie zużywają dużo jego zasobów. Na przykład przed próbą nawiązania połączenia należy upewnić się, że zaznaczono/anulowano odkrycie. Najprawdopodobniej chcesz anulować discovery również w swojej metodzie
onDestroy
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-12 01:55:03