如何使用新的Android 4.0 Ice Cream Sandwich API阅读和编辑Android日历活动?

TJL*_*oto 13 android android-calendar android-4.0-ice-cream-sandwich

当他们想要添加新活动时,我们正在尝试向用户显示冰淇淋三明治日历视图.我们只能在模拟器中测试它.

另一个问题是我们找不到任何使用CalendarProvider的示例.在处理三明治日历时,这是正确的课程吗?

使用Google Gdata API会更容易吗?

[编辑]所以我们工作的是向日历添加一个事件,但不是通过API,我们在正确的视图中打开日历.但现在问题是它在模拟器中不起作用,因为我们无法同步日历.

所以问题是:如何使用新的Android 4.0 Ice Cream Sandwich API阅读和编辑Android日历事件?

Tre*_*hns 53

这是允许您直接添加事件的代码:

import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.provider.CalendarContract;

import java.util.Calendar;

// Construct event details
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();

// Insert Event
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
TimeZone timeZone = TimeZone.getDefault();
values.put(CalendarContract.Events.DTSTART, startMillis);
values.put(CalendarContract.Events.DTEND, endMillis);
values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
values.put(CalendarContract.Events.TITLE, "Walk The Dog");
values.put(CalendarContract.Events.DESCRIPTION, "My dog is bored, so we're going on a really long walk!");
values.put(CalendarContract.Events.CALENDAR_ID, 3);
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);

// Retrieve ID for new event
String eventID = uri.getLastPathSegment();
Run Code Online (Sandbox Code Playgroud)

您需要CALENDAR_ID,所以这里是查询日历列表的方法:

Uri uri = CalendarContract.Calendars.CONTENT_URI;
String[] projection = new String[] {
       CalendarContract.Calendars._ID,
       CalendarContract.Calendars.ACCOUNT_NAME,
       CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
       CalendarContract.Calendars.NAME,
       CalendarContract.Calendars.CALENDAR_COLOR
};

Cursor calendarCursor = managedQuery(uri, projection, null, null, null);
Run Code Online (Sandbox Code Playgroud)

您需要请求android.permission.READ_CALENDAR所有这些权限才能生效.

如果您想避免请求权限,您还可以要求日历应用代表您创建新事件Intent:

Intent intent = new Intent(Intent.ACTION_INSERT)
         .setType("vnd.android.cursor.item/event")
         .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
         .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
         .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY , false) // just included for completeness
         .putExtra(Events.TITLE, "My Awesome Event")
         .putExtra(Events.DESCRIPTION, "Heading out with friends to do something awesome.")
         .putExtra(Events.EVENT_LOCATION, "Earth")
         .putExtra(Events.RRULE, "FREQ=DAILY;COUNT=10") 
         .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
         .putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE)
         .putExtra(Intent.EXTRA_EMAIL, "my.friend@example.com");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

  • 正如@Durai所说,`EVENT_TIMEZONE`也必须添加到`ContentValues`中 (5认同)

Dur*_*rai 10

您可以使用以下代码设置时区,它适用于我

TimeZone timeZone = TimeZone.getDefault();
values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
Run Code Online (Sandbox Code Playgroud)