2011-09-20 12 views
5

Declaro BroadcsastReceiver (Action_headset_plug) en AndroidManifest.xml y definí BroadcastHandler.class como BroadcsastReceiver. Ejecuto el apk en el dispositivo y el receptor no se dispara. Sin embargo, funciona correctamente cuando uso registerReceiver() en la actividad. ¿Extraño algo en el AndroidManifest.xml?[Android] BroadcastReceiver (Action_headset_plug) no dispara

Este es el AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="irdc.Earphone_test" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="9" /> 
<uses-permission android:name="android.permission.ACTION_HEADSET_PLUG"></uses-permission> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <receiver android:enabled="true" android:name="BroadcastHandler"> 
      <intent-filter> 
       <action android:name="android.intent.ACTION_HEADSET_PLUG"></action> 
      </intent-filter> 
     </receiver> 
     <activity android:name=".Earphone_testActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
</manifest> 

Este es el código del receptor

public class BroadcastHandler extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) {  

     if(intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)){      
      String mes; 
      int state = intent.getIntExtra("state", 4); 
      if(state == 0){  
       mes ="out"; 
      }else if(state == 1){  
       mes ="in";   
      }else {   
       mes ="others"; 
      } 
      AlertDialog.Builder builder = new AlertDialog.Builder(context);   
      builder.setTitle("Headset broadcast");  
      builder.setMessage(mes);  
      builder.setPositiveButton("Okey-dokey", new DialogInterface.OnClickListener() {  
       public void onClick(DialogInterface dialog, int which) {    
        dialog.dismiss();   
       }  
      });  
      builder.create().show(); 

     } 

    } 
} 
+0

ACTION_HEADSET_PLUG no lo hace aparece como una de las opciones para android.permission – shim

Respuesta

1

El nombre es incorrecto en la entrada de manifiesto. Utilizar el nombre completo del paquete, o comenzar con un período si quieres que implícitamente añade al nombre del paquete de la aplicación:

<receiver android:enabled="true" android:name=".BroadcastHandler"> 
0

La mayoría de los ejemplos de receptores no se inician una AlertDialog pero tostadas un mensaje o crear una Notificación en la barra de estado. Estoy seguro de que no puede iniciar una Actividad porque el objeto "contenido" deja de existir, pero no si puede crear un AlertDialog. (documentation of Broadcasts)

Así que usted puede probar en su receptor de un mensaje de aviso emergente para asegurarse de que funciona.

Ejemplo con la Notificación: http://www.anddev.org/recognize-react_on_incoming_sms-t295.html

+0

[ "Con respecto a su error, un BroadcastReceiver-manifiesta registrado no es una actividad, por lo que no puede crear un cuadro de diálogo."] (http://stackoverflow.com/questions/3432601/alertdialog-en-BroadcastReceiver/3432645 # 3432645) – madlymad

5

Para escuchar a los auriculares cambios, el receptor de radiodifusión no puede ser declarada en el manifiesto, debe ser registrado de forma dinámica. No todos los receptores funcionan cuando se declaran en el manifiesto y este es un ejemplo en el que debe registrarse programáticamente.

Puede llamar a este, por ejemplo, en el método de una actividad onResume o en el método de un Servicio de onCreate:

headsetReceiver = new BroadcastHandler(); 
registerReceiver(headsetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 

Luego, en el método de la Actividad onPause o en el método OnDestroy del servicio que necesita anular el registro del receptor:

unregisterReceiver(headsetReceiver); 
+1

¿por qué es esto una diferente de las demás? ¿Tiene un enlace a la documentación que lo confirma? – shim

+0

http://developer.android.com/reference/android/content/Intent.html hace una nota para los que no se pueden registrar a través del manifiesto de la aplicación, y esto no es una de ellas. – shim

+0

Sin embargo, pude hacer que funcione con este método. ¡Gracias! – shim

Cuestiones relacionadas