我会使用自定义Android应用程序在现有Google帐户中创建新日历 . 根据堆栈溢出中的一些教程,我创建了由以下组成的应用程序:main活动(我在哪里读取和管理事件),一个服务文件(称为CalendarService)和一个SyncAdapter . 在主要活动中,我使用Intent初始化了服务:

private Intent calendarServiceIntent;
...
calendarServiceIntent = new Intent(getApplicationContext(), CalendarService.class);
startService(calendarServiceIntent);

然后我以这种方式实现了服务:

public class CalendarService extends Service{

//private static final Object sSyncAdapterLock = new Object();

private static CalendarSyncAdapter sSyncAdapter = null;

@Override
public void onCreate() {
    super.onCreate();
    //synchronized (sSyncAdapterLock) {
        if (sSyncAdapter == null) {
            System.out.println("SERVICE STARTED ON CREATE");
            sSyncAdapter = new CalendarSyncAdapter(getApplicationContext(), true); 
        }
   // }
}

@Override
public IBinder onBind(Intent intent) {
    System.out.println("SERVICE STARTED BINDER");
    return sSyncAdapter.getSyncAdapterBinder();
}

}

然后我实现了CalendarSyncAdapter类,将AbstractThreadedSyncAdapter扩展为:

public CalendarSyncAdapter(Context context, boolean autoInitialize) {
    super(context, autoInitialize);
}

@Override
public void onPerformSync(Account account, Bundle extras, String authority,
        ContentProviderClient provider, SyncResult syncResult) {
    Uri calUri = CalendarContract.Calendars.CONTENT_URI;
      ContentValues cv = new ContentValues();
      cv.put(CalendarContract.Calendars.ACCOUNT_NAME, "mygoogleaccount@gmail.com");
      cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
      cv.put(CalendarContract.Calendars.NAME, "MyCalendar");
      cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "MyCalendar");
      cv.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.RED);
      cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
      cv.put(CalendarContract.Calendars.OWNER_ACCOUNT, "mygoogleaccount@gmail.com");
      cv.put(CalendarContract.Calendars.VISIBLE, 1);
      cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1);

      ContentResolver cr = getContext().getContentResolver();

      Uri creationUri = asSyncAdapter(Calendars.CONTENT_URI, "mygoogleaccount@gmail.com", CalendarContract.ACCOUNT_TYPE_LOCAL );
      Uri created = cr.insert( creationUri, cv );

}



private Uri asSyncAdapter( Uri uri, String account, String accountType )
{
    return uri.buildUpon()
    .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER,"true")
    .appendQueryParameter(Calendars.ACCOUNT_NAME, "mygoogleaccount@gmail.com")
    .appendQueryParameter(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL).build();
}

这是xml文件的一部分

<service android:name=".CalendarService"
android:exported="true">
<intent-filter>
<action android:name="android.content.CalendarSyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.CalendarSyncAdapter"
android:resource="@xml/calendar_sync_adapter" />
</service>

这是关联的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"
/>

显然所有这些都不起作用,只有在主活动中移动代码(在方法“onPeformSync”内)时才会创建新日历 . 使用syncAdapter创建新日历的正确解决方案是什么?最后有疑问:有可能将新日历与Google日历同步吗?提前致谢