android - 通过日历提供程序添加的事件未显示在 Android 日历应用程序中

标签 android calendar google-calendar-api android-calendar

我正在尝试将事件添加到默认的 android 日历,而不要求用户确认是否保存该事件。 (所以不是故意的)

以下代码没有编译错误和运行时错误。单击该按钮后,不会显示任何错误,也不会向 Android 日历应用程序添加任何事件。

我已经检查了 list 中的日历授权并检查了 gradle 中的 de min sdk 版本(我在 android studio 上工作)

public void onAddEventClicked(View view) {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
    else if(ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) == PackageManager.PERMISSION_GRANTED) {
        ContentResolver cr = getContentResolver();
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2018, Calendar.OCTOBER, 27, 13, 30);
        Calendar endTime = Calendar.getInstance();
        endTime.set(2018, Calendar.OCTOBER, 27, 17, 30);
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
        values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis());
        values.put(CalendarContract.Events.TITLE, "doctor");
        values.put(CalendarContract.Events.DESCRIPTION, "doctor appointment");
        values.put(CalendarContract.Events.CALENDAR_ID, 0);
        values.put(CalendarContract.Events.EVENT_TIMEZONE, "Europe/Paris");
        values.put(CalendarContract.Events.EVENT_LOCATION, "Paris");
        Uri EVENTS_URI = Uri.parse(CalendarContract.Events.CONTENT_URI.toString());
        Uri uri = cr.insert(EVENTS_URI, values);
        Button b = (Button) findViewById(R.id.addEventButton);
        b.setText("Did it worked ?");
    }
}

最佳答案

默认的日历 ID 是 3,但你有 0,这可能就是你看不到它被添加到日历的原因。

来自Calendar Provider developer doc ,它将日历 ID 硬编码为 3。

long calID = 3;
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();
...

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);

// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());

要确保 3 是主日历 ID,您可以引用此 post用于查询主/默认日历

关于android - 通过日历提供程序添加的事件未显示在 Android 日历应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965732/

相关文章:

ios - EKRecurrenceRule不起作用

json - 如何在 swift 中创建特定的数据结构。 Swifty Json 没有用 :(

android - 使用 Xamarin 的 NDK Android 应用程序中的 DllNotFoundException

android - 修改并重新编译Android SDK

android - ImageView根据android中的图像大小动态调整大小

ios - 如何以编程方式将参与者添加到我的 iPhone 日历事件?

google-calendar-api - Google 日历和 Twilio 作为 On-Call

java - 如何将两种不同类型的字符串格式解析为日期?

android - 如何以编程方式填充 Android 设备日历应用程序上的提醒部分?

iOS - 防止重复将事件添加到日历