当我尝试向ContentProvider添加日历时,我遇到了一个奇怪的问题,
它通常有效但是我正在测试一个设备而它没有 - 我崩溃了。 此设备:平板电脑与Android 4.0.4(API15)。
我的一些代码:
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, ACCOUNT_TYPE).build();
}
private static ContentValues buildContentValues(CalendarData cd) {
String dispName = cd.getName();
String intName = INT_NAME_PREFIX + dispName;
final ContentValues cv = new ContentValues();
cv.put(Calendars.ACCOUNT_NAME, ACCOUNT_NAME);
cv.put(Calendars.ACCOUNT_TYPE, ACCOUNT_TYPE);
cv.put(Calendars.NAME, intName);
cv.put(Calendars.CALENDAR_DISPLAY_NAME, dispName);
cv.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_NONE );
cv.put(Calendars.OWNER_ACCOUNT, ACCOUNT_NAME);
cv.put(Calendars.VISIBLE, cd.isVisible() ? 1 : 0 );
cv.put(Calendars.SYNC_EVENTS, 1 );
return cv;
}
public static long addCalendar(Context context, final CalendarData cd,
final ContentResolver cr) {
if (cd == null)
throw new IllegalArgumentException();
/*
* On Android < 4.1 create an account for our calendars. Using ACCOUNT_TYPE_LOCAL would
* cause these bugs:
*
* - On Android < 4.1: Selecting "Calendars to sync" in the calendar app it crashes with
* NullPointerException. see http://code.google.com/p/android/issues/detail?id=27474
*
* - On Android <= 2.3: Opening the calendar app will ask to create an account first even
* when local calendars are present
*/
long calID;
// Add calendar
final ContentValues cv = buildContentValues(cd);
Uri uri = cr.insert( buildCalUri(), cv );
calID = Long.parseLong( uri.getLastPathSegment() );
return calID;
}
我得到了:
E/AndroidRuntime( 3221): FATAL EXCEPTION: AsyncTask #3
E/AndroidRuntime( 3221): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime( 3221): at android.os.AsyncTask$3.done(AsyncTask.java:278)
E/AndroidRuntime( 3221): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
E/AndroidRuntime( 3221): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
E/AndroidRuntime( 3221): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
E/AndroidRuntime( 3221): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
E/AndroidRuntime( 3221): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
E/AndroidRuntime( 3221): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
E/AndroidRuntime( 3221): at java.lang.Thread.run(Thread.java:856)
E/AndroidRuntime( 3221): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 3221): at android.os.Parcel.readException(Parcel.java:1333)
E/AndroidRuntime( 3221): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:182)
E/AndroidRuntime( 3221): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136)
E/AndroidRuntime( 3221): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:415)
E/AndroidRuntime( 3221): at android.content.ContentResolver.insert(ContentResolver.java:733)
E/AndroidRuntime( 3221): at com.my.app.CalendarMapper.addCalendar(CalendarMapper.java:128)
第128行CalendarMapper是: Uri uri = cr.insert(buildCalUri(),cv);
我真的不知道是什么导致这个例外。 有什么想法吗?
提前致谢!
答案 0 :(得分:0)
您需要使用AsycTask。请告诉我们一些代码。
答案 1 :(得分:0)
BuildCallURI和buildContentValues与其列不匹配,向builCalURI添加更多查询参数并确保它们与ContentValues匹配