android - 在 Android 中添加提醒

标签 android notifications calendar

我是 Android 新手,我正在开发一个应用程序,用于在单击按钮时添加余数。我已经经历过Programmatically add reminder in android calendar?Reminder Functionality 。但是当我在模拟器(Marshmallow)中运行时,应用程序崩溃并出现 SQLite 异常错误。我无法理解 Marshmallow 对日历 API 进行了哪些更改。想知道异常的原因。 堆栈跟踪:

07-09 23:23:37.197 9569-9569/com.example.bhargava.cse E/UncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bhargava.cse/com.example.bhargava.cse.notifications}: android.database.sqlite.SQLiteException
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                           at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:148)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                        Caused by: android.database.sqlite.SQLiteException
                                                                           at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:179)
                                                                           at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
                                                                           at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
                                                                           at android.content.ContentResolver.insert(ContentResolver.java:1231)
                                                                           at com.example.bhargava.cse.notifications.addReminderInCalendar(notifications.java:57)
                                                                           at com.example.bhargava.cse.notifications.onCreate(notifications.java:24)
                                                                           at android.app.Activity.performCreate(Activity.java:6237)
                                                                           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                           at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                           at android.os.Looper.loop(Looper.java:148) 
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                           at java.lang.reflect.Method.invoke(Native Method) 
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 


                                                                       --------- beginning of crash
07-09 23:23:37.427 9569-9569/com.example.bhargava.cse E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: com.example.bhargava.cse, PID: 9569
                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bhargava.cse/com.example.bhargava.cse.notifications}: android.database.sqlite.SQLiteException
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                        at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                        at android.os.Looper.loop(Looper.java:148)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                     Caused by: android.database.sqlite.SQLiteException
                                                                        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:179)
                                                                        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
                                                                        at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
                                                                        at android.content.ContentResolver.insert(ContentResolver.java:1231)
                                                                        at com.example.bhargava.cse.notifications.addReminderInCalendar(notifications.java:57)
                                                                        at com.example.bhargava.cse.notifications.onCreate(notifications.java:24)
                                                                        at android.app.Activity.performCreate(Activity.java:6237)
                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:148) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我的gradle文件是:

apply plugin: 'com.android.application'

android {
compileSdkVersion 25

buildToolsVersion '25.0.3'

dexOptions {
    javaMaxHeapSize "4g"
}

defaultConfig {
    applicationId "com.example.bhargava.cse"
    minSdkVersion 19
    targetSdkVersion 23
    versionCode 1
    multiDexEnabled true
    versionName "1.0"
}
buildTypes {
    release {
        shrinkResources true
        minifyEnabled false
        proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'

compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.firebase:firebase-client-android:2.5.0'
compile 'com.google.android.gms:play-services:10.2.6'  // add this line
compile 'com.google.firebase:firebase-database:10.0.1' // add this line
compile 'com.google.firebase:firebase-auth:10.0.1'     // add this line
}

apply plugin: 'com.google.gms.google-services'

单击按钮时将触发此 Activity :

package com.example.bhargava.cse;

import android.content.ContentResolver;
import android.content.ContentValues;
import java.util.Calendar;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.CalendarContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import java.util.TimeZone;

public class notifications extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notifications);
    addReminderInCalendar();
}

/** Adds Events and Reminders in Calendar. */
private void addReminderInCalendar() {
    Calendar cal = Calendar.getInstance();
    Uri EVENTS_URI = Uri.parse(getCalendarUriBase(true) + "events");
    ContentResolver cr = getContentResolver();
    TimeZone timeZone = TimeZone.getDefault();

    /** Inserting an event in calendar. */
    ContentValues values = new ContentValues();
    values.put(CalendarContract.Events.CALENDAR_ID, 1);
    values.put(CalendarContract.Events.TITLE, "Sanjeev Reminder 01");
    values.put(CalendarContract.Events.DESCRIPTION, "A test Reminder.");
    values.put(CalendarContract.Events.ALL_DAY, 0);
    // event starts at 11 minutes from now
    values.put(CalendarContract.Events.DTSTART, cal.getTimeInMillis() + 1 * 60 * 1000);
    // ends 60 minutes from now
    values.put(CalendarContract.Events.DTEND, cal.getTimeInMillis() + 2 * 60 * 1000);
    values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
    values.put(CalendarContract.Events.HAS_ALARM, 1);
    Uri event = cr.insert(EVENTS_URI, values);

    // Display event id.
    Toast.makeText(getApplicationContext(), "Event added :: ID :: " + event.getLastPathSegment(), Toast.LENGTH_SHORT).show();

    /** Adding reminder for event added. */
    Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(true) + "reminders");
    values = new ContentValues();
    values.put(CalendarContract.Reminders.EVENT_ID, Long.parseLong(event.getLastPathSegment()));
    values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
    values.put(CalendarContract.Reminders.MINUTES, 10);
    cr.insert(REMINDERS_URI, values);
}

/** Returns Calendar Base URI, supports both new and old OS. */
private String getCalendarUriBase(boolean eventUri) {
    Uri calendarURI = null;
    try {
        if (android.os.Build.VERSION.SDK_INT <= 7) {
            calendarURI = (eventUri) ? Uri.parse("content://calendar/") : Uri.parse("content://calendar/calendars");
        } else {
            calendarURI = (eventUri) ? Uri.parse("content://com.android.calendar/") : Uri
                    .parse("content://com.android.calendar/calendars");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return calendarURI.toString();
    }
}

最佳答案

android.database.sqlite.SQLiteException

您的代码没有问题

发生上述情况是因为您的模拟器没有任何帐户(google)同步/登录。从棉花糖及以上内容来看,我已经看到您的日历中是否有任何帐户。就会出现以上异常。你对此无能为力。

关于android - 在 Android 中添加提醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010942/

相关文章:

java - Firebase JobDispatcher 在 1 小时后停止工作

java - 向运行应用程序的每个人发送通知,Android

javascript - 如何使通知保持打开状态直到用户将其关闭?

javascript - 如何为谷歌日历编写谷歌脚本?

ios - 如何将我的文本添加到 iOS 日历访问权限警报?

android - 如何将使用 OkHttp 的 GET 请求的结果保存在局部变量中?

android - 正面相机图像失真

java - 让 Android 游戏更安全,免受黑客攻击

Android GCM "background"通知在单击时不会启动我的应用程序

import - 使用 .ics 文件可以删除旧事件吗?