it-swarm-id.com

Bagaimana cara membaca dan mengedit acara kalender Android menggunakan Android 4.0 Ice cream sandwich API?

Kami berusaha menunjukkan kepada pengguna tampilan kalender Ice cream sandwich, ketika mereka ingin menambahkan acara baru. Kami hanya dapat menguji ini di emulator.

Masalah lainnya adalah kita tidak dapat menemukan contoh bagaimana menggunakan CalendarProvider. Ini kelas yang tepat untuk berurusan dengan kalender Sandwich?

Apakah ini lebih mudah dilakukan dengan Google Gdata API?

[EDIT] Jadi yang kami dapat adalah menambahkan acara ke kalender tetapi tidak melalui API, kami membuka kalender di tampilan yang benar. Tetapi sekarang masalahnya adalah bahwa itu tidak berfungsi di emulator karena kita belum bisa menyelaraskan kalender.

Jadi pertanyaannya adalah: Bagaimana cara membaca dan mengedit acara kalender Android menggunakan Android 4.0 Ice cream sandwich API?

14
TJLuoto

Berikut kode yang akan memungkinkan Anda menambahkan acara secara langsung:

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

Anda memerlukan CALENDAR_ID, jadi inilah cara untuk menanyakan daftar kalender:

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

Anda harus meminta izin Android.permission.READ_CALENDAR agar semua ini berfungsi.

Jika Anda ingin menghindari keharusan meminta izin, Anda juga dapat meminta aplikasi Kalender untuk membuat acara baru atas nama Anda dengan menggunakan 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

Anda dapat menggunakan kode berikut untuk mengatur zona waktu dan berfungsi untuk saya

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

Pastikan, Anda tidak menggunakan 'visibilty' untuk ICS dan perangkat JellyBean (apiLevel> = 14)

Coba ini -

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

Gunakan visibilitas hanya jika versi perangkat kurang dari 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

Saya telah membuat Metode berikut untuk menangani fleksibilitas TIMEZONE

// Konversi TimeZone ke GMT untuk menghemat Db lokal untuk menghindari // Controversy Over Server

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

Saya menggunakan kode berikut untuk membaca semua acara di Kalender.

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