web-dev-qa-db-fra.com

Découverte de périphérique Bluetooth dans Android - startDiscovery ()

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:

  1. Pored over documentation.
  2. Implémentation d'une instance locale de l'adaptateur BT du périphérique hôte.
  3. Implémentation d'une notification pour activer BT s'il n'est pas activé.
  4. Récepteurs de diffusion enregistrés et intention d'analyser le ACTION_FOUNDs Provenant de startDiscovery ().
  5. Enregistré BLUETOOTH et BLUETOOTH_ADMIN autorisations dans le manifeste.

Les choses fonctionnent (comme testé avec la journalisation incrémentielle de la console) jusqu'à startDiscovery().


Frustration:

  • startDiscovery () - Je soupçonne que je passe ceci dans le mauvais contexte. Dans quel contexte cette méthode doit-elle être placée pour fonctionner correctement?

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);
        }
    }
}

}

15
Lemminkainen

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:

  1. Définissez une variable de classe représentant l'adaptateur Bluetooth local.

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    
  2. Vérifiez si votre appareil "découvre" déjà. Si c'est le cas, annulez la découverte.

    if (mBtAdapter.isDiscovering()) {
        mBtAdapter.cancelDiscovery();
    }
    
  3. Immédiatement après avoir vérifié (et éventuellement annulé) le mode de découverte, lancez la découverte en appelant,

    mBtAdapter.startDiscovery();
    
  4. 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.

19
Alex Lockwood