2012-08-08 3 views
1

J'ai fait une classe d'assistance qui étend BroadcastReceiver pour écouter BluetoothDevice trouvé et intentions de finition de découverte. J'ai deux activités qui utilisent cette classe en passant un gestionnaire. Le gestionnaire reçoit des messages selon l'intention. J'instancier la classe et registerReceiver comme ceci:Classe extension BroadcastReceiver ne fonctionne pas

De MainActivity:

deviceHelper=new DevicesHelper(myHandler,DevicesHelper.REQUEST_DETECT_DEVICES_IN_RANGE); 

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
this.registerReceiver(deviceHelper, filter); 

filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
this.registerReceiver(deviceHelper, filter); 

if(myBluetoothAdapter.isDiscovering())myBluetoothAdapter.cancelDiscovery(); 
myBluetoothAdapter.startDiscovery(); 

De ListActivity:

deviceHelper=new DevicesHelper(deviceListHandler,DevicesHelper.REQUEST_DEVICE_LIST_ACTIVITY); 

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
this.registerReceiver(deviceHelper, filter); 

filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
this.registerReceiver(deviceHelper, filter); 

classe DeviceHelper:

public class DevicesHelper extends BroadcastReceiver { 

    public final static int REQUEST_DEVICE_LIST_ACTIVITY=1; 
    public final static int REQUEST_DETECT_DEVICES_IN_RANGE=2; 


    Handler myHandler;  
    int requestCode; 

    public DevicesHelper(){ 

    } 
    public DevicesHelper(Handler handler,int requestCode){ 
      this.requestCode=requestCode; 
      myHandler=handler; 

    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     String action = intent.getAction(); 

     // When discovery finds a device 
     BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

     if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      // Get the BluetoothDevice object from the Intent 
      switch(requestCode){ 
      case REQUEST_DEVICE_LIST_ACTIVITY: 
       if (device.getBondState() != BluetoothDevice.BOND_BONDED) { 
        //newDevicesCount++; 
        String[] deviceInfo={device.getName(),device.getAddress()}; 

        myHandler.obtainMessage(DeviceListActivity.MESSAGE_NEW_DEVICE,deviceInfo); 
       }; 


       break; 

      case REQUEST_DETECT_DEVICES_IN_RANGE: 

       String[] deviceInfo={device.getName(),device.getAddress()}; 

       myHandler.obtainMessage(StripChartRecorder.MESSAGE_NEW_DEVICE,deviceInfo); 
       break; 

      } 


      // When discovery is finished, change the Activity title 
     } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 

      myHandler.obtainMessage(StripChartRecorder.MESSAGE_DISCOVERY_FINISHED); 

     } 
    } 

Gestionnaire:

private final Handler myHandler=new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch(msg.what) { 
       case MESSAGE_NEW_DEVICE: 
        doOtherStuff(); 

       case MESSAGE_DISCOVERY_FINISHED: 
        dostuff(); 
      } 
      break; 
}} 

Suis-je manque quelque chose ici? J'apprécie toute aide.

+0

Avez-vous une déclaration de classe de récepteur "DevicesHelper" dans Manifest? Qu'est-ce qui ne fonctionne pas exactement? Pouvez-vous frapper un point d'arrêt dans le récepteur? – Maxim

+0

@mojorisinify. Créez d'abord un IntentFilter et utilisez addAction pour ajouter des actions supplémentaires. – techiServices

+0

@Maxim Je n'ai pas déclaré le destinataire dans le manifeste, c'est enregistré dans le code. DevicesHelper n'est pas une activité, donc je ne pense pas qu'elle doive être déclarée dans le manifeste. Référence: [lien] (http://stackoverflow.com/questions/6882476/android-communicate-between-activity-and-broadcast-receiver). DevicesHelper est instancié, enregistré mais il n'est pas appelé lorsque les périphériques Bluetooth sont à portée. – mojorisinify

Répondre

0

Le problème était la façon dont je traitais le message reçu du gestionnaire. L'ensemble <> a été initialement défini sur null selon les instructions d'eclipse. Il n'a donc jamais ajouté les périphériques reçus de la classe auxiliaire BroadcastReceiver. J'apprécie tous ceux qui ont essayé d'aider.

1

Vous devez sendMessage(Message msg) où msg est le Message vous obtenez avec obtainMessage.

+0

Désolé mais ça n'a aucun sens. – mojorisinify

+0

@mojorisinify. Pourquoi cela n'a-t-il aucun sens? Comment pensez-vous qu'un 'Handler' fonctionne? Regardez la référence API et vous verrez 'getMessage' renvoie un' Message'. Utilisez ce 'Message' comme paramètre dans' Handler.sendMessage'. – techiServices

+0

J'ai une bonne compréhension du fonctionnement d'un handler. Je l'ai utilisé dans d'autres parties de l'application pour recevoir des messages de processus en cours d'exécution dans un thread différent, et cela fonctionne très bien avec eux. Dites-moi pourquoi je dois changer l'approche de cette situation en particulier? – mojorisinify

Questions connexes