BroadcastReceiver for Android Calendar events

前端 未结 2 1720
無奈伤痛
無奈伤痛 2020-12-08 08:11

I am trying to write a BroadcastReceiver that listens to events like insert, edit, delete to the native android calendar (ICS and above). So whenever one of these events occ

相关标签:
2条回答
  • 2020-12-08 08:51

    Finally found the solution after a lot of reading, this may help other finding a similar solution.

    In the Manifest, you need to write these lines to be able to capture the changes:

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

    Cheers,

    0 讨论(0)
  • 2020-12-08 09:11

    In addition to the accepted answer:

    The intent broadcasted by this code is send when any change is made to the calendar data:

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

    Unfortunatly, it is also broadcasted when the device boots, or when the provider is created and there are no Extra's to read what so ever.

    To make your app only handle insertion/deletion of event instances:

    Keep track of the total number of event-instances (as SagiLow points out, this only works on add/delete and does not take updates into account). If it changed, re-validate your data based on the users calendar:

    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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题