Bluetooth device discovery in Android — startDiscovery()
Ziel: Bauen eine Android-app, entdeckt die Namen und Adressen der BT-Geräten in Reichweite und sendet, deren Werte zu einem webservice. BT-Geräte wurden bislang noch nicht verklebt, um das host-Gerät, ich möchte nur Umfrage alles so, wie ich zu Fuß über.
Was ich getan habe:
- Brütete über Unterlagen.
- Implementiert eine lokale Instanz von host-Gerät BT-adapter.
- Implementiert eine Benachrichtigung zu ermöglichen, BT, wenn es nicht aktiviert ist.
- Registrierten Broadcast Receiver und Absichten zu analysieren, die
ACTION_FOUNDs
kommen aus der startDiscovery(). - Registriert BLUETOOTH und BLUETOOTH_ADMIN Berechtigungen in der manifest.
Dinge funktionieren (getestet mit inkremental-Konsole Protokollierung) bis startDiscovery()
.
Frustration:
- startDiscovery() -- ich vermute, leite ich diese in der falschen Kontext. Welchem Kontext steht diese Methode platziert werden müssen, um richtig funktionieren?
Wenn Sie in der Lage gewesen, um diese Methode funktioniert, wäre ich sehr dankbar, Eure Weisheit.
UPDATE - hier ist eine abgespeckte, vereinfachte version des Codes, die verursacht mir Kummer; diese Vereinfachung rekapituliert, mein Fehler. Dieser code ausgeführt wird, es wirft kein cat.log
Fehler oder andere Fehler, die es einfach nicht geben keine Ausgabe.
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);
}
}
}
}
InformationsquelleAutor der Frage Lemminkainen | 2012-05-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um es einfach auszudrücken, sollten Sie
startDiscovery()
wenn Sie möchten, dass Ihre Anwendung zu entdecken, lokale Bluetooth-Geräte... zum Beispiel, wenn Sie implementieren wollten eineListActivity
scannt und dynamisch fügt in der Nähe Bluetooth-Geräten zu einemListView
(sieheDeviceListActivity
).Ihre Nutzung der
startDiscovery()
Methode sollte in etwa so Aussehen:Definieren Sie eine Klasse variable repräsentiert das lokale Bluetooth-adapter.
Überprüfen, um zu sehen, ob Ihr Gerät bereits "entdecken". Wenn es ist, dann Abbrechen Entdeckung.
Sofort nach der überprüfung (und ggf. Abbrechen) discovery-Modus, start discovery durch den Aufruf,
Sehr vorsichtig sein, im Allgemeinen etwa versehentlich verlassen Ihrem Gerät in discovery-Modus. Durchführung device discovery ist eine schwere Prozedur für den Bluetooth-adapter und verbraucht eine Menge an Ressourcen. Zum Beispiel, Sie wollen sicherstellen, dass Sie überprüfen/stornieren Entdeckung, bevor Sie versuchen, eine Verbindung herzustellen. Sie wahrscheinlich wollen, zu Abbrechen Entdeckung in Ihrem
onDestroy
Methode zu.Lassen Sie mich wissen, ob dies geholfen... und wenn Sie immer noch Probleme haben, aktualisieren Sie Ihre Antwort mit logcat-Ausgabe und/oder Fehlermeldungen, die Sie bekommen, und ich kann dir vielleicht helfen, ein bisschen mehr.
InformationsquelleAutor der Antwort Alex Lockwood