2011-01-08 30 views
7

カレンダーリマインダが発生したときにトリガされるアプリケーションを作成したいと思います。私はこれを公式に文書化された方法はないと認識していますが、カレンダーのアラームが私の電話(Droid X)で消えたとき、AlertReceiverはandroid.intent.action.EVENT_REMINDER:android.intent.action.EVENT_REMINDERブロードキャストを受信できません

残念ながら

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

、私は自分の携帯電話上でこれを入れて、セットアップ:このマニフェストで

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

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

だから、私は、単純なBroadcastReceiverを設定しましたリマインダを通知するカレンダーイベント - リマインダがアラートすると、AlertReceiverログエントリは表示されますが、私は表示されません。

また、マニフェストではなくコード経由で登録する必要があるシステムインテントについてもここで読んでいます。この修正されたマニフェストと

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

:いいえ、より良い結果に

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

だから、私の代わりに、次の試してみました。

アイデアは何か不足している可能性がありますか?カレンダーのアラームの発生をどのようにキャプチャすることができるかもしれないか、他のアイデアですか?あなたが何をしようとして

おかげで、 イーサン

答えて

1

まあ、カレンダーは、オペレーティングシステムの一部ではない主な理由は、AndroidのSDKの一部ではありません。

IntentにはUriがあるため、最低でも<data>要素を<intent-filter>に追加する必要があります。

しかし、Intentは特にコンポーネント(com.android.calendar/.AlertReceiver)を識別しているため、これが機能しないことは合理的に確信しています。最初にIntentにあったAFAIK、したがってIntentは、他のすべてのルーティングルールを無視して、そのコンポーネントにのみ配信されます。リストされたコンポーネントは、Intentの解決の後にしか現れなかったと考えられますが、そのログエントリがどのように機能するかはわかりません。

+0

ありがとうございました。ありがとうございます。 – eshayne

0

インテントアクションとともにDataAuthorityとDataSchemeを指定することで、 "android.intent.action.EVENT_REMINDER"のブロードキャストインテントを動作させることができます。DataAuthorityを "com.android.calendar"として指定する必要があります。 DataSchemeは「コンテンツ」として扱われます。

+0

これはどのように動作するのかのサンプルコードを投稿してください。これを使用して通知を破棄またはクリックしたときにキャプチャすることもできますか? –

4

インテントフィルタでデータスキームを「コンテンツ」に設定する必要があります。マニフェストを使用

、一つの関数呼び出し

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

ブロードキャストインテント「android.intent.actionにdataschemeを追加し、インテント・フィルタ内のコードを使用し

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

のデータ要素を追加します。EVENT_REMINDERが「アラーム通知ニーズがリマインダー

0

のために掲載あなたのイベントのための通知を設定する場合にのみトリガーされます(例:イベントの前10分)放送の意図ためには、」android.intent.action。 EVENT_REMINDER "が動作する