添加日历时Android异常

时间:2014-03-06 12:43:05

标签: android crash calendar provider

当我尝试向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);

我真的不知道是什么导致这个例外。 有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您需要使用AsycTask。请告诉我们一些代码。

答案 1 :(得分:0)

BuildCallURI和buildContentValues与其列不匹配,向builCalURI添加更多查询参数并确保它们与ContentValues匹配

相关问题