无法将Android日历活动(使用我的应用创建)与Google日历同步

时间:2014-05-02 10:02:56

标签: android google-calendar-api android-calendar

我的Android Google帐户在设置中启用了同步选项(适用于日历/通讯录等)。

当我从原生日历应用添加新活动时,它会与网络Google日历同步。 当我以编程方式添加新活动时,虽然它出现在原生Android日历应用中,但它永远不会与我帐户中的Google日历同步。

我在网上搜索了各种代码段并尝试了不同的内容,我的活动(从我的应用中插入)从未出现在Google日历中(仅限本地电话日历)。

这就是我插入事件的方式:

 @Override
protected void onCreate(Bundle savedInstanceState) {

     accountName = getAccount().name;
     accountType = getAccount().type;

    setCalendarVisiblityAndSync();
    addEvent(); //add single test event (this one appears in local calendar)
}

private void setCalendarVisiblityAndSync(){
    ContentResolver cr = getContentResolver();
    ContentValues values = new ContentValues();
    values.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
    values.put(CalendarContract.Calendars.VISIBLE, 1);

    Uri uri = asSyncAdapter(ContentUris.withAppendedId(Calendars.CONTENT_URI, 1),accountName, accountType);
    cr.update(uri, values, null, null);

}

public long addEvent() {

    DateTime dateFrom = new DateTime().withDayOfMonth(20).withHourOfDay(11);
    DateTime dateTo = new DateTime().withDayOfMonth(20).withHourOfDay(12);

    long startMillis = 0;
    long endMillis = 0;

    startMillis = dateFrom.getMillis();
    endMillis = dateTo.getMillis();

    ContentResolver cr = getContentResolver();
    ContentValues values = new ContentValues();

    values.put(Events.DTSTART, startMillis);
    values.put(Events.DTEND, endMillis);

    String title = "ANDROID EVENT FROM MY APP";
    values.put(Events.TITLE, title);

    String description = "ANDROID EVENT FROM MY APP DESCRIPTION";
    values.put(Events.DESCRIPTION, description);

    values.put(Events.CALENDAR_ID, 1);
    values.put(Events.EVENT_TIMEZONE, dateFrom.getZone().toTimeZone().getDisplayName());

    values.put(Events.HAS_ALARM, true);

    Uri eventUri = asSyncAdapter(Events.CONTENT_URI,accountName,accountType);
    Uri uri = cr.insert(eventUri, values);

    // get the event ID that is the last element in the Uri
    long eventID = Long.parseLong(uri.getLastPathSegment());

    return eventID;
}

public Account getAccount() {
    Account[] accounts = AccountManager.get(this).getAccounts();
    Account account = accounts[0];

    return account;

}



//The static function below is a snippet of code I found as a suggestion on another thread (but I am not sure if I am using it right ?!)
    static Uri asSyncAdapter(Uri uri, String account, String accountType) {
        return uri.buildUpon()
            .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
            .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
            .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
}

上述功能来自不同的主题,我自己将它们组合在一起,试图与Google日历成功同步,但它无效。

编辑:我也在日志窗口中收到此消息:

  /*05-02 10:40:16.670: W/EventHandler(29147):        com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
 05-02 10:40:16.670: W/EventHandler(29147): {
05-02 10:40:16.670: W/EventHandler(29147):   "errors": [
05-02 10:40:16.670: W/EventHandler(29147):     {
05-02 10:40:16.670: W/EventHandler(29147):       "reason": "invalid",
05-02 10:40:16.670: W/EventHandler(29147):       "domain": "global",

05-02 10:40:16.670:W / EventHandler(29147):" message":"开始时间的时区定义无效。" * /

2 个答案:

答案 0 :(得分:0)

问题可能出在“dateFrom.getZone()。toTimeZone()。getDisplayName()”中。 它返回的是时区的本地化名称,例如“太平洋标准时间”。您可以向用户显示此类字符串版本,但服务器可能需要时区ID。尝试使用dateFrom.getZone()。getID()。

答案 1 :(得分:0)

实际上,您不必自己进行插入操作,将其委托给移动设备的原生日历。您可以使用Intent来执行此操作。

Intents for adding events to calendar

它会自动打开您移动设备的原生日历,您可以在添加视图后刷新视图以反映在您的应用中。