2011-01-08 28 views
7

Tôi muốn viết một ứng dụng được kích hoạt khi lời nhắc lịch diễn ra. Tôi nhận ra không có cách nào chính thức được làm tài liệu này, nhưng tôi đã thấy trong nhật ký rằng khi báo thức lịch của tôi tắt trên điện thoại của tôi (Droid X), AlertReceiver cho biết rằng nó đã nhận được android.intent.action.EVENT_REMINDER:Không thể nhận android.intent.action.EVENT_REMINDER phát sóng

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

Vì vậy, tôi thiết lập một BroadcastReceiver đơn giản:

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

với biểu hiện này:

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

Thật không may, khi tôi đặt này trên điện thoại của tôi và thiết lập một sự kiện lịch với lời nhắc - khi lời nhắc nhở cảnh báo, tôi vẫn thấy mục nhập nhật ký AlertReceiver, nhưng không phải của tôi.

Tôi cũng đã đọc ở đây về một số ý định hệ thống yêu cầu đăng ký qua mã thay vì trong tệp kê khai. Vì vậy, tôi đã cố gắng sau thay vì:

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

với biểu hiện biến đổi này:

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

không có kết quả tốt hơn.

Bất kỳ ý tưởng nào tôi có thể bị thiếu? Hoặc bất kỳ ý tưởng nào khác về cách tôi có thể nắm bắt các sự cố báo thức lịch?

Cảm ơn, Ethan

Trả lời

1

Vâng, những gì bạn đang cố gắng làm không phải là một phần của Android SDK, chủ yếu là vì lịch không phải là một phần của hệ điều hành.

Điều đó đang được nói, tối thiểu, bạn sẽ cần thêm phần tử <data> vào số <intent-filter> của mình, vì Intent có một số Uri.

Tuy nhiên, tôi chắc chắn rằng điều này sẽ không hoạt động, vì Intent cũng xác định cụ thể một thành phần (com.android.calendar/.AlertReceiver). AFAIK, đã có trong số Intent ngay từ đầu và do đó, Intent sẽ chỉ được gửi đến thành phần đó, bỏ qua tất cả các quy tắc định tuyến khác. Có thể hiểu được thành phần được liệt kê chỉ hiển thị sau độ phân giải Intent, nhưng tôi không nghĩ đó là cách các mục nhật ký đó hoạt động.

+0

Ồ, tốt, đáng để chụp. Cảm ơn! – eshayne

0

Có thể làm cho mục đích phát sóng "android.intent.action.EVENT_REMINDER" hoạt động bằng cách chỉ định DataAuthority và DataScheme trong bộ lọc ý định cùng với hành động ý định của bạn.Bạn cần chỉ định DataAuthority là "com.android.calendar" và DataScheme là "nội dung".

+0

Bạn có thể đăng một số mã mẫu về cách thức hoạt động của tính năng này không? Có thể sử dụng điều này để ghi lại khi thông báo bị loại bỏ hoặc nhấp vào không? –

4

Bạn cần đặt lược đồ dữ liệu thành "nội dung" trong bộ lọc ý định.

Sử dụng manifest, thêm phần tử dữ liệu bên trong ý định lọc

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

Sử dụng mã, thêm datascheme trong một chức năng gọi

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

mục đích phát sóng "android.intent.action.EVENT_REMINDER "chỉ bị kích hoạt khi báo động thông báo cần được đăng để được nhắc nhở

0

đặt thông báo cho EVENT của bạn (Ví dụ: 10 phút trước sự kiện) nhằm mục đích phát sóng" android.intent.action. EVENT_REMINDER "để hoạt động

Các vấn đề liên quan