Sakala Bhargava Ram
Sakala Bhargava Ram

Reputation: 77

Adding Reminders in Android

I am new to android and I am developing an app to add a remainder on a button click. I have gone through Programmatically add reminder in android calendar? and Reminder Functionality. But the app crashes with an SQLite Exception Error, when I run in my emulator(Marshmallow). I couldnt understand what changes are made in Marshmallow regarding Calendar API. Would like to know the reason for the exception. Stack Trace:

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) 

My gradle file is:

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'

On Button Click This Activity would get triggered:

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();
    }
}

Upvotes: 2

Views: 1006

Answers (1)

Punit Sharma
Punit Sharma

Reputation: 2947

android.database.sqlite.SQLiteException

There is no problem in your code

Above is happening due to your emulator does not have any account(google) sync/signed in it. As from marshmallow and above i have seen if your calendar does have any account in it. Above exception will occur. You cannot do anything of it.

Upvotes: 3

Related Questions