无法删除Android日历
我一直在玩Android来创建本地(非同步)日历,但最终我得到了空无法删除Android日历,android,android-calendar,Android,Android Calendar,我一直在玩Android来创建本地(非同步)日历,但最终我得到了空ACCOUNT\u TYPE和ACCOUNT\u NAME的日历。我可以在以下方面看到它们: getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, null, CalendarContract.Calendars.ACCOUNT_TYPE + " IS NULL", null, null); 现在,我的谷歌日历应用程序在启动时崩溃:( 我试图用这段代
ACCOUNT\u TYPE
和ACCOUNT\u NAME
的日历。我可以在以下方面看到它们:
getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, null, CalendarContract.Calendars.ACCOUNT_TYPE + " IS NULL", null, null);
现在,我的谷歌日历应用程序在启动时崩溃:(
我试图用这段代码删除这些虚拟日历(在成功请求WRITE\u CALENDAR
权限后):
但它引发了以下错误
java.lang.IllegalArgumentException:名称不能为空:null
在
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
在
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
在
android.content.ContentProviderProxy.delete(ContentProviderNative.java:544)
在android.content.ContentResolver.delete上(ContentResolver.java:1327)
我认为这是由于他们的帐户类型/名称为空
你知道我怎样才能摆脱他们吗
注意:该设备的Android版本是6.0.1(请注意,所有链接都指向5.1.1日历提供程序,但可能可以安全地假设它在Android 6中工作相同):
modifyCalendarSubscription
被调用,用于删除每个日历(无论您如何选择它们)modifyCalendarSubscription
中,提供程序读取每个日历的“帐户名称”和“帐户类型”列,并尝试创建一个null
,因此在检查null
值时,它会在中崩溃。这就是您看到的eException实际抛出的地方帐户
构造函数中失败,因为数据库中的帐户名为空
我还没有检查它,但您可能可以使用更新操作覆盖帐户名和类型。因此,请尝试将其设置为非null
如果不起作用,您需要root访问权限手动删除日历,或者转到设置->应用程序->所有应用程序->日历存储并清除整个日历数据库(清除数据)
更新
覆盖ACCOUNT\u NAME
和ACCOUNT\u TYPE
列只有在您设法匹配通过此行的条件时才会起作用:给定该行以及到达该行的条件在Android 6中仍然存在。
它认为,如果你不将日历id附加到Uri
中,也不根据日历id选择日历,那么应该可以工作。因此,让你的删除更新,并将帐户名
和帐户类型
重置为非null
应该可以解决问题。我也有同样的问题em.I按如下方式更新日历行:
private void updateNullAccount() {
String selection = CalendarContract.Calendars.ACCOUNT_NAME + " IS NULL";
Uri uri = CalendarContract.Calendars.CONTENT_URI;
uri = SyncAdapter.asSyncAdapter(uri);
ContentValues values = new ContentValues();
values.put(CalendarContract.Calendars.ACCOUNT_NAME, "NAME BITCH NAME");
values.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
int count = getContentResolver().update(uri, values, selection, null);
count++;
}
在按帐户名称删除日历后,我在更新中有
创建本地日历时,必须附加查询参数(如同步适配器、帐户名称和帐户类型)并且在ContentValues中添加相同的帐户名和帐户类型参数。我明白了。您在系统日志中看到任何异常吗?我在问题中提出的唯一一个异常是您的设备已根目录。在这种情况下,您可以手动从数据库中删除日历。在覆盖帐户类型
和帐户名
后,我可以成功s完全删除它们。谢谢。null
不能是null
。Duh。这里有什么不清楚的地方吗?:P我在插入事件方面也有同样的问题。谷歌的异常消息没有什么帮助。
private void updateNullAccount() {
String selection = CalendarContract.Calendars.ACCOUNT_NAME + " IS NULL";
Uri uri = CalendarContract.Calendars.CONTENT_URI;
uri = SyncAdapter.asSyncAdapter(uri);
ContentValues values = new ContentValues();
values.put(CalendarContract.Calendars.ACCOUNT_NAME, "NAME BITCH NAME");
values.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
int count = getContentResolver().update(uri, values, selection, null);
count++;
}