2010-11-17 3 views

Répondre

3

Ce n'est pas une permission, c'est en fait un problème avec la façon dont vous avez enregistré le récepteur. L'émission d'action de prise casque ne peut être reçu par les récepteurs activement enregistrés comme ceci:

registerReceiver(receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 

Cela signifie que vous devez avoir un service maintenu en vie qui contient une référence au récepteur et aussi désinscrit quand le service est tué . Enfin, le service qui enregistre le récepteur doit également être démarré au démarrage; ce que vous faites avec un autre récepteur qui intercepte l'intention android.intent.action.BOOT_COMPLETED. Pour cette partie, vous devrez utiliser l'autorisation android.permission.RECEIVE_BOOT_COMPLETED.

Pour un exemple complet d'un service qui fait ce genre de choses, vous pouvez consulter un app I wrote that does just that.

+1

Comment savez-vous quelles actions de android.intent.action. * Peuvent être utilisées sans avoir un service actif en cours d'exécution? Comme dans ce cas si je l'ai fait Je n'aurais pas besoin d'un service pour détecter la suppression du casque. J'ai regardé la documentation android et ne peux pas dire quels services peuvent diffuser des émissions peuvent simplement être utilisés en s'inscrivant dans le manifeste. –

4

Avec l'API 8, mon récepteur de diffusion a été appelé sans créer de service ni demander d'autorisations supplémentaires.

Vous pouvez définir une classe interne au sein de votre principale activité similaire à celle que je l'ai défini ci-dessous:

public class HeadSetBroadCastReceiver extends BroadcastReceiver 
    { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      // TODO Auto-generated method stub 
      String action = intent.getAction(); 
      Log.i("Broadcast Receiver", action); 
      if((action.compareTo(Intent.ACTION_HEADSET_PLUG)) == 0) //if the action match a headset one 
      { 
       int headSetState = intent.getIntExtra("state", 0);  //get the headset state property 
       int hasMicrophone = intent.getIntExtra("microphone", 0);//get the headset microphone property 
       if((headSetState == 0) && (hasMicrophone == 0))  //headset was unplugged & has no microphone 
       { 
           //do whatever 
       } 
      }   

     } 

    } 

Ensuite, enregistrez votre récepteur de radiodiffusion soit dynamique ou statique. Je le mien inscrit dynamiquement dans la méthode onCreate() de mon activité:

this.registerReceiver(headsetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 

Assurez-vous que vous désenregistrez votre BroadcastReceiver avec unregisterReceiver du contexte. Dans mon cas, je l'ai fait dans la méthode onDestroy(). Ça devrait le faire.

Questions connexes