2011-01-08 14 views
7

Ich möchte eine Anwendung schreiben, die ausgelöst wird, wenn eine Kalendererinnerung auftritt. Ich weiß, dass es keine offiziell dokumentierte Möglichkeit gibt, dies zu tun, aber ich habe im Log gesehen, dass, wenn mein Kalenderalarm auf meinem Telefon (Droid X) ausgeht, AlertReceiver anzeigt, dass er eine android.intent.action.EVENT_REMINDER empfangen hat:Kann nicht empfangen android.intent.action.EVENT_REMINDER Broadcast

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

So stelle ich eine einfache BroadcastReceiver up:

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

mit diesem Manifest:

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

Leider, wenn ich das auf meinem Handy setzen und einrichten ein Kalenderereignis mit einer Erinnerung - wenn die Erinnerung warnt, sehe ich immer noch den AlertReceiver-Protokolleintrag, aber nicht meinen.

Ich habe auch hier über einige System Intents gelesen, die eine Registrierung über Code und nicht im Manifest erfordern. Also habe ich versucht, das folgende statt:

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

mit diesem modifizierten Manifest:

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

ohne besseres Ergebnis.

Irgendwelche Ideen, was ich vermisse? Oder irgendwelche anderen Ideen, wie ich Kalenderalarme erfassen könnte?

Danke, Ethan

Antwort

1

Nun, was Sie zu tun versuchen ist nicht Bestandteil des Android SDK, vor allem, weil der Kalender nicht Teil des Betriebssystems ist.

aber sagen, dass bei mindestens, müssen Sie ein <data> Element zu Ihrer <intent-filter>, hinzuzufügen, da die Intent eine Uri hat.

Ich bin jedoch ziemlich sicher, dass dies nicht funktioniert, da die Intent auch eine Komponente (com.android.calendar/.AlertReceiver) identifiziert. AFAIK, das war in der Intent am Anfang, und daher die Intent wird nur an diese Komponente geliefert werden, unter Berücksichtigung aller anderen Routing-Regeln. Es ist denkbar, dass die aufgelistete Komponente erst nach Intent Auflösung angezeigt wird, aber ich denke nicht, dass diese Protokolleinträge so funktionieren.

+0

Oh, nun, war einen Versuch wert. Danke! – eshayne

0

Es ist möglich, die Broadcast-Absicht "android.intent.action.EVENT_REMINDER" zu arbeiten, indem Sie DataAuthority und DataScheme in Ihrem Intent-Filter zusammen mit Ihrer Absichtsaktion angeben. Sie müssen DataAuthority als "com.android.calendar" angeben. und DataScheme als "Inhalt".

+0

Können Sie bitte einige Beispielcode, wie dies funktionieren würde? Könnte dies auch verwendet werden, um zu erfassen, wenn die Benachrichtigung abgewiesen oder geklickt wird? –

4

Sie müssen das Datenschema im Intent-Filter auf "Inhalt" setzen.

Verwendung manifest, Datenelement innerhalb Intent-Filter

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

Code, fügt datascheme in einem Funktionsaufruf

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

das Broadcast-Intent „android.intent.action hinzuzufügen.EVENT_REMINDER „nur wird ausgelöst, wenn ein Alarm Benachrichtigung Bedarf für eine Erinnerung

0

setzte eine Benachrichtigung für Ihr Ereignis (zB: 10 Minuten vor der Veranstaltung) gebucht werden, um für die Sendung Intent“ android.intent.action. EVENT_REMINDER "zu arbeiten

Verwandte Themen