我的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 回答
问题可能出在“dateFrom.getZone() . toTimeZone() . getDisplayName()”中 . 它返回的是时区的本地化名称,例如“太平洋标准时间” . 您可以向用户显示此类字符串版本,但服务器可能需要时区ID . 尝试使用dateFrom.getZone() . getID() .
实际上,您不必自己进行插入,将其委托给移动设备的本机日历 . 您可以使用Intent来执行此操作 .
Intents for adding events to calendar
它会自动打开您手机的原生日历,一旦添加后您就可以刷新视图以反映在您的应用中 .