web-dev-qa-db-fra.com

Comment lire et éditer des événements de calendrier Android à l'aide de la nouvelle API Android 4.0 Ice Cream Sandwich?

Nous essayons de montrer aux utilisateurs la vue du calendrier sandwich à la crème glacée lorsqu'ils souhaitent ajouter un nouvel événement. Nous ne pouvons le tester que dans l’émulateur.

L'autre problème est que nous ne trouvons aucun exemple d'utilisation de CalendarProvider. C’est la bonne classe s’agissant du calendrier Sandwich?

Serait-ce plus facile à faire avec Google Gdata API?

[EDIT] Nous avons donc travaillé en ajoutant un événement à l'agenda, mais ce n'était pas via l'API, nous avons ouvert l'agenda dans la vue correcte. Mais maintenant, le problème est que cela ne fonctionne pas dans l'émulateur car nous n'avons pas réussi à synchroniser le calendrier.

La question est donc: comment lire et éventuellement éditer des événements de calendrier Android à l'aide de la nouvelle API Android 4.0 Ice Cream Sandwich?

14
TJLuoto

Voici le code qui vous permettra d'ajouter directement un événement:

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

Vous aurez besoin de CALENDAR_ID. Voici comment interroger la liste des calendriers:

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

Vous devrez demander l'autorisation Android.permission.READ_CALENDAR pour que tout cela fonctionne.

Si vous souhaitez éviter de demander des autorisations, vous pouvez également demander à l'application Calendrier de créer un nouvel événement en votre nom à l'aide de Intent:

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

Vous pouvez utiliser le code suivant pour configurer le fuseau horaire et cela fonctionne pour moi

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

Assurez-vous que vous n'utilisez pas la 'visibilité' pour ICS et les appareils Jelly Bean (api Level> = 14)

Essaye ça -

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

Utilisez la visibilité uniquement si la version de l'appareil est inférieure à 14 (ICS)

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

J'ai créé la méthode suivante pour gérer la flexibilité de TIMEZONE

// Conversion de TimeZone en GMT pour économiser sur la base de données locale afin d'éviter // Controverse sur le serveur

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

J'ai utilisé le code suivant pour lire tous les événements du calendrier.

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