use*_*863 10 android calendar android-intent
我想从Android应用程序打开日历应用程序,但具体calendarId.
我的代码:
final Intent calIntent = new Intent(Intent.ACTION_EDIT);
calIntent.setType("vnd.android.cursor.item/event");
startActivityForResult(calIntent, RESULT_CODE_OPEN);
Run Code Online (Sandbox Code Playgroud)
但是使用上一个日历打开了意图.我想用他的日历ID打开一个特定的.
我怎样才能做到这一点?
rnr*_*ies 11
一点历史: 查看日历应用程序源代码,我发现清单的这一部分表明哪个类处理Intent.ACTION_EDIT,EditEventActivity.java.然后我找到了这条线; calendarId是从额外的数据中获得的.所以...
在Intent上添加一个额外的长按键CalendarContract.Events.CALENDAR_ID和相应的calendarId样本:
long calendarId = 1234; // here goes your calendar Id
final Intent calIntent = new Intent(Intent.ACTION_EDIT)
.setType("vnd.android.cursor.item/event")
.putExtra(CalendarContract.Events.CALENDAR_ID, calendarId);
startActivityForResult(calIntent, RESULT_CODE_OPEN);
Run Code Online (Sandbox Code Playgroud)
这种方法有点不同.在打开日历应用程序之前,您应该隐藏所有日历,但不能选择所选日历.所以,我已经创建了一个辅助函数来完成它.
private void makeAllCalendarsInvisibleExcept(long calendarId) {
ContentValues updateValues = new ContentValues();
updateValues.put(CalendarContract.Calendars.VISIBLE, 0);
// make all invisible
getContentResolver().update(CalendarContract.Calendars.CONTENT_URI,
updateValues, null, null);
updateValues.clear();
updateValues.put(CalendarContract.Calendars.VISIBLE, 1);
// make calendarId visible
getContentResolver().update(CalendarContract.Calendars.CONTENT_URI,
updateValues, where, null);
}
Run Code Online (Sandbox Code Playgroud)
在这里如何设置它:
makeAllCalendarsInvisibleExcept(calendarId);
Intent calIntent = new Intent();
// for google calendar, first parameter should be "com.google.android.calendar"
// this is intended for android calendar.
ComponentName cn = new ComponentName("com.android.calendar", "com.android.calendar.LaunchActivity");
calIntent.setComponent(cn);
startActivityForResult(calIntent, 4567);
Run Code Online (Sandbox Code Playgroud)
AFAIK,无法打开月视图.但研究永远不会结束,我会尽快做更新.
在DemoApp中,我创建了两个额外的辅助方法来推送和恢复日历可见性状态.看看角落找寻pushCalendarVisibility与restoreCalendarVisibility和onActivityResult
注意:我已经测试了安装和未安装Google日历的应用.Google日历上的AFAIK仅显示DAY视图,而不是每周都显示.
在所有情况下,仅显示所选日历上的事件.
calendarId和Account Name- (回答赏金问题 - 第2部分)calendarIdAccount Name可以使用CalendarContract.Calendars获取abd ,如下所示:
// since API14
Uri uri = CalendarContract.Calendars.CONTENT_URI;
String[] projection = new String[] {
CalendarContract.Calendars._ID,
CalendarContract.Calendars.VISIBLE,
CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
CalendarContract.Calendars.ACCOUNT_NAME,
};
Cursor calendarCursor = getContentResolver().query(uri, projection, null, null, null);
while (calendarCursor.moveToNext()) {
// calendarId
long calendarId = calendarCursor.getLong(0);
// get visibility, warning: if calendar is not visible Intent.ACTION_EDIT doesn't work.
boolean calendarVisible = calendarCursor.getInt(1) == 1;
// get if it's owned, warning: if calendar is not owned Intent.ACTION_EDIT doesn't work.
boolean calendarOwned = calendarCursor.getInt(2) == CalendarContract.Calendars.CAL_ACCESS_OWNER;
// get calendar display name
String calendarName = calendarCursor.getString(3);
// get account name
String accountName = calendarCursor.getString(4);
// do something
}
Run Code Online (Sandbox Code Playgroud)
注意:有更多可用的日历投影选项,建议阅读CalendarContract.Calendars
从API Level 14,Android 4.0(ICE_CREAM_SANDWICH)开始提供此功能
此GitHub存储库中的完整示例.(Android Studio 1.0.0项目)需要同步日历,并且必须由帐户拥有并且必须可见. 更新:示例最新
在Android 4.1.1和Android 5.0 Lollipop预览版上测试
| 归档时间: |
|
| 查看次数: |
1752 次 |
| 最近记录: |