2011-01-08 3 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) } 

그래서, 간단한 브로드 캐스트 리시버를 설정 알리미가있는 캘린더 일정 - 알리미가 알리면 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

음, 일정은 운영 체제의 일부가 대부분 때문에, 안드로이드 SDK의 일부가 아닙니다.

IntentUri이 있으므로 적어도 최소한 <data> 요소를 <intent-filter>에 추가해야합니다.

그러나 Intent은 특별히 구성 요소 (com.android.calendar/.AlertReceiver)를 식별하므로 제대로 작동하지 않을 것이라고 확신합니다. AFAIK는 처음에는 Intent 이었으므로 Intent은 다른 모든 라우팅 규칙을 무시하고 해당 구성 요소에만 전달됩니다. 나열된 구성 요소가 Intent 해결 후에 만 ​​나타 났을 수도 있지만 로그 엔트리가 작동하는 방식이라고 생각하지 않습니다.

+0

감사합니다! – eshayne

0

은 "com.android.calendar"로 DataAuthority을 지정하는 의도 action.You 요구와 함께 당신의 인 텐트 필터에 DataAuthority 및 DataScheme를 지정하여 방송 의도 "android.intent.action.EVENT_REMINDER"작업을 할 수 있습니다 DataScheme은 "content"로 표시됩니다.

+0

이것이 작동하는 방법에 대한 샘플 코드를 게시 할 수 있습니까?이 또한 알림을 닫거나 클릭 할 때 캡처하는 데 사용할 수 있습니까? –

4

인 텐트 필터에서 데이터 구성표를 "content"로 설정해야합니다. 매니페스트 사용

, 코드를 사용하여 의도 필터

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

내부 데이터 요소를 추가 한 함수 호출

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

방송 의도 "android.intent.action에 datascheme 추가.EVENT_REMINDER는 "알람 통지 필요가 알림

0

에 대한 게시 이벤트에 대한 알림을 설정하는 경우에만 트리거됩니다 (예 : 이벤트 전 10 분) 방송 의도를 위해서는"android.intent.action. EVENT_REMINDER "가 작동하려면

관련 문제