web-dev-qa-db-ja.com

カレンダーからイベントを取得する

私の問題は、Googleカレンダーのイベントを読みたいデモアプリケーションを1つ作成する必要があることです。そのため、イベントのタイトル、イベントの時間、イベント全体の詳細などのイベントを手動で挿入しました。今、私はそのカレンダーからそれらのイベントを読む必要があります。そのために、カレンダーAPIクラスを提供するgcode(google code)APIを使用しようとしました。しかし、それでもこれらのイベントを読むことはできません。

25
Akash Thakkar

[OK]私は、Android電話とGoogleカレンダーアプリケーションの統合を使用する方法という概念の全体の答えを見つけました。

コード: -

最初に、この行を設定します。この行は、現在のクラスであるApplicationSettings.Javaである他のクラスからカレンダーイベントを読み取ります。

ReadCalendar.readCalendar(ApplicationSettings.this);

package com.mycalendarevents.Android;

import Java.util.Date;
import Java.util.HashSet;
import Java.util.regex.Pattern;

import Android.content.ContentResolver;
import Android.content.ContentUris;
import Android.content.Context;
import Android.database.Cursor;
import Android.net.Uri;
import Android.text.format.DateUtils;

public class ReadCalendar
{
    static Cursor cursor;

    public static void readCalendar(Context context) {

        ContentResolver contentResolver = context.getContentResolver();

        // Fetch a list of all calendars synced with the device, their display names and whether the

        cursor = contentResolver.query(Uri.parse("content://com.Android.calendar/calendars"),
                (new String[] { "_id", "displayName", "selected"}), null, null, null);

        HashSet<String> calendarIds = new HashSet<String>();

        try
        {
            System.out.println("Count="+cursor.getCount());
            if(cursor.getCount() > 0)
            {
                System.out.println("the control is just inside of the cursor.count loop");
                while (cursor.moveToNext()) {

                    String _id = cursor.getString(0);
                    String displayName = cursor.getString(1);
                    Boolean selected = !cursor.getString(2).equals("0");

                    System.out.println("Id: " + _id + " Display Name: " + displayName + " Selected: " + selected);
                    calendarIds.add(_id);
                }
            }
        }
        catch(AssertionError ex)
        {
            ex.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }


        // For each calendar, display all the events from the previous week to the end of next week.        
        for (String id : calendarIds) {
            Uri.Builder builder = Uri.parse("content://com.Android.calendar/instances/when").buildUpon();
            //Uri.Builder builder = Uri.parse("content://com.Android.calendar/calendars").buildUpon();
            long now = new Date().getTime();

            ContentUris.appendId(builder, now - DateUtils.DAY_IN_MILLIS * 10000);
            ContentUris.appendId(builder, now + DateUtils.DAY_IN_MILLIS * 10000);

            Cursor eventCursor = contentResolver.query(builder.build(),
                    new String[]  { "title", "begin", "end", "allDay"}, "Calendars._id=" + 1,
                    null, "startDay ASC, startMinute ASC");

            System.out.println("eventCursor count="+eventCursor.getCount());
            if(eventCursor.getCount()>0)
            {

                if(eventCursor.moveToFirst())
                {
                    do
                    {
                        Object mbeg_date,beg_date,beg_time,end_date,end_time;

                        final String title = eventCursor.getString(0);
                        final Date begin = new Date(eventCursor.getLong(1));
                        final Date end = new Date(eventCursor.getLong(2));
                        final Boolean allDay = !eventCursor.getString(3).equals("0");

                        /*  System.out.println("Title: " + title + " Begin: " + begin + " End: " + end +
                                    " All Day: " + allDay);
                        */
                        System.out.println("Title:"+title);
                        System.out.println("Begin:"+begin);
                        System.out.println("End:"+end);
                        System.out.println("All Day:"+allDay);

                        /* the calendar control metting-begin events Respose  sub-string (starts....hare) */

                        Pattern p = Pattern.compile(" ");
                        String[] items = p.split(begin.toString());
                        String scalendar_metting_beginday,scalendar_metting_beginmonth,scalendar_metting_beginyear,scalendar_metting_begindate,scalendar_metting_begintime,scalendar_metting_begingmt;

                        scalendar_metting_beginday = items[0];
                        scalendar_metting_beginmonth = items[1];
                        scalendar_metting_begindate = items[2];
                        scalendar_metting_begintime = items[3];
                        scalendar_metting_begingmt = items[4];
                        scalendar_metting_beginyear = items[5];


                        String  calendar_metting_beginday = scalendar_metting_beginday;
                        String  calendar_metting_beginmonth = scalendar_metting_beginmonth.toString().trim();

                        int  calendar_metting_begindate = Integer.parseInt(scalendar_metting_begindate.trim());

                        String calendar_metting_begintime = scalendar_metting_begintime.toString().trim();
                        String calendar_metting_begingmt = scalendar_metting_begingmt;
                        int calendar_metting_beginyear = Integer.parseInt(scalendar_metting_beginyear.trim());


                        System.out.println("calendar_metting_beginday="+calendar_metting_beginday);

                        System.out.println("calendar_metting_beginmonth ="+calendar_metting_beginmonth);

                        System.out.println("calendar_metting_begindate ="+calendar_metting_begindate);

                        System.out.println("calendar_metting_begintime="+calendar_metting_begintime);

                        System.out.println("calendar_metting_begingmt ="+calendar_metting_begingmt);

                        System.out.println("calendar_metting_beginyear ="+calendar_metting_beginyear);

                          /* the calendar control metting-begin events Respose  sub-string (starts....ends) */  

                        /* the calendar control metting-end events Respose  sub-string (starts....hare) */

                        Pattern p1 = Pattern.compile(" ");
                        String[] enditems = p.split(end.toString());
                        String scalendar_metting_endday,scalendar_metting_endmonth,scalendar_metting_endyear,scalendar_metting_enddate,scalendar_metting_endtime,scalendar_metting_endgmt;

                        scalendar_metting_endday = enditems[0];
                        scalendar_metting_endmonth = enditems[1];
                        scalendar_metting_enddate = enditems[2];
                        scalendar_metting_endtime = enditems[3];
                        scalendar_metting_endgmt = enditems[4];
                        scalendar_metting_endyear = enditems[5];


                        String  calendar_metting_endday = scalendar_metting_endday;
                        String  calendar_metting_endmonth = scalendar_metting_endmonth.toString().trim();

                        int  calendar_metting_enddate = Integer.parseInt(scalendar_metting_enddate.trim());

                        String calendar_metting_endtime = scalendar_metting_endtime.toString().trim();
                        String calendar_metting_endgmt = scalendar_metting_endgmt;
                        int calendar_metting_endyear = Integer.parseInt(scalendar_metting_endyear.trim());


                        System.out.println("calendar_metting_beginday="+calendar_metting_endday);

                        System.out.println("calendar_metting_beginmonth ="+calendar_metting_endmonth);

                        System.out.println("calendar_metting_begindate ="+calendar_metting_enddate);

                        System.out.println("calendar_metting_begintime="+calendar_metting_endtime);

                        System.out.println("calendar_metting_begingmt ="+calendar_metting_endgmt);

                        System.out.println("calendar_metting_beginyear ="+calendar_metting_endyear);

                          /* the calendar control metting-end events Respose  sub-string (starts....ends) */

                        System.out.println("only date begin of events="+begin.getDate());
                        System.out.println("only begin time of events="+begin.getHours() + ":" +begin.getMinutes() + ":" +begin.getSeconds());


                       System.out.println("only date begin of events="+end.getDate());
                        System.out.println("only begin time of events="+end.getHours() + ":" +end.getMinutes() + ":" +end.getSeconds());

                        beg_date = begin.getDate();
                        mbeg_date = begin.getDate()+"/"+calendar_metting_beginmonth+"/"+calendar_metting_beginyear;
                        beg_time = begin.getHours();

                        System.out.println("the vaule of mbeg_date="+mbeg_date.toString().trim());
                        end_date = end.getDate();
                        end_time = end.getHours();


                        CallHandlerUI.metting_begin_date.add(beg_date.toString());
                        CallHandlerUI.metting_begin_mdate.add(mbeg_date.toString());

                        CallHandlerUI.metting_begin_mtime.add(calendar_metting_begintime.toString());

                        CallHandlerUI.metting_end_date.add(end_date.toString());
                        CallHandlerUI.metting_end_time.add(end_time.toString());
                        CallHandlerUI.metting_end_mtime.add(calendar_metting_endtime.toString());

                    }
                    while(eventCursor.moveToNext());
                }
            }
            break;
        }
    }
}

コード全体がポストされます。これは、2.2以降のバージョン用のポストバックURLの助けを借りて、カレンダーからすべてのイベントを読み取るだけです。

Uri.parse("content://com.Android.calendar/instances/when").buildUpon();

plは、Androidで2.2以下のバージョンの下で見つけ、必要な場所にこれらのイベントを使用します...

19
Akash Thakkar

上記のコードはかなりひどいです(そしてICS-間違いなく列名が異なる)で動作しないようです)

ここのページ: http://developer.Android.com/guide/topics/providers/calendar-provider.html

より良い概要を提供します。カレンダーを取得するための(非常に)簡単なコード:

public class CalendarContentResolver {
    public static final String[] FIELDS = { 
        CalendarContract.Calendars.NAME,
        CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
        CalendarContract.Calendars.CALENDAR_COLOR,
        CalendarContract.Calendars.VISIBLE 
    };

    public static final Uri CALENDAR_URI = Uri.parse("content://com.Android.calendar/calendars");

    ContentResolver contentResolver;
    Set<String> calendars = new HashSet<String>();

    public  CalendarContentResolver(Context ctx) {
        contentResolver = ctx.getContentResolver();
    }

    public Set<String> getCalendars() {
        // Fetch a list of all calendars sync'd with the device and their display names
        Cursor cursor = contentResolver.query(CALENDAR_URI, FIELDS, null, null, null);

        try {
            if (cursor.getCount() > 0) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(0);
                    String displayName = cursor.getString(1);
                    // This is actually a better pattern:
                    String color = cursor.getString(cursor.getColumnIndex(CalendarContract.Calendars.CALENDAR_COLOR));
                    Boolean selected = !cursor.getString(3).equals("0");
                    calendars.add(displayName);  
                }
            }
        } catch (AssertionError ex) { /*TODO: log exception and bail*/ }

        return calendars;
    }
}

お役に立てれば!

21
Marco

これは古い投稿であることは承知していますが、近い将来ソリューションを必要としている人がいる場合、Akash Takkarの回答にあるソリューションを最適化するためのインスピレーションを見つけました。

問題


具体的には、元のコードにいくつかの問題が見つかりました。

  1. カレンダーのイベントを取得するためのループが未熟に壊れました
    • これにより、最初のカレンダーのイベントのみが取得されました
  2. EventCursor.moveToFirst();を使用して、各カレンダーの最初のイベントがスキップされました。その後、whileループ内の次のイベントに直接移動します
  3. カレンダーのIDがeventCursor で正しく設定されていませんでした
    • "Calendars._id =" + 1は、 "Calendars._id =" + idである必要があります。
  4. 他の人が自分の時間範囲を指定するのは難しいだろう
  5. 現在のソリューションは、多くの利点を保持するオブジェクト指向ではありません
  6. 読みやすさとドキュメントは最高ではありません

解決策


これにより、指定された時間範囲内のイベントオブジェクトのリストを返すGithubライブラリを作成しました。

https://github.com/david-laundav/CalendarService

ソースファイルは「CalendarService/src/dk/CalendarService」の下にあります。

ユースケース

ソリューション自体には、目的に応じて2つの異なる方法が含まれています。

最初のユースケース:

CalendarService.readCalendar(class.this)
// where class.this is either your class or the context

このメソッドは、+ /-1日間のイベントのリストを返します

第二のユースケース:

独自の時間範囲を指定することもできます。

CalendarService.readCalendar(class.this, int days, int hours)

例は次のとおりです。

CalendarService.readCalendar(class.this, 2, 5)

そうすると、+ /-2日と+/- 5時間のイベントのリストが返されます。

このサービスはテスト済みですが、問題が発生した場合は教えてください。

8
Demitrian

この投稿は少し古いですが、AndroidのCalendarコンテンツプロバイダーに関連するデータを取得するための別の簡単なソリューションがあります。

このライブラリを使用します: https://github.com/EverythingMe/easy-content-providers

そして今、すべてのカレンダーを取得します。

CalendarProvider calendarProvider = new CalendarProvider(context);
List<Calendar> calendars = calendarProvider.getCalendars().getList();

Calendarにはすべてのフィールドがあるため、必要な情報を取得できます:id、name、calendarColor、ownerAccount、accountName、 calendarAccessLevel、...

または、特定のカレンダーのすべてのEventsを取得します。

List<Event> calendars = calendarProvider.getEvents(calendar.id).getList();

また、リマインダー、出席者、インスタンスを取得するオプションもあります。

それはリストまたはカーソルで動作し、そこにどのように見えて動作するかを見るためのサンプルアプリがあります。実際、次のようなすべてのAndroidコンテンツプロバイダーのサポートがあります:Contacts、SMS、Calls、...すべてのオプションを含む完全なドキュメント:- https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers

それが助けたことを願っています:)

5
sromku

このコードを使用して、1日のカレンダーイベントを取得します。

public static void readCalendarEvent(Context context) throws ParseException {

        ContentResolver contentResolver = context.getContentResolver();
        Calendar calendar = Calendar.getInstance();
        String dtstart = "dtstart";
        String dtend = "dtend";


        SimpleDateFormat    displayFormatter = new SimpleDateFormat("MMMM dd, yyyy (EEEE)");

         stime=displayFormatter.format(calendar.getTime());     

        SimpleDateFormat startFormatter = new SimpleDateFormat("MM/dd/yy");
        String dateString = startFormatter.format(calendar.getTime());

        long after = calendar.getTimeInMillis();
        SimpleDateFormat formatterr = new SimpleDateFormat("hh:mm:ss MM/dd/yy");
        Calendar endOfDay = Calendar.getInstance();
        Date dateCCC = formatterr.parse("23:59:59 " + dateString);
        endOfDay.setTime(dateCCC);






    cursor = contentResolver.query(Uri.parse("content://com.Android.calendar/events"), (new String[] { "calendar_id", "title", "description", "dtstart", "dtend","eventTimezone", "eventLocation" }), "(" + dtstart + ">" + after + " and " + dtend + "<" + endOfDay.getTimeInMillis() + ")", null, "dtstart ASC");


        /*String[] COLS={"calendar_id", "title", "description", "dtstart", "dtend","eventTimezone", "eventLocation"};

        cursor = contentResolver.query(


                CalendarContract.Events.CONTENT_URI, COLS,null, null, null);*/

        gCalendar = new ArrayList<GoogleCalendar>();
        try {


            if (cursor.getCount() > 0) {


                while (cursor.moveToNext()) {
                    GoogleCalendar googleCalendar = new GoogleCalendar();
                    gCalendar.add(googleCalendar);
                    int calendar_id = cursor.getInt(0);
                    googleCalendar.setCalendar_id(calendar_id);
                    String title = cursor.getString(1);
                    googleCalendar.setTitle(title);
                    String description = cursor.getString(2);
                    googleCalendar.setDescription(description);
                    String dtstart1 = cursor.getString(3);
                     dt=convertDate(dtstart1,"hh:mm:ss");

                    googleCalendar.setDtstart(dt);                  

                String dtend1 = cursor.getString(4);
                    googleCalendar.setDtend(dtend1);


                    String eventTimeZone=cursor.getString(5);
                    googleCalendar.setEventTimeZone(eventTimeZone);
                    String eventlocation = cursor.getString(6);

                    googleCalendar.setEventlocation(eventlocation);



                }
            }
        } catch (AssertionError ex) {
            ex.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
2
user2841300