android - 取得 - アンドロイドカレンダーイベントのためのブロードキャストレシーバー




uri parse content com android calendar events (2)

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

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

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

残念ながら、デバイスが起動したとき、またはプロバイダが作成されたときにこれまでに何を読むべきかが示されていないときにもブロードキャストされます。

アプリにイベントインスタンスの挿入/削除のみを処理させるには、次の手順を実行します。

イベントインスタンスの総数を追跡します(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();
    }
}

https://code.i-harness.com

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

誰もがこれを行う方法、または任意の参照リンクを考えを持っています。

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:誰もがデータタグの適切な文字列を知っていますか?、私はこれもインテントフィルタに必要であると思います。

編集2:ContentObserverの使用に関するヒントはありますか。


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

マニフェストでは、変更をキャプチャできるようにこれらの行を書く必要があります。

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

乾杯、





android-calendar