我正在尝试将事件添加到默认的android日历中,而不是要求用户确认保存事件。 (所以没有意图)
以下代码没有编译错误或运行时错误。单击该按钮后,不会显示任何错误,也不会向Android日历应用程序添加任何事件。
我已经检查了清单中的日历授权,并在graddle中查看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 ?");
}
}
答案 0 :(得分:1)
默认日历ID是3,但您有0,这可能就是您没有看到添加到日历的原因。
从Calendar Provider developer doc开始,它将日历ID硬编码为3。
W: GPG error: http://packages.cloud.google.com/apt google-cloud-logging-wheezy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 3746C208A7317B0F
W: The repository 'http://packages.cloud.google.com/apt google-cloud-logging-wheezy InRelease' is not signed.
要确保3是主要日历ID,您可以参考此post查询主要/默认日历
答案 1 :(得分:1)
这会将事件添加到用户日历。
向清单添加权限:
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<permission android:name="android.permission.READ_CALENDAR" />
<permission android:name="android.permission.WRITE_CALENDAR" />
<permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
添加到oncreate:
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CALENDAR}, 1);
添加到mainactivity: (视图视图)(MenuItem mi)用于菜单抽屉。
public void onAddEventCal(MenuItem mi) {
long calID = 3;
ContentResolver cr = getContentResolver();
Calendar beginTime = Calendar.getInstance();
beginTime.set(2019, Calendar.FEBRUARY, 25, 3, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2019, Calendar.FEBRUARY, 25, 3, 30);
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis());
values.put(CalendarContract.Events.TITLE, "Connect Treadmill app");
values.put(CalendarContract.Events.DESCRIPTION, "Treadmill Data");
values.put(CalendarContract.Events.CALENDAR_ID, calID);
values.put(CalendarContract.Events.EVENT_TIMEZONE, "Europe/Paris");
values.put(CalendarContract.Events.EVENT_LOCATION, "Paris");
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
Toast.makeText(this, "Calendar Event added", Toast.LENGTH_SHORT).show();
}
答案 2 :(得分:0)
我认为问题在于许可 尝试使用这些代码
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},MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);}else if(ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) == PackageManager.PERMISSION_GRANTED){
}
答案 3 :(得分:0)
此权限请求是我使用的权限。您可以修改所需的权限。
onCreate
// Ask for location && calendar permission if not already allowed
Request_Permissions();
ManActivity
//Request permission
private void Request_Permissions()
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CALENDAR, android.Manifest.permission.ACCESS_COARSE_LOCATION
}, 1);
}
答案 4 :(得分:0)
我遇到此问题,然后使用以下代码获取日历ID。
private fun getCalendarId(context: Context) : Long? {
val projection = arrayOf(Calendars._ID, Calendars.CALENDAR_DISPLAY_NAME)
var calCursor = context.contentResolver.query(
Calendars.CONTENT_URI,
projection,
Calendars.VISIBLE + " = 1 AND " + Calendars.IS_PRIMARY + "=1",
null,
Calendars._ID + " ASC"
)
if (calCursor != null && calCursor.count <= 0) {
calCursor = context.contentResolver.query(
Calendars.CONTENT_URI,
projection,
Calendars.VISIBLE + " = 1",
null,
Calendars._ID + " ASC"
)
}
if (calCursor != null) {
if (calCursor.moveToFirst()) {
val calName: String
val calID: String
val nameCol = calCursor.getColumnIndex(projection[1])
val idCol = calCursor.getColumnIndex(projection[0])
calName = calCursor.getString(nameCol)
calID = calCursor.getString(idCol)
Log.d("Calendar name = $calName Calendar ID = $calID")
calCursor.close()
return calID.toLong()
}
}
return null
}
因此请勿将0、1或3作为日历ID 。请改用上述功能。