web-dev-qa-db-de.com

Wie lese und bearbeite ich Android-Kalenderereignisse mit der neuen Android 4.0 Ice Cream Sandwich-API?

Wir versuchen, dem Benutzer die Ansicht des Ice Cream Sandwich-Kalenders anzuzeigen, wenn er ein neues Ereignis hinzufügen möchte. Wir können dies nur im Emulator testen.

Das andere Problem ist, dass wir keine Beispiele für die Verwendung von CalendarProvider finden können. Dies ist die richtige Klasse, wenn es um den Umgang mit Sandwich-Kalender geht?

Wäre dies mit der Google Gdata-API einfacher?

[BEARBEITEN] Also, was wir arbeiteten, war das Hinzufügen eines Ereignisses zum Kalender, aber es war nicht über die API, wir öffnen den Kalender in der richtigen Ansicht. Das Problem ist jedoch, dass es im Emulator nicht funktioniert, da der Kalender nicht synchronisiert werden konnte.

Die Frage ist also: Wie kann man Android-Kalenderereignisse mit der neuen Android 4.0 Ice Cream Sandwich-API lesen und möglicherweise bearbeiten?

14
TJLuoto

Hier ist der Code, mit dem Sie ein Ereignis direkt hinzufügen können:

import Android.content.ContentResolver;
import Android.content.ContentValues;
import Android.net.Uri;
import Android.provider.CalendarContract;

import Java.util.Calendar;

// Construct event details
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();

// Insert Event
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
TimeZone timeZone = TimeZone.getDefault();
values.put(CalendarContract.Events.DTSTART, startMillis);
values.put(CalendarContract.Events.DTEND, endMillis);
values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
values.put(CalendarContract.Events.TITLE, "Walk The Dog");
values.put(CalendarContract.Events.DESCRIPTION, "My dog is bored, so we're going on a really long walk!");
values.put(CalendarContract.Events.CALENDAR_ID, 3);
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);

// Retrieve ID for new event
String eventID = uri.getLastPathSegment();

Sie benötigen die CALENDAR_ID. So können Sie die Liste der Kalender abfragen:

Uri uri = CalendarContract.Calendars.CONTENT_URI;
String[] projection = new String[] {
       CalendarContract.Calendars._ID,
       CalendarContract.Calendars.ACCOUNT_NAME,
       CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
       CalendarContract.Calendars.NAME,
       CalendarContract.Calendars.CALENDAR_COLOR
};

Cursor calendarCursor = managedQuery(uri, projection, null, null, null);

Sie müssen die Android.permission.READ_CALENDAR-Berechtigung anfordern, damit all dies funktioniert.

Wenn Sie vermeiden möchten, Berechtigungen anzufordern, können Sie die Kalender-App auch dazu auffordern, ein neues Ereignis in Ihrem Namen zu erstellen, indem Sie eine Intent verwenden:

Intent intent = new Intent(Intent.ACTION_INSERT)
         .setType("vnd.Android.cursor.item/event")
         .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
         .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
         .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY , false) // just included for completeness
         .putExtra(Events.TITLE, "My Awesome Event")
         .putExtra(Events.DESCRIPTION, "Heading out with friends to do something awesome.")
         .putExtra(Events.EVENT_LOCATION, "Earth")
         .putExtra(Events.RRULE, "FREQ=DAILY;COUNT=10") 
         .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
         .putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE)
         .putExtra(Intent.EXTRA_EMAIL, "[email protected]");
startActivity(intent);
53
Trevor Johns

Sie können den folgenden Code verwenden, um die Zeitzone einzurichten. Das funktioniert für mich

TimeZone timeZone = TimeZone.getDefault();
values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
10
Durai

Vergewissern Sie sich, dass Sie keine Sichtbarkeit für ICS - und JellyBean-Geräte (api Level> = 14) verwenden.

Versuche dies -

ContentValues values= new ContentValues();
int apiLevel = Android.os.Build.VERSION.SDK_INT;
            if(apiLevel<14)
            values.put("visibility", 0);

Sichtbarkeit nur verwenden, wenn die Geräteversion weniger als 14 (ICS) beträgt

2
Atul Bhardwaj
public static ArrayList<String> readCalendarEvent(Context context) {
        Cursor cursor = context.getContentResolver()
                .query(
                        Uri.parse("content://com.Android.calendar/events"),
                        new String[] { "calendar_id", "title", "description",
                                "dtstart", "dtend", "eventLocation" }, null,
                        null, null);
        cursor.moveToFirst();
        // fetching calendars name
        String CNames[] = new String[cursor.getCount()];

        // fetching calendars id
        nameOfEvent.clear();
        startDates.clear();
        endDates.clear();
        descriptions.clear();
        Log.d("cnameslength",""+CNames.length);
        if (CNames.length==0)
        {
         Toast.makeText(context,"No event exists in calendar",Toast.LENGTH_LONG).show();
        }
        for (int i = 0; i < CNames.length; i++) {

            nameOfEvent.add(cursor.getString(1));
            startDates.add(getDate(Long.parseLong(cursor.getString(3))));
            endDates.add(getDate(Long.parseLong(cursor.getString(4))));
            descriptions.add(cursor.getString(2));
            CNames[i] = cursor.getString(1);
            cursor.moveToNext();
            Log.d("datacur",""+nameOfEvent.get(i));
            Log.d("datacur",""+startDates.get(i));
            Log.d("datacur",""+endDates.get(i));
            Log.d("datacur",""+descriptions.get(i));
            String filename=nameOfEvent.get(i)+"::"+startDates.get(i)+"::"+endDates.get(i)+"::"+descriptions.get(i);
            generateNoteOnSD(context,nameOfEvent.get(i),filename);

        }
        return nameOfEvent;
    }





public static void generateNoteOnSD(Context context, String sFileName, String sBody) {
        try {
            File root = new File(Environment.getExternalStorageDirectory(), "Notes");
            if (!root.exists()) {
                root.mkdirs();
            }
            File gpxfile = new File(root, sFileName);
            FileWriter writer = new FileWriter(gpxfile);
            writer.append(sBody);
            writer.flush();
            writer.close();
            Toast.makeText(context, "Successfully Backup Created", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
0
Makvin

Ich habe folgende Methode erstellt, um mit der Flexibilität von TIMEZONE umzugehen

// Konvertieren von TimeZone in GMT, um lokale Datenbank zu speichern, um // Kontroverse über den Server zu vermeiden

private String convertDateTimeZone(long originalDate) {
        String newDate = "";
        Date date = new Date(originalDate);
        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
        Date parsed = null;
        try {
            parsed = formatter.parse(formatter.format(date).toString());
            TimeZone tz = TimeZone.getTimeZone("GMT");
            SimpleDateFormat destFormat = new SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:ss");
            destFormat.setTimeZone(tz);

            newDate = destFormat.format(parsed);
        } catch (Exception e) {
        }
        return newDate;
    }
0
Dhruvit Darji

Ich habe den folgenden Code verwendet, um alle Ereignisse im Kalender zu lesen.

public boolean isEventInCal(Context context, String cal_meeting_id) {

    Cursor cursor = context.getContentResolver().query(
    Uri.parse("content://com.Android.calendar/events"),
            new String[] { "_id" }, " _id = ? ",
            new String[] { cal_meeting_id }, null);

    if (cursor.moveToFirst()) {
        // will give all events
        return true;
    }

    return false;
}
0
Dhruvit Darji