2011-01-08 10 views
7

Chciałbym napisać aplikację uruchamianą po przypomnieniu kalendarza. Zdaję sobie sprawę, że nie ma oficjalnie udokumentowanego sposobu, aby to zrobić, ale widziałem w dzienniku, że kiedy mój alarm kalendarza zgaśnie na moim telefonie (Droid X), AlertReceiver wskazuje, że otrzymał android.intent.action.EVENT_REMINDER:Nie można odebrać android.intent.action.EVENT_REMINDER transmisji

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

Więc skonfigurować prosty 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!"); 
    } 
} 

z tego manifestu:

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

Niestety, kiedy kładę to na moim telefonie i skonfigurować wydarzenie w kalendarzu z przypomnieniem - po przypomnieniu wciąż widzę wpis dziennika AlertReceiver, ale nie mój.

Mam również przeczytać tutaj o niektórych zamiarach systemu, które wymagają rejestracji za pomocą kodu, a nie w manifeście. Tak, próbowałem następujące zamiast:

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

z tym zmodyfikowanym manifeście:

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

bez lepszego wyniku.

Jakieś pomysły, których może mi brakować? Albo jakieś inne pomysły na to, w jaki sposób mogę uchwycić zdarzenia alarmowe z kalendarza?

Dzięki, Ethan

Odpowiedz

1

dobrze, co próbujesz zrobić, nie jest częścią Android SDK, głównie dlatego, że kalendarz nie jest częścią systemu operacyjnego.

Mając na uwadze powyższe, na minimum, trzeba będzie dodać element <data> do swojej <intent-filter>, ponieważ Intent ma Uri.

Jednak jestem pewien, że to nie zadziała, ponieważ Intent również specyficznie identyfikuje składnik (com.android.calendar/.AlertReceiver). AFAIK, który na początku był w wersji Intent, a zatem Intent zostanie dostarczony do tego komponentu, ignorując wszystkie inne reguły routingu. Można sobie wyobrazić, że wymieniony komponent pojawił się dopiero po rozdzielczości Intent, ale nie sądzę, że tak działają te wpisy dziennika.

+0

Och, cóż, był wart strzały.Dzięki! – eshayne

0

Możliwe jest wykonanie zamiaru transmisji "android.intent.action.EVENT_REMINDER" przez określenie DataAuthority i DataScheme w filtrze zamiaru wraz z działaniem zamiaru.Musisz określić DataAuthority jako "com.android.calendar" i DataScheme jako "treść".

+0

Czy możesz przesłać próbny kod, jak to działałoby? Czy można to wykorzystać do przechwycenia, kiedy powiadomienie zostanie odrzucone lub kliknięte? –

4

Musisz ustawić schemat danych na "treść" w filtrze zamiany.

Korzystanie manifest, dodać element danych wewnątrz 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> 

Używając kodu, dodać datascheme w jednym wywołaniu funkcji

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

zamiarem broadcast „android.intent.action.EVENT_REMINDER „tylko zostanie zwolniony, gdy alarm powiadomień musi być wysłana do przypomnienia

0

ustawić powiadomienie dla zdarzeń (np: 10 minut przed zdarzeniem) W celu umożliwienia transmisji intent” android.intent.action. EVENT_REMINDER "do pracy