首页 文章

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

提问于
浏览
2

我的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 Calendar成功同步,但它无效 .

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

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

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

  • 0

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

    Intents for adding events to calendar

    它会自动打开您手机的原生日历,一旦添加后您就可以刷新视图以反映在您的应用中 .

相关问题