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