2011-01-08 14 views
7

Me gustaría escribir una aplicación que se activa cuando se produce un recordatorio de calendario. Me doy cuenta de que no hay una forma oficialmente documentada de hacerlo, pero he visto en el registro que cuando la alarma de mi calendario se activa en mi teléfono (Droid X), AlertReceiver indica que ha recibido un android.intent.action.EVENT_REMINDER:No se puede recibir la transmisión de 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) } 

por lo tanto, he creado un BroadcastReceiver simple:

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

con este manifiesto:

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

por desgracia, cuando pongo esto en mi teléfono y configurar un evento de calendario con un recordatorio: cuando el recordatorio alerta, todavía veo la entrada de registro de AlertReceiver, pero no la mía.

También he leído aquí sobre algunas intenciones del sistema que requieren registrarse mediante código en lugar de en el manifiesto. Por lo tanto, he intentado lo siguiente en su lugar:

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

con este manifiesto modificación:

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

sin mejor resultado.

¿Alguna idea de lo que me puede estar perdiendo? ¿O alguna otra idea de cómo podría capturar las ocurrencias de alarma de calendario?

Gracias, Ethan

Respuesta

1

Bueno, lo que estamos tratando de hacer no es parte del SDK de Android, sobre todo porque el calendario no es parte del sistema operativo.

Dicho esto, como mínimo, tendrá que añadir un elemento a su <data><intent-filter>, ya que el Intent tiene un Uri.

Sin embargo, estoy razonablemente seguro de que esto no funcionará, ya que el Intent también identifica específicamente un componente (com.android.calendar/.AlertReceiver). AFAIK, que estaba en el Intent al principio, y por lo tanto, el Intent solo se entregará a ese componente, ignorando todas las demás reglas de enrutamiento. Es concebible que el componente enumerado solo apareciera después de la resolución Intent, pero no creo que así sea como funcionan esas entradas de registro.

+0

Oh, bueno, valió la pena. Gracias! – eshayne

0

Es posible hacer que el intento de emisión "android.intent.action.EVENT_REMINDER" funcione al especificar DataAuthority y DataScheme en su filtro de intención junto con su acción de intención. Debe especificar DataAuthority como "com.android.calendar" y DataScheme como "contenido".

+0

¿Puede por favor publicar un ejemplo de código de cómo funcionaría? ¿Podría esto también usarse para capturar cuando la notificación se descarta o se hace clic en? –

4

Debe establecer el esquema de datos en "contenido" en el filtro de intención.

Usando manifiesto, añadir elementos de datos dentro de la intención del filtro

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

Mediante el código, añadir datascheme en una llamada a la función

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

la intención de difusión "android.intent.action.EVENT_REMINDER "sólo se activa cuando una alarma de notificación necesidades que se fijarán para un recordatorio

0

programar una notificación para el evento (por ejemplo: 10 minutos antes del evento) para que la emisión intención" android.intent.action. EVENT_REMINDER "para trabajar

Cuestiones relacionadas