
I showed how to configure our own sync_calendar function for our own account and how we can synchronize our own events in ...
Give permission in the manifest for the calendar READ and WRITE
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" />
Create SyncAdapter in res / xml folder file name: sync_calendar.xml
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="com.account.auth" android:contentAuthority="com.android.calendar" android:supportsUploading="false" android:userVisible="true" />
android: accountType: - here indicate the type of account that you created under the authenticator account as I mentioned below
<account-authenticator android:accountType="com.account.auth" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:smallIcon="@drawable/ic_launcher" xmlns:android="http://schemas.android.com/apk/res/android"> </account-authenticator>
Define the service name and metadata in the manifest file
<service android:name="com.account.auth.CalendarSyncAdapterService" android:exported="true" android:process=":calendar" > <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/sync_calendar" /> </service>
Create a service that will be called during synchronization. It starts and adds the logic that you want to pass to the synchronization calendar.
public class CalendarSyncAdapterService extends Service { private static SyncAdapterImpl sSyncAdapter = null; static MeetingsDatabaseAdapter sync_Meetings = null; public CalendarSyncAdapterService() { super(); } private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter { public SyncAdapterImpl(Context context) { super(context, true); mContext = context; } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { account = null; account = AccountManager.getAccount( mContext, AccountManager.currentUser(mContext) .get("username_display").toString()); try { if (account != null) { CalendarSyncAdapterService.performSync(mContext, account, extras, authority, provider, syncResult); } } catch (OperationCanceledException e) { } } private Uri asSyncAdapter(Uri uri, String account, String accountType) { return uri.buildUpon() .appendQueryParameter( CalendarContract.CALLER_IS_SYNCADAPTER, "true") .appendQueryParameter(Calendars.ACCOUNT_NAME, account) .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType) .build(); } } @Override public IBinder onBind(Intent intent) { IBinder ret = null; ret = getSyncAdapter().getSyncAdapterBinder(); return ret; } private SyncAdapterImpl getSyncAdapter() { if (sSyncAdapter == null) sSyncAdapter = new SyncAdapterImpl(this); return sSyncAdapter; } private static void performSync(Context context, Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) throws OperationCanceledException { Log.i("SERVICE", "Calendar Service Start"); } }
Create your own Calendar with your account name
public long CreateCalendar(Account account) { Log.i("CALENDAR CREATED", "Calendar With by Account Name"); ContentResolver cr = context.getContentResolver(); ContentValues values = new ContentValues(); values.put(Calendars.ACCOUNT_NAME, account.name); values.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL); values.put(Calendars.NAME, account.name); values.put(Calendars.CALENDAR_DISPLAY_NAME, account.name); values.put(Calendars.CALENDAR_COLOR, 0xFFFFFFFF); values.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER); values.put(Calendars.OWNER_ACCOUNT, account.name); values.put(Calendars.SYNC_EVENTS, 1); values.put(Calendars.VISIBLE, 1); values.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, TimeZone .getDefault().getID()); Uri creationUri = asSyncAdapter(Calendars.CONTENT_URI, account.name, account.type); Uri created = cr.insert(creationUri, values); long cal_id = Long.parseLong(created.getLastPathSegment()); return cal_id; }
Creating events in the created calendar
public void SyncEvent(long id, int meeting_id, String EventName, String Stime, String Etime, String Description) { Calendar cal = Calendar.getInstance(); cal.setTimeZone(TimeZone.getTimeZone("GMT-1")); Date dt = null; Date dt1 = null; try { dt = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Stime); dt1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Etime); Calendar beginTime = Calendar.getInstance(); cal.setTime(dt);
Check for the presence or absence of a calendar on the device
public int queryCalendar(Account account) { Cursor cur = null; ContentResolver cr = this.mContext.getContentResolver(); Uri uri = Calendars.CONTENT_URI; String selection = "((" + Calendars.ACCOUNT_NAME + " = '" + account.name + "'))"; cur = cr.query(uri, CALENDAR_PROJECTION, selection, null, null); while (cur.moveToNext()) { return cur.getInt(0); } return 0; }
Checks if an event is on the calendar or not
public boolean isEventInCal(Context context, String cal_meeting_id) { Cursor cursor = context.getContentResolver().query( Uri.parse("content://com.android.calendar/events"), new String[] { "_id" }, " _id = ? ", new String[] { cal_meeting_id }, null); if (cursor.moveToFirst()) { return true; } return false; }
Receiving all registered events in the calendar on the device [all calendars]
public boolean all_Events(Context context) { boolean flag = false; Cursor cursor = context.getContentResolver().query( Uri.parse("content://com.android.calendar/events"), new String[] { "calendar_id", "title", "description", "dtstart", "dtend", "eventLocation", "_id", "allDay", "duration" }, null, null, null); if (cursor.moveToFirst()) { do {
Disabling an event from your own calendar
public void event_Delete(long eventID) { // ContentResolver cr = this.mContext.getContentResolver(); // ContentValues values = new ContentValues(); Uri deleteUri = null; deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); int rows = this.mContext.getContentResolver().delete(deleteUri, null, null); Log.i("Rows deleted: ", "" + rows); }