Подтвердить что ты не робот

BroadcastReceiver для Android Календарь событий

Я пытаюсь написать BroadcastReceiver, который прослушивает такие события, как вставка, редактирование, удаление в родной календарь Android (ICS и выше). Поэтому, когда происходит одно из этих событий, приложение должно быть в состоянии, по крайней мере, знать, что эти события произошли.

У любого есть идея, как это сделать или какие-либо ссылки ссылки.

Я написал свой собственный класс вещателяReceiver, который простирается от BroadcastReceiver. Невозможно определить значения в манифесте, как, в настоящее время у меня есть это, которое не работает:

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

4b9b3361

Ответ 1

Наконец нашел решение после большого количества чтения, это может помочь другим найти аналогичное решение.

В манифесте вам нужно записать эти строки, чтобы иметь возможность фиксировать изменения:

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

Приветствия,

Ответ 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();
    }
}