我只是想从Calendar Activity
启动Activity
。我在Button OnClickListener
:
Intent calIntent = new Intent(Intent.ACTION_INSERT);
calIntent.setData(Uri.parse("content://com.android.calendar/events/"));
startActivity(calIntent);
但是当我点击Button
时,我的设备会挂起,然后我必须强制关闭不响应的应用。
答案 0 :(得分:1)
这是因为Calendar 内容Uri因android的不同版本(API级别)而异。尝试使用此代码获取各个API级别的日历Uri。
/*
* Determines if it's a pre 2.1 or a 2.2 calendar Uri, and returns the Uri
*/
private String getCalendarUriBase(Context con) {
String calendarUriBase = null;
Uri calendars = Uri.parse("content://calendar/calendars");
Cursor managedCursor = null;
try {
managedCursor = managedQuery(calendars, null, null, null, null);
} catch (Exception e) {
// eat
}
if (managedCursor != null) {
calendarUriBase = "content://calendar/";
} else {
calendars = Uri.parse("content://com.android.calendar/calendars");
try {
managedCursor = managedQuery(calendars, null, null, null, null);
} catch (Exception e) {
// statement to print the stacktrace
}
if (managedCursor != null) {
calendarUriBase = "content://com.android.calendar/";
}
}
return calendarUriBase;
}
答案 1 :(得分:1)
这是我个人的CalendarOrganizer课程,他们更改了日历可以从冰淇淋三明治访问的方式,事实上在冰淇淋三明治之前,建议使用他们的在线服务来更新日历,因为谷歌日历可能会被更改或甚至没有安装
修改强>: 我了解到我需要处理意图问题,但是冰淇淋三明治上的一些手机会从Intent.ACTION_INSERT崩溃,但不会从Intent.ACTION_EDIT崩溃。因此我更新了我的实施。感谢this post提供解决方案。
import android.content.Context;
import android.content.Intent;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Events;
public class CalendarOrganizer {
private final static int ICE_CREAM_BUILD_ID = 14;
/**
* Creates a calendar intent going from startTime to endTime
* @param startTime
* @param endTime
* @param context
* @return true if the intent can be handled and was started,
* false if the intent can't be handled
*/
public static boolean createEvent(long startTime, long endTime, String title, String description,
String location, boolean isAllDay, Context context) {
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < ICE_CREAM_BUILD_ID) {
// all SDK below ice cream sandwich
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra("beginTime", startTime);
intent.putExtra("endTime", endTime);
intent.putExtra("title", title);
intent.putExtra("description", description);
intent.putExtra("eventLocation", location);
intent.putExtra("allDay", isAllDay);
// intent.putExtra("rrule", "FREQ=YEARLY");
try {
context.startActivity(intent);
return true;
} catch(Exception e) {
return false;
}
} else {
// ice cream sandwich and above
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime);
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime);
intent.putExtra(Events.TITLE, title);
intent.putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE);
intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY , isAllDay);
intent.putExtra(Events.DESCRIPTION, description);
intent.putExtra(Events.EVENT_LOCATION, location);
// intent.putExtra(Events.RRULE, "FREQ=DAILY;COUNT=10")
try {
context.startActivity(intent);
return true;
} catch(Exception e) {
return false;
}
}
}
}
答案 2 :(得分:0)
这是适用于我的代码(使用&gt; v4):
Uri uri = Uri.parse("content://com.android.calendar/events");
Intent calIntent = new Intent("android.intent.action.INSERT", uri)
.setAction(Intent.ACTION_INSERT);
startActivity(calIntent);
答案 3 :(得分:0)
为了记录,ICS日历意图记录在这里
http://developer.android.com/guide/topics/providers/calendar-provider.html#intents
答案 4 :(得分:0)
这是适合我的代码
无需在清单中创建活动。
将适用于所有Android平台。
将显示当月的日历视图
long epoch = new Date.getTime();
Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
ContentUris.appendId(builder, epoch);
Intent intent = new Intent(Intent.ACTION_VIEW)
.setData(builder.build());
startActivity(intent);