android - 添加日历时出现Android异常

标签 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);

而且我真的不知道什么会导致这种异常。
有任何想法吗 ?

提前致谢!

最佳答案

您需要为此使用AsyncTask。请给我们看一些代码。

关于android - 添加日历时出现Android异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22224914/

相关文章:

windows-7 - Winsound使Tkinter GUI崩溃

ruby-on-rails - 使用 Rails 将日历转换为表单?

android - 将日历对象转换为日期 android 的问题

java - 如何在媒体播放器准备服务时添加加载对话框 (Android)

android - 如何从通知中触发广播接收器?

arrays - 按日期顺序对数组进行排序会导致设备崩溃

java - 使java应用程序崩溃的工具/方法

android - 动态设置指向 strings.xml 中文本的链接

android - 在游标数据中添加值

c - 使用文件存储日历