I am trying to create a calendar using the new ICS calendaring content provider. Since creating a calendar can only be done in SyncAdapter, I created one of them:
public class CalendarSyncAdapter extends AbstractThreadedSyncAdapter { public CalendarSyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { Log.i( Debug.TAG, "onPerformSync()" ); } public void doCreateCalendar( Account account ) { ContentResolver cr = getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put(Calendars.ACCOUNT_NAME, account.name); values.put(Calendars.ACCOUNT_TYPE, account.type); values.put(Calendars.NAME, "newesttest"); values.put(Calendars.CALENDAR_DISPLAY_NAME, "newestTest"); 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); Uri creationUri = asSyncAdapter( Calendars.CONTENT_URI, account.name, account.type ); Uri created = cr.insert( creationUri, values ); long id = Long.parseLong( created.getLastPathSegment() ); Log.i( Debug.TAG, "Calendar created: " + id + " - " + created ); } 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(); } }
But it does not start inside the Service, as I see everywhere, because all I want to do is use it to insert a new Calendar. Running in the service is not required? It seems not.
In any case, I create an instance in my work and call my method:
public void createCalendar( View v ) { m_syncAdapter.doCreateCalendar( this, m_account ); }
Successful, no complaints, but the returned URI is always the same. When I parse it for Row ID, it's always 12. And when I check my calendars, there is nothing new.
In my manifest, I have all the settings:
... <application ... <activity android:name="Setup" android:label="@string/activity_title_setup"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/calendar_sync_adapter" /> </activity>
And calendar_sync_adapter.xml:
<?xml version="1.0" encoding="utf-8"?> <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="com.android.calendar" android:accountType="com.google" android:userVisible="true" />
So I'm not sure what I'm doing wrong here. But this is what I see in the logs when I execute it:
02-17 16:43:07.783: I/ActivityManager(184): Start proc com.android.providers.calendar for content provider com.android.providers.calendar/.CalendarProvider2: pid=20132 uid=10008 gids={3003, 1015} 02-17 16:43:07.806: I/ActivityThread(20132): Pub com.android.calendar: com.android.providers.calendar.CalendarProvider2 02-17 16:43:07.869: I/ActivityManager(184): Start proc com.google.android.calendar for service com.google.android.calendar/com.google.android.syncadapters.calendar.CalendarSyncAdapterService: pid=20145 uid=10007 gids={3003} 02-17 16:43:07.900: I/ActivityThread(20145): Pub com.google.android.calendar.CalendarRecentSuggestionsProvider: com.android.calendar.CalendarRecentSuggestionsProvider // This is my print of the returned URI 02-17 16:43:08.009: I/C3(19995): Calendar created: 12 - content://com.android.calendar/calendars/12?caller_is_syncadapter=true&account_name=xxx%40gmail.com&account_type=com.google 02-17 16:43:08.876: I/CalendarProvider2(20132): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://com.android.calendar } 02-17 16:43:08.876: W/ContentResolver(20132): Failed to get type for: content://com.android.calendar (Unknown URL content://com.android.calendar)