Objectif: Créer une Android qui découvre les noms et adresses des appareils BT à portée et soumet leurs valeurs à un service Web. Les appareils BT n'ont pas été précédemment liés à la Appareil hôte, je veux simplement tout interroger pendant que je me déplace.
Ce que j'ai fait:
ACTION_FOUNDs
Provenant de startDiscovery ().Les choses fonctionnent (comme testé avec la journalisation incrémentielle de la console) jusqu'à startDiscovery()
.
Frustration:
Si vous avez réussi à faire fonctionner cette méthode, j'apprécierais beaucoup votre sagesse.
UPDATE - voici une version simplifiée simplifiée du code qui me cause du chagrin; cette simplification récapitule mon erreur. Ce code s'exécute, il ne génère aucune erreur cat.log
Ou d'autres erreurs, il ne donne simplement aucune sortie.
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);
}
}
}
}
Dans quel contexte cette méthode doit-elle être placée pour fonctionner correctement.
Pour le dire simplement, vous devez utiliser startDiscovery()
lorsque vous souhaitez que votre application découvre les périphériques Bluetooth locaux ... par exemple, si vous souhaitez implémenter un ListActivity
qui scanne et ajoute dynamiquement le Bluetooth à proximité périphériques à un ListView
(voir DeviceListActivity
).
Votre utilisation de la méthode startDiscovery()
devrait ressembler à ceci:
Définissez une variable de classe représentant l'adaptateur Bluetooth local.
BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
Vérifiez si votre appareil "découvre" déjà. Si c'est le cas, annulez la découverte.
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
Immédiatement après avoir vérifié (et éventuellement annulé) le mode de découverte, lancez la découverte en appelant,
mBtAdapter.startDiscovery();
Soyez très prudent en général lorsque vous laissez accidentellement votre appareil en mode découverte. La détection de périphérique est une procédure lourde pour l'adaptateur Bluetooth et consommera beaucoup de ses ressources. Par exemple, vous voulez vous assurer de vérifier/annuler la découverte avant d'essayer d'établir une connexion. Vous souhaiterez très probablement également annuler la découverte dans votre méthode onDestroy
.
Faites-moi savoir si cela a aidé ... et si vous rencontrez toujours des problèmes, mettez à jour votre réponse avec votre sortie logcat et/ou les messages d'erreur que vous recevez, et je peux peut-être vous aider un peu plus.