Android'de takvim etkinlikleri nasıl eklenir?


160

Sadece Android'de hızlanıyorum ve bugün bir proje toplantısında birileri Android'in yerel bir takvim uygulaması olmadığını söyledi, böylece kullanıcılar sadece istedikleri takvim uygulamasını kullanıyorlar.

Bu doğru mu ve eğer öyleyse programlı olarak kullanıcının takvimine nasıl etkinlik eklerim? Hepsinin paylaştığı ortak bir API var mı?

Değeri için muhtemelen Android 2.x'i hedefliyoruz.


Muhtemelen oriharel'in cevabını kabul etmelisiniz, çünkü görevinizi yerine getirmek için kod sağlar.
jww

1
@SumitSharma bağlantınız artık çalışmıyor gibi görünüyor ve otomatik yükleme iletişim kutusundan oldukça şüpheli görünüyor.
düzeltme

Yanıtlar:


17

kullanıcının takvimine programlı olarak nasıl etkinlik eklerim?

Hangi takvim?

Hepsinin paylaştığı ortak bir API var mı?

Hayır, Windows takvim uygulamaları için "hepsinin paylaştığı ortak API" dan fazlası yoktur. Bazı yaygın veri biçimleri (ör. İCalendar) ve İnternet protokolleri (ör. CalDAV) vardır, ancak ortak API yoktur. Bazı takvim uygulamaları API bile sunmaz.

Entegre etmek istediğiniz belirli takvim uygulamaları varsa geliştiricilerine başvurun ve API sunup sunmadıklarını belirleyin. Bu nedenle, örneğin, Android'in açık kaynak kodlu projesinden, Mayra'un alıntıladığı Takvim uygulaması, belgelenmiş ve desteklenen API'ler sunmaz. Google, geliştiricilere, Mayra'ın alıntıladığı öğreticide belirtilen teknikleri kullanmamalarını bile açıkça söyledi .

Başka bir seçenek de söz konusu İnternet takvimine etkinlik eklemenizdir. Örneğin, Android açık kaynak projesinden Takvim uygulamasına etkinlik eklemenin en iyi yolu, etkinliği uygun GData API'ları aracılığıyla kullanıcının Google Takvimine eklemektir.


GÜNCELLEME

Android 4.0 (API Seviye 14) ekledi a CalendarContract ContentProvider.


7
Belirli bir takvimi hedeflemek istemiyoruz; yalnızca kullanıcının kullandığı takvime, yalnızca kullanıcıya kolaylık olması için etkinlik ekleyebilmek istiyoruz. Bizim app profesyonel toplantılar ve konferanslar düzenleyen bir web sitesine bir arayüz sağlar. Birisi için kaydolursa, takvimine katmak güzel olurdu.
Peter Nelson

3
@Peter Nelson: "Belirli bir takvimi hedeflemek istemiyoruz - yalnızca kullanıcının kullandığı takvime, yalnızca kullanıcıya kolaylık sağlamak için etkinlik eklemek istiyoruz." - Android'de bunu Windows'da yapabileceğinizden daha fazla yapamazsınız. Hiçbir platformda "kullanıcının hangi takvimi kullandığını" bilmiyorsunuz ve hiçbir platformda böyle bir takvim uygulamasıyla çalışmak için evrensel bir API yok.
CommonsWare

22
Neden Windows ile karşılaştırmaya devam ettiğimi bilmiyorum - Tanıdığım herkes, programlarını ve randevularını düzenlemek için telefonunu kullanıyor - Bunu PC'lerinde yapan kimseyi tanımıyorum - belki de nesillerdir. Ama Android'in bunu yapamayacağını anlıyorum. Teşekkürler.
Peter Nelson

5
@Peter Nelson: İnsanları aynı varsayımlarda bulunduğundan Windows ile karşılaştırmaya devam ediyorum. Birçok geliştirici, Windows'ta "kullanıcının kullandığı takvime etkinlik ekleyebileceklerini" düşünüyor, çünkü herkes Outlook'u kullandığını düşünüyor ve bu nedenle yalnızca bir "hangi takvim" varsa.
CommonsWare

1
@Yar: "Herhangi bir Android telefonun sahip olduğu ana Android telefon takvimi." - bu uygulamaya sahip olmayan tüm Android cihazlar hariç. Örneğin, birçok HTC cihazında bu uygulama yoktur, aksine sol tarafta altı inçlik HTC DROID Incredible gibi kendi takvim uygulamaları vardır. Cihaz üreticileri, takvim uygulamasını (veya hemen hemen başka herhangi bir uygulamayı) kendi uygulamalarıyla değiştirebilir.
CommonsWare

290

Bunu kodunuzda deneyin:

Calendar cal = Calendar.getInstance();              
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra("beginTime", cal.getTimeInMillis());
intent.putExtra("allDay", true);
intent.putExtra("rrule", "FREQ=YEARLY");
intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
intent.putExtra("title", "A Test Event from android app");
startActivity(intent);

6
Bu çözümü çok seviyorum. Esas olarak kullanıcıyı kendi takvimini seçmeye ittiği için (birden fazla varsa).
Sebastian Roth

2
android 2.2 için bu uyumlu hale nasıl?
Srikanth Pai

13
SetType yerine .setData (CalendarContract.Events.CONTENT_URI) kullanmalısınız, çünkü setType (string) ile bazı cihazlarda kilitlenir!
Informatic0re

4
Tam eğitim burada: code.tutsplus.com/tutorials/… Yazım hatalarını önlemek için sabitleri kullanmak daha iyidir;)
Adrien Cadet

7
Kodunuz uygulamanıza başka bir (takvim) uygulamasına veri göndermesini söyler ve bu verileri yeni takvim etkinliği eklemek için kullanır. Uygulamanız takvim verilerini yazmaz veya okumaz, bu nedenle bildirimde herhangi bir izne ihtiyacınız yoktur.
Singed

66

Kodunuzda bu API'yı kullanın .. u, hatırlatma ile olay, olay ve toplantı ile olay etkinleştirmek için yardımcı olacaktır ... Bu api 2.1 ve üstü platform için çalışır İçerik yerine 2.1 daha az kullanan olanlar: // com .android.calendar / events içeriği kullanır: // calendar / events

 public static long pushAppointmentsToCalender(Activity curActivity, String title, String addInfo, String place, int status, long startDate, boolean needReminder, boolean needMailService) {
    /***************** Event: note(without alert) *******************/

    String eventUriString = "content://com.android.calendar/events";
    ContentValues eventValues = new ContentValues();

    eventValues.put("calendar_id", 1); // id, We need to choose from
                                        // our mobile for primary
                                        // its 1
    eventValues.put("title", title);
    eventValues.put("description", addInfo);
    eventValues.put("eventLocation", place);

    long endDate = startDate + 1000 * 60 * 60; // For next 1hr

    eventValues.put("dtstart", startDate);
    eventValues.put("dtend", endDate);

    // values.put("allDay", 1); //If it is bithday alarm or such
    // kind (which should remind me for whole day) 0 for false, 1
    // for true
    eventValues.put("eventStatus", status); // This information is
    // sufficient for most
    // entries tentative (0),
    // confirmed (1) or canceled
    // (2):
    eventValues.put("eventTimezone", "UTC/GMT +2:00");
   /*Comment below visibility and transparency  column to avoid java.lang.IllegalArgumentException column visibility is invalid error */

    /*eventValues.put("visibility", 3); // visibility to default (0),
                                        // confidential (1), private
                                        // (2), or public (3):
    eventValues.put("transparency", 0); // You can control whether
                                        // an event consumes time
                                        // opaque (0) or transparent
                                        // (1).
      */
    eventValues.put("hasAlarm", 1); // 0 for false, 1 for true

    Uri eventUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(eventUriString), eventValues);
    long eventID = Long.parseLong(eventUri.getLastPathSegment());

    if (needReminder) {
        /***************** Event: Reminder(with alert) Adding reminder to event *******************/

        String reminderUriString = "content://com.android.calendar/reminders";

        ContentValues reminderValues = new ContentValues();

        reminderValues.put("event_id", eventID);
        reminderValues.put("minutes", 5); // Default value of the
                                            // system. Minutes is a
                                            // integer
        reminderValues.put("method", 1); // Alert Methods: Default(0),
                                            // Alert(1), Email(2),
                                            // SMS(3)

        Uri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
    }

    /***************** Event: Meeting(without alert) Adding Attendies to the meeting *******************/

    if (needMailService) {
        String attendeuesesUriString = "content://com.android.calendar/attendees";

        /********
         * To add multiple attendees need to insert ContentValues multiple
         * times
         ***********/
        ContentValues attendeesValues = new ContentValues();

        attendeesValues.put("event_id", eventID);
        attendeesValues.put("attendeeName", "xxxxx"); // Attendees name
        attendeesValues.put("attendeeEmail", "yyyy@gmail.com");// Attendee
                                                                            // E
                                                                            // mail
                                                                            // id
        attendeesValues.put("attendeeRelationship", 0); // Relationship_Attendee(1),
                                                        // Relationship_None(0),
                                                        // Organizer(2),
                                                        // Performer(3),
                                                        // Speaker(4)
        attendeesValues.put("attendeeType", 0); // None(0), Optional(1),
                                                // Required(2), Resource(3)
        attendeesValues.put("attendeeStatus", 0); // NOne(0), Accepted(1),
                                                    // Decline(2),
                                                    // Invited(3),
                                                    // Tentative(4)

        Uri attendeuesesUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(attendeuesesUriString), attendeesValues);
    }

    return eventID;

}

4
Ben eklendi event.put("eventTimezone", "UTC/GMT +2:00")ve elimine event.put("visibility", 3)ve event.put("transparency", 0)ve iyi çalışıyor
validcat

1
Belki saat dilimi hatası alıyorum. Bunu ve çalışmalarını eventValues.put ("eventTimezone", TimeZone.getDefault (). GetID ());
Cüneyt

2
Ben alıyorum android.database.sqlite.SQLiteExceptionçizgisindeUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
Sibidharan

1
ama bir tane ben i değerleri ayarladığımda bir tane. ve set endDate, çalışmıyor. etkinlik, bitiş tarihine kadar olmayan tüm günler için ayarlandı. AmitabhaBiswas
urvi joshi

1
değerleri.put (CalendarContract.Reminders.CALENDAR_ID, 1); değerleri.put (CalendarContract.Reminders.TITLE, "Rutin Her Gün1"); değerleri.put (CalendarContract.Reminders.DTSTART, milisaniyeTimesEveryday); değerleri.put (CalendarContract.Reminders.HAS_ALARM, true); değerleri. girdi ("kural", "FREK = GÜNLÜK"); // UNTIL = 1924885800000 değerleri.put (CalendarContract.Reminders.DTEND, EndtimeInMilliseconds); @AmitabhaBiswas
urvi scrapt

57

Aşağıdaki kodu kullandım, ICS varsayılan cihaz takviminde ve ayrıca ICS sürümünden daha az sürümde olay eklemek için sorunumu çözdü

    if (Build.VERSION.SDK_INT >= 14) {
        Intent intent = new Intent(Intent.ACTION_INSERT)
        .setData(Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
        .putExtra(Events.TITLE, "Yoga")
        .putExtra(Events.DESCRIPTION, "Group class")
        .putExtra(Events.EVENT_LOCATION, "The gym")
        .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com");
         startActivity(intent);
}

    else {
        Calendar cal = Calendar.getInstance();              
        Intent intent = new Intent(Intent.ACTION_EDIT);
        intent.setType("vnd.android.cursor.item/event");
        intent.putExtra("beginTime", cal.getTimeInMillis());
        intent.putExtra("allDay", true);
        intent.putExtra("rrule", "FREQ=YEARLY");
        intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
        intent.putExtra("title", "A Test Event from android app");
        startActivity(intent);
        }

Umarım yardımcı olur .....


Build.VERSION.SDK_INT> 14 hakkında, 60 dakika boyunca nasıl varsayılan bir hatırlatıcı ekleyebilirim ve hatırlatıcının kimliğini nasıl alabilirim? Teşekkürler
user1796624

Merhaba, düzenlenebilir takvim alanlarını gösteren ekranı değiştirmek mümkün mü merak ediyordum (bazı görünümlerin nasıl göründüğünü değiştirmek gibi)?
Yulric Sequeira

@ user1950599 Kesinlikle hayır. Niyet, başka bir uygulamadan bir Etkinlik başlatır ve bununla tek etkileşim, niyet yoluyla gönderdiğiniz verilerdir.
Pijusn


8

Birisi c # Xamarin için bu gerekirse:

        Intent intent = new Intent(Intent.ActionInsert);
        intent.SetData(Android.Provider.CalendarContract.Events.ContentUri);
        intent.PutExtra(Android.Provider.CalendarContract.ExtraEventBeginTime, Utils.Tools.CurrentTimeMillis(game.Date));
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.AllDay, false);
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.EventLocation, "Location");
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Description, "Description");
        intent.PutExtra(Android.Provider.CalendarContract.ExtraEventEndTime, Utils.Tools.CurrentTimeMillis(game.Date.AddHours(2)));
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Title, "Title");
        StartActivity(intent);

Yardımcı İşlevleri:

    private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    public static long CurrentTimeMillis(DateTime date)
    {
        return (long)(date.ToUniversalTime() - Jan1st1970).TotalMilliseconds;
    }

7

Google takvimi "yerel" takvim uygulamasıdır. Bildiğim kadarıyla, tüm telefonlar yüklü bir sürümü ile geliyor ve varsayılan SDK bir sürüm sunuyor.

Onunla çalışmak için bu eğiticiye göz atabilirsiniz .


7

Bunu dene ,

   Calendar beginTime = Calendar.getInstance();
    beginTime.set(yearInt, monthInt - 1, dayInt, 7, 30);



    ContentValues l_event = new ContentValues();
    l_event.put("calendar_id", CalIds[0]);
    l_event.put("title", "event");
    l_event.put("description",  "This is test event");
    l_event.put("eventLocation", "School");
    l_event.put("dtstart", beginTime.getTimeInMillis());
    l_event.put("dtend", beginTime.getTimeInMillis());
    l_event.put("allDay", 0);
    l_event.put("rrule", "FREQ=YEARLY");
    // status: 0~ tentative; 1~ confirmed; 2~ canceled
    // l_event.put("eventStatus", 1);

    l_event.put("eventTimezone", "India");
    Uri l_eventUri;
    if (Build.VERSION.SDK_INT >= 8) {
        l_eventUri = Uri.parse("content://com.android.calendar/events");
    } else {
        l_eventUri = Uri.parse("content://calendar/events");
    }
    Uri l_uri = MainActivity.this.getContentResolver()
            .insert(l_eventUri, l_event);

4

tarih ve saat içeren belirli bir Tarih dizeniz varsa.

örneğin String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

takvime tarih ve saat içeren bir etkinlik eklemek için aşağıdaki kodu kullanın

Calendar cal = Calendar.getInstance();
cal.setTime(new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss").parse(givenDateString));
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra("beginTime", cal.getTimeInMillis());
intent.putExtra("allDay", false);
intent.putExtra("rrule", "FREQ=YEARLY");
intent.putExtra("endTime",cal.getTimeInMillis() + 60 * 60 * 1000);
intent.putExtra("title", " Test Title");
startActivity(intent);

3

bayrak eklemelisiniz:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ya da şunlarda hataya neden olacaksınız:

startActivity() bir Etkinlik bağlamının dışından aşağıdakileri gerektirir: FLAG_ACTIVITY_NEW_TASK

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.