Pregunta

Veo que múltiples transmisiones ( ACTION_TIME_TICK , por ejemplo) no puede ser registrado en el manifiesto, el deben estar registrados explícitamente a través de Context.registerReceiver(). Tengo problemas con el ACTION_USER_PRESENT emisión intención. En concreto, la prueba de que en el emulador y mi aplicación mantiene la fuerza de cierre con el error:

08-30 09:44:23.397: ERROR/AndroidRuntime(290): java.lang.RuntimeException: Unable to start receiver me.turnerha.RegisterListeners: java.lang.IllegalArgumentException: Receiver not registered: me.turnerha.RegisterListeners@43d05690

Esto es causado por

08-30 09:44:23.397: ERROR/AndroidRuntime(290): Caused by: java.lang.IllegalArgumentException: Receiver not registered: me.turnerha.RegisterListeners@43d05690

Mi manifiesto es bastante simple:

    <receiver android:name=".RegisterListeners">
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_ON" />
        </intent-filter>
    </receiver>

¿Alguna idea? Estoy básicamente intentar crear un receptor que se despierta tan pronto como sea posible después de instalar mi aplicación. La primera vez que se despertó, se registra unos oyentes, y luego se anula el registro en sí por lo que nunca se vuelve a llamar. (Realmente deseo que había una intención disparó inmediatamente después se había instalado la aplicación, para permitir un poco de configuración :))

¿Fue útil?

Solución

correcta - no ACTION_SCREEN_ON ni ACTION_USER_PRESENT puede ser registrado en el manifiesto. Tengo presentó una documentación de errores sobre este tema.

Otros consejos

Eitherway, se podría utilizar context.registerReceiver() que hacer el truco, y mantener su manifiesta limpio. Enlace

ACTION_USER_PRESENT registrar en el archivo de manifiesto no disparará siempre. En mi nexus4 Si me registro en ACTION_USER_PRESENT archivo de manifiesto a continuación, que no funciona en absoluto, mientras que la inscripción en la actividad funciona bien.

I tenía el mismo problema y me fijo (probado en 4.3 y 5.1). Yo era capaz de declarar "android.intent.action.USER_PRESENT" dentro del manifiesto, siempre y cuando usted tiene el permiso READ_PHONE_STATE, que está bien !! Mi mini aplicación consiste en un receptor de difusión que reacciona a la pantalla de estado ON / OFF, y ejecuta un servicio en segundo plano que hace el reconocimiento de voz continua. Si la pantalla está apagada, el reconocimiento se apaga. Aquí está el código, disfrutar de: MANIFIESTO:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <receiver android:name="classes.VoiceLaunchReceiver" >
            <intent-filter>                
                <action android:name="android.intent.action.USER_PRESENT" />    
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

BROADCAST RECEPTOR:

public class VoiceLaunchReceiver extends BroadcastReceiver {
    @Override  
    public void onReceive(Context ctx, Intent intent) {     
        Intent service = new Intent(ctx, VoiceLaunchService.class);
     //   service.putExtra(action, true);
        Log.i("joscsr","Incoming Voice Launch Broadcast...");  

        if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
            Log.i("joshcsr", "************\nCSR Resumed (BC)\n************");
            ctx.startService(service);
            }
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.i("joshcsr", "************\nCSR STOPPED by SCREEN (BC)\n************");
            ctx.stopService(service);  
            }
        }  
}

Como se puede imaginar, mi receptor USER_PRESENT emisión no está registrada en ningún otro lugar. Me inscribo ACTION_SCREEN_OFF y ON en el método onCreate de mi servicio, que fue desencadenada por mi receptor.

@Override
public void onCreate() {
    super.onCreate();
    //Register screen ON/OFF BroadCast
    launcher=new VoiceLaunchReceiver();
    IntentFilter i=new IntentFilter(Intent.ACTION_SCREEN_OFF);
    i.addAction(Intent.ACTION_SCREEN_ON);               
    registerReceiver(launcher,i);
    Log.d("joshcsr","VoiceLaunch Service CREATED"); 
    }

Finalmente anular el registro de la pantalla de encendido / apagado en el OnDestroy () de mi servicio:

@Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(launcher);}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top