15

ネイティブのAndroidカレンダー(ICS以降)への挿入、編集、削除などのイベントをリッスンするBroadcastReceiverを作成しようとしています。したがって、これらのイベントの1つが発生するたびに、アプリは少なくともこれらのイベントが発生したことを知ることができるはずです。

誰もがアイデア、これを行う方法、または参照リンクを持っています。

BroadcastReceiverから拡張した独自のbroadcasterReceiverクラスを作成しました。マニフェストの値を理解できません。現在、これは機能していません。

 <receiver
    android:name=".NativeEventChangeReceiver">
     <intent-filter>
        <action android:name="android.intent.action.EDIT"/>
        <action android:name="android.intent.action.INSERT"/>
        <action android:name="android.intent.action.DELETE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="vnd.android.cursor.dir/event"/>
     </intent-filter>
  </receiver>

乾杯、

編集1:データタグの適切な文字列を知っている人はいますか?これはintent-filterでも必要だと思います。

編集2:ContentObserverの操作に関するヒントはありますか?

4

2 に答える 2

27

多くの読書の後に最終的に解決策を見つけました、これは他の人が同様の解決策を見つけるのを助けるかもしれません。

マニフェストでは、変更をキャプチャできるように、次の行を記述する必要があります。

<receiver
   android:name=".NativeEventChangeReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PROVIDER_CHANGED"/>
            <data android:scheme="content"/>
            <data android:host="com.android.calendar"/>
        </intent-filter>
</receiver>

乾杯、

于 2013-03-06T01:25:44.947 に答える
4

受け入れられた答えに加えて:

このコードによってブロードキャストされるインテントは、カレンダーデータに変更が加えられたときに送信されます。

<receiver
   android:name=".NativeEventChangeReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PROVIDER_CHANGED"/>
            <data android:scheme="content"/>
            <data android:host="com.android.calendar"/>
        </intent-filter>
</receiver>

残念ながら、デバイスの起動時、またはプロバイダーが作成され、これまでに何を読み取るためのExtraがない場合にもブロードキャストされます。

アプリがイベントインスタンスの挿入/削除のみを処理するようにするには:

イベントインスタンスの総数を追跡します(SagiLowが指摘しているように、これは追加/削除でのみ機能し、更新は考慮されません)。変更された場合は、ユーザーのカレンダーに基づいてデータを再検証します。

public class CalendarChangedReceiver extends BroadcastReceiver
{
    private static final String TAG = "CalendarChangedReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        //Check number of instances
        final SharedPreferences prefs = context.getSharedPreferences(Enums.Config.USER_CONSTANTS, Context.MODE_PRIVATE);`enter code here`
        long lastTimeValidated =  prefs.getLong(AppData.LONG_LAST_TIME_VALIDATED, 0);


      int numRowsLastTimeValidated =  prefs.getInt(AppData.INT_NUM_ROWS_LAST_TIME_VALIDATED, 0);
        int numberOfInstances = getNumberOfInstances(lastTimeValidated, context);
        if(numberOfInstances != numRowsLastTimeValidated) {                    

            /* Do somethng here, for instance:
            Intent serviceIntent = new Intent(context, ValidateCalendarEventsService.class);
            context.startService(serviceIntent);    
            */

        }
    }

    private int getNumberOfInstances(long lastTimeValidated, Context context) {
        Calendar beginTime = Calendar.getInstance();


   beginTime.setTimeInMillis(lastTimeValidated);
        Calendar endTime = Calendar.getInstance();
        endTime.add(Calendar.YEAR, 1);
        endTime.add(Calendar.DAY_OF_MONTH, 1);//now + 366
        long startMillis = beginTime.getTimeInMillis();
        long endMillis = endTime.getTimeInMillis();
        Cursor cur = null;
        ContentResolver cr = context.getContentResolver();
        // Construct the query with the desired date range.
        Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
        ContentUris.appendId(builder, startMillis);
        ContentUris.appendId(builder, endMillis);
        // Submit the query
        cur = cr.query(builder.build(), null, null, null, null);
        //handle results
        return cur.getCount();
    }
}
于 2014-11-04T00:23:22.780 に答える