我想向 Android 添加一个未同步的新日历。我编写了一个应用程序,它使用 API 级别 14 的新 CalendarContract API 执行此操作。以下代码工作正常。我可以在 Android 的日历应用程序中看到新日历并向其添加事件。
问题是当我选择时 Android 日历应用程序崩溃:菜单 -> 日历显示 -> 日历同步
我的代码有问题还是Android日历中的错误?
请注意,我不想实际使用同步适配器。CalendarContract.Calendars 的文档说这不是必需的:“如果需要本地日历,应用程序可以通过作为同步适配器插入并使用 ACCOUNT_TYPE_LOCAL 的 ACCOUNT_TYPE 来实现。” 我知道“作为同步适配器插入”意味着将 (CalendarContract.CALLER_IS_SYNCADAPTER, "true") 附加到 URI。
public class CalendarMapper {
private static final String ACCOUNT_NAME = "private";
private static final String INT_NAME_PREFIX = "priv";
private static Uri buildCalUri() {
return CalendarContract.Calendars.CONTENT_URI
.buildUpon()
.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
.appendQueryParameter(Calendars.ACCOUNT_NAME, ACCOUNT_NAME)
.appendQueryParameter(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL)
.build();
}
private static ContentValues buildContentValues(Calendar calendar) {
String dispName = calendar.getName(); //Calendar.getName() returns a String
String …Run Code Online (Sandbox Code Playgroud) 我做了很多研究,但找不到如何访问 Android 日历事件的真正唯一 ID。我查询以下内容URI:
Context.getContentResolver().query(Events.CONTENT_URI, null, null, null, null);
Run Code Online (Sandbox Code Playgroud)
Cursor在我的 Galaxy Nexus 上查看结果时,没有与iCalGUID我正在寻找的表单(见下文)相似的内容。但是,当在 HTC One S 上执行相同的查询时,我注意到 HTC 已将其iCalGUID作为额外的列字段包含在内,它返回的正是我正在寻找的 ID 类型。它看起来像这样:
9ced5c2c-6ed9-481f-9f69-9a064810ac0f
Run Code Online (Sandbox Code Playgroud)
iCalGUID不过,这个字段看起来不像是 Android SDK 标准,所以我无法在其他 Android 手机上获取此 ID。我的问题是,有什么方法可以以标准 Android 的方式获得这种类型的 ID?我现在的目标是 ICS,但希望将来能够灵活地将其扩展到以前的版本。
如果我应该使用其他类型的 ID,那也很好。注意:我不是在寻找Events._ID专栏。我需要我的 ID 在所有设备和所有类型Account(Google、Exchange、Hotmail 等)中都是唯一的
谢谢!
我正在设置一个警报,我从a TextView和AM/PM通过一个小时和分钟Spinner.以下是我初始化Calendar对象的方法:
Calendar calen = Calendar.getInstance();
calen.set(Calendar.HOUR_OF_DAY, alarmHour); //alarmHour from TextView
calen.set(Calendar.MINUTE, alarmMinute); //alarmMinute from TextView
calen.set(Calendar.SECOND, 0);
calen.set(Calendar.MILLISECOND, 0);
if(amorpm.equals("PM") //amorpm from Spinner
{
calen.set(Calendar.AM_PM, Calendar.PM);
}
else
{
calen.set(Calendar.AM_PM, Calendar.AM);
}
Run Code Online (Sandbox Code Playgroud)
问题是此对象的小时值Calendar有时是正确的,即用户输入的值TextView(并且始终为1到12).但有时,该值等于当前小时.例如,如果当前时间是晚上11:30,并且我将警报设置为上午9:30,则" 小时"字段的值为11.一个奇怪的事情是,当我将Calendar对象的名称更改为其他内容时,比如cal,它可以工作.但是以后不会工作.可能有什么不对?
谢谢你的帮助!


在日历中,当我选择日期时,我需要更改网格项的背景颜色,并删除以前所选项的背景.当我点击并按住日期10时(如图2所示),它显示橙色.但是当我没有聚焦鼠标时,它没有显示颜色.
gridcell.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
String date_month_year = (String) v.getTag();
selected_date = date_month_year;
String[] day_color = date_month_year.split("-");
String theday = day_color[0];
selectedDateEvents(theday);
listadapter.notifyDataSetChanged();
prev_pos = cur_pos;
cur_pos = position;
Log.d("curr and prev", position+" n "+prev_pos);
parent.getChildAt(cur_pos).setBackgroundResource(R.drawable.calendar_tile_small);
parent.getChildAt(prev_pos).setBackgroundResource(R.drawable.calendar_tile_small_black);
GridCellAdapter.this.notifyDataSetChanged();
}
});
Run Code Online (Sandbox Code Playgroud)
请有人帮帮我吗?
我正在尝试使用以下代码获取具有 UTC 时间的 Date 实例:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Date now = cal.getTime();
Run Code Online (Sandbox Code Playgroud)
这看起来很简单,但是如果我检查 IntelliJ 调试器中的值,我会得到不同的日期cal和now:
cal:java.util.GregorianCalendar[time=1405690214219,areFieldsSet=true,lenient=true,zone=GMT,firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2014,MONTH=6,WEEK_OF_YEAR=29,WEEK3OF_OF_ ,DAY_OF_MONTH=18,DAY_OF_YEAR=199,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=1, HOUR_OF_DAY=13 ,MINUTE=30,SECOND=14,MILLISECOND=219,ZONE_OFFSET
now:2014 年 7 月 18 日星期五 10:30:14 BRT
正如你所看到的,cal是提前 3 小时now......我做错了什么?
提前致谢。
[编辑] 看起来TimeZone.setDefault(TimeZone.getTimeZone("UTC"));在上面的代码完成工作之前......
我正在学习如何使用Android日历.到目前为止,我能够显示有关现有日历的信息.我也可以创建自己的本地日历 - 测试代码如下:
private void createCalendarTest()
{
Uri.Builder builder = Calendars.CONTENT_URI.buildUpon();
builder.appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER, "true")
.appendQueryParameter(Calendars.ACCOUNT_NAME, "private")
.appendQueryParameter(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
Uri uri = builder.build();
ContentValues values = new ContentValues();
values.put(Calendars.NAME, "TEST");
values.put(Calendars.CALENDAR_DISPLAY_NAME, "Calendar named TEST");
values.put(Calendars.SYNC_EVENTS, false);
values.put(Calendars.VISIBLE, true);
getContentResolver().insert(uri, values);
}
Run Code Online (Sandbox Code Playgroud)
实际上,我可以创建许多只有不同的日历_ID.我在别处读过,我只能在使用同步适配器时创建日历.现在,我该如何删除日历?我希望URI还必须包含同步适配器信息和_ID已删除日历的信息.我尝试了以下代码,但我没有成功:
private void deleteCalendarTest()
{
Uri.Builder builder = Calendars.CONTENT_URI.buildUpon();
builder.appendPath("6") // here for testing; I know the calender has this ID
.appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER, "true")
.appendQueryParameter(Calendars.ACCOUNT_NAME, "private")
.appendQueryParameter(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
Uri uri = builder.build();
getContentResolver().delete(uri, null, null);
Toast.makeText(this, "??? deleteCalendarTest() …Run Code Online (Sandbox Code Playgroud) 有没有一种好方法可以像我想要的那样在 android 的日历视图中突出显示特定/不同的日期?谢谢!
我正在尝试使用 CUSTOM_APP_URI 从日历事件打开我的 android 应用程序。
这是我用于将事件插入日历的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar beginCal = Calendar.getInstance();
beginCal.set(2015, 11, 10, 4, 30);
long startTime = beginCal.getTimeInMillis();
Calendar endCal = Calendar.getInstance();
endCal.set(2015, 11, 10, 4, 30);
long endTime = endCal.getTimeInMillis();
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.CALENDAR_ID, 1);
values.put(CalendarContract.Events.TITLE, "Check Demo Calendar4");
values.put(CalendarContract.Events.DTSTART, startTime);
values.put(CalendarContract.Events.DTEND, endTime);
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
values.put(CalendarContract.Events.CUSTOM_APP_PACKAGE, getPackageName());
values.put(CalendarContract.Events.CUSTOM_APP_URI, "calendar://1");
getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);
}
Run Code Online (Sandbox Code Playgroud)
日历显示完美,但问题是即使在插入事件后也没有在我的日历事件的详细信息页面中显示 URI。使用 CUSTOM_APP_URI 插入通风口有什么问题?有什么帮助吗?
In order to go to the calendar at a specific time, we use this (based on this link) :
@Nullable
public static Intent prepareIntentForCalendar(final Context context, final Date date) {
Intent intent = null;
final Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
ContentUris.appendId(builder, date.getTime());
intent = new Intent(Intent.ACTION_VIEW).setData(builder.build());
final PackageManager pm = context.getPackageManager();
final ResolveInfo resolveActivity = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY
| PackageManager.GET_RESOLVED_FILTER);
if (resolveActivity == null)
return null;
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY
| Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
return intent;
}
Run Code Online (Sandbox Code Playgroud)
Only if it's …
android android-intent android-calendar android-securityexception
通过我的应用程序,我使用创建日历事件ContentResolver。活动已成功创建,您可以在系统日历应用程序中看到它们。当用户使用 Google 日历应用程序时会出现问题。有时,事件需要几分钟的时间才会出现。此外,当该事件最终出现在 Google 日历中并且用户将其删除时,它仍然会在系统日历中再次可见几分钟。
在我的应用程序中,我想创建在 caledndar 中打开新创建的事件的意图,但由于该同步问题,它没有被显示,因为它还不可见。另外,在创建新事件之前,我会检查它是否已经存在,并且由于同步,它似乎没有被删除,并且我没有在应该创建新事件时创建新事件。
这是我创建事件的方式:
fun addEventToCalendar(context: Context,
title: String,
description: String?,
startDateMillis: Long,
endDateInMillis: Long,
tag: String): Long? {
val timeZone = TimeZone.getDefault()
val values = ContentValues().apply {
put(CalendarContract.Events.DTSTART, startDateMillis)
put(CalendarContract.Events.DTEND, endDateInMillis)
put(CalendarContract.Events.TITLE, title)
description?.let { put(CalendarContract.Events.DESCRIPTION, description) }
put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.id)
put(CalendarContract.Events.CALENDAR_ID, getCalendarId(context))
put(CalendarContract.Events.UID_2445, tag)
}
val uri = context.contentResolver.insert(CalendarContract.Events.CONTENT_URI, values)
return uri?.lastPathSegment?.toLong()
}
fun checkIfEventAlreadyExist(context: Context, tag: String): Long? {
val projection = arrayOf(CalendarContract.Events._ID, CalendarContract.Events.DTSTART, CalendarContract.Events.DTEND, CalendarContract.Events.UID_2445)
val cursor = context.contentResolver.query(
CalendarContract.Events.CONTENT_URI, …Run Code Online (Sandbox Code Playgroud) android-calendar ×10
android ×9
android-4.0-ice-cream-sandwich ×1
highlighting ×1
icalendar ×1
java ×1