8 votes

Impossible de recevoir la diffusion Android.intent.action.EVENT_REMINDER

Je voudrais écrire une application qui se déclenche lorsqu'un rappel de calendrier se produit. Je me rends compte qu'il n'y a pas de moyen officiellement documenté de le faire, mais j'ai vu dans le journal que lorsque l'alarme de mon calendrier se déclenche sur mon téléphone (Droid X), AlertReceiver indique qu'il a reçu un message Android.intent.action.EVENT_REMINDER :

01-03 11:03:00.029 D 1523 AlertReceiver onReceive: a=android.intent.action.EVENT_REMINDER Intent { act=android.intent.action.EVENT_REMINDER dat=content://com.android.calendar/129407058000 flg=0x4 cmp=com.android.calendar/.AlertReceiver (has extras) }

J'ai donc mis en place un simple BroadcastReceiver :

package com.eshayne.android;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class CalendarTest extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
       android.util.Log.i("CalendarTest", "CalendarTest.onReceive called!");
    }
}

avec ce manifeste :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.eshayne.android"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
        <receiver android:name="com.eshayne.android.CalendarTest">
            <intent-filter>
                <action android:name="android.intent.action.EVENT_REMINDER" />
            </intent-filter>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="8" />
</manifest>

Malheureusement, lorsque j'installe ce système sur mon téléphone et que je configure un événement de calendrier avec un rappel, lorsque le rappel est activé, je vois toujours l'entrée du journal du récepteur d'alerte, mais pas la mienne.

J'ai également lu ici que certains intents système nécessitent d'être enregistrés via le code plutôt que dans le manifeste. J'ai donc essayé ce qui suit :

package com.eshayne.android;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

public class CalendarTestDisplay extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        registerReceiver(new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {
                            android.util.Log.i("CalendarTestDisplay", "received broadcast");
                        }           
                     },
                     new IntentFilter("android.intent.action.EVENT_REMINDER"));
    }
}

avec ce manifeste modifié :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.eshayne.android"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-permission android:name="android.permission.READ_CALENDAR" />
        <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
        <activity android:name=".CalendarTestDisplay"
              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>
    <uses-sdk android:minSdkVersion="8" />
</manifest> 

sans meilleur résultat.

Une idée de ce que je pourrais manquer ? Ou d'autres idées sur la manière dont je pourrais capturer les occurrences d'alarmes de calendrier ?

Merci, Ethan

6voto

JoonasS Points 577

Vous devez définir le schéma de données sur "contenu" dans le filtre d'intention.

À l'aide du manifeste, ajouter un élément de données dans le filtre d'intention.

        <receiver android:name="com.eshayne.android.CalendarTest">
            <intent-filter>
                <data android:scheme="content"/> <!-- this was missing -->
                <action android:name="android.intent.action.EVENT_REMINDER" />
            </intent-filter>
        </receiver>

En utilisant le code, ajouter le datascheme en un seul appel de fonction

IntentFilter filter = new IntentFilter(CalendarContract.ACTION_EVENT_REMINDER);
filter.addDataScheme("content");   // this was missing
registerReceiver(myRemindersReceiver, filter);

1voto

CommonsWare Points 402670

Eh bien, ce que vous essayez de faire ne fait pas partie du SDK Android, principalement parce que le calendrier ne fait pas partie du système d'exploitation.

Ceci étant dit, vous devrez au minimum ajouter un <data> à votre <intent-filter> puisque le Intent a un Uri .

Cependant, je suis raisonnablement certain que cela ne fonctionnera pas, puisque la Intent identifie aussi spécifiquement un composant ( com.android.calendar/.AlertReceiver ). AFAIK, c'était dans le Intent dès le départ, et donc le Intent ne sera livré qu'à ce composant, en ignorant toutes les autres règles de routage. Il est concevable que le composant listé n'apparaisse qu'après que Intent mais je ne pense pas que ce soit la façon dont ces entrées de journal fonctionnent.

0voto

Anu Points 131

Il est possible de faire fonctionner l'intention de diffusion "Android.intent.action.EVENT_REMINDER" en spécifiant DataAuthority et DataScheme dans votre filtre d'intention avec votre action d'intention. Vous devez spécifier DataAuthority comme "com.Android.calendar" et DataScheme comme "content".

0voto

Dan Alboteanu Points 1570

L'intention de diffusion "Android.intent.action.EVENT_REMINDER" n'est activée que lorsqu'une alarme est déclenchée. notification doit être affiché pour rappel

0voto

Dan Alboteanu Points 1570

Définissez une notification pour votre événement (par exemple, 10 minutes avant l'événement) afin que l'intention de diffusion "Android.intent.action.EVENT_REMINDER" fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X