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