Question

Je vois que plusieurs émissions ( ACTION_TIME_TICK , pour exemple) ne peut pas être enregistré dans le manifeste, le doit être explicitement enregistré via Context.registerReceiver(). Je ne parviens pas à la ACTION_USER_PRESENT l'intention de diffuser. Plus précisément, je test sur l'émulateur et mon application conserve la force de fermeture avec l'erreur:

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

Ceci est causé par

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

Mon manifeste est assez simple:

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

Toutes les pensées? Je suis essentiellement essayer de créer un récepteur qui est réveillé le plus tôt possible après mon application est installée. La première fois qu'il est réveillé, il enregistre quelques auditeurs, puis il se désinscrit donc il est jamais appelé à nouveau. (Je souhaite vraiment qu'il y avait une intention tiré immédiatement après l'application avait été installé pour permettre un petit peu de configuration :))

Était-ce utile?

La solution

Correct - ni ACTION_SCREEN_ON ni ACTION_USER_PRESENT peuvent être enregistrés dans le manifeste. Je a déposé un bug de documentation sur cette question.

Autres conseils

Eitherway, vous pouvez utiliser context.registerReceiver() qui fera l'affaire, et garder votre propre manifeste. de lien

l'enregistrement ACTION_USER_PRESENT dans le fichier manifeste ne se déclenche pas toujours. Dans mon nexus4 si j'enregistrer dans le fichier ACTION_USER_PRESENT manifeste alors il ne fonctionne pas du tout alors que l'enregistrement à l'activité fonctionne très bien.

J'ai eu le même problème et je l'ai fixé (testé sur 4.3 et 5.1). J'ai pu déclarer « android.intent.action.USER_PRESENT » à l'intérieur du manifeste, aussi longtemps que vous avez la permission de READ_PHONE_STATE, il est OK !! Mon mini-application se compose d'un récepteur de diffusion qui réagit à l'écran l'état ON / OFF, et exécute un service d'arrière-plan qui fait la reconnaissance vocale continue. Si l'écran est éteint, la reconnaissance est désactivée. Voici le code, profitez: MANIFESTE:

<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>

Récepteur DIFFUSEURS:

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

Comme vous pouvez l'imaginer, mon récepteur de radiodiffusion de USER_PRESENT est enregistré nulle part ailleurs. J'inscrire ACTION_SCREEN_OFF et ON dans la méthode onCreate de mon service, qui a été déclenché par mon récepteur.

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

Enfin j'annuler l'inscription écran on / off dans le OnDestroy () de mon service:

@Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(launcher);}
scroll top