অ্যান্ড্রয়েডে ক্যালেন্ডার ইভেন্টগুলি কীভাবে যুক্ত করবেন?


159

আমি কেবল অ্যান্ড্রয়েডের গতি বাড়িয়ে তুলছি, এবং আজ একটি প্রকল্প সভায় কেউ বলেছে যে অ্যান্ড্রয়েডের কোনও নেটিভ ক্যালেন্ডার অ্যাপ্লিকেশন নেই তাই ব্যবহারকারীরা তাদের পছন্দসই ক্যালেন্ডার অ্যাপটি ব্যবহার করেন।

এটি কি সত্য এবং যদি তাই হয় তবে আমি কীভাবে প্রোগ্রামের মাধ্যমে ব্যবহারকারীর ক্যালেন্ডারে কোনও ইভেন্ট যুক্ত করব? তারা কি ভাগ করে নেওয়ার মতো একটি সাধারণ এপিআই আছে?

এটির মূল্যের জন্য, আমরা সম্ভবত অ্যান্ড্রয়েড ২.x টার্গেট করছি।


আপনার সম্ভবত অরিহরেলের উত্তরটি গ্রহণ করা উচিত কারণ তিনি আপনার কাজটি সম্পাদনের জন্য কোড সরবরাহ করেন।
jww

1
@ সুমিতশর্মা আপনার লিঙ্কটি আর কাজ করে না বলে মনে হচ্ছে - এবং স্বয়ংক্রিয়ভাবে ইনস্টল করা ডায়ালগটি নিয়ে বেশ সন্দেহজনক বলে মনে হচ্ছে।
ঠিক করুন

উত্তর:


17

আমি কীভাবে প্রোগ্রামটির মাধ্যমে ব্যবহারকারীর ক্যালেন্ডারে কোনও ইভেন্ট যুক্ত করব?

কোন পঞ্জিকা?

তারা কি ভাগ করে নেওয়ার মতো একটি সাধারণ এপিআই আছে?

না, উইন্ডোজ ক্যালেন্ডার অ্যাপ্লিকেশনগুলির জন্য "তারা ভাগ করে নেওয়ার জন্য সমস্ত সাধারণ" এর চেয়ে বেশি আর কিছু নেই। কিছু সাধারণ ডেটা ফর্ম্যাট (যেমন, আইক্যালেন্ডার) এবং ইন্টারনেট প্রোটোকল (যেমন, ক্যালডিএভি) রয়েছে তবে সাধারণ কোনও এপিআই নেই। কিছু ক্যালেন্ডার অ্যাপ্লিকেশন এমনকি কোনও এপিআইও দেয় না।

যদি নির্দিষ্ট ক্যালেন্ডার অ্যাপ্লিকেশন থাকে তবে আপনি যা সংহত করতে চান, তাদের বিকাশকারীদের সাথে যোগাযোগ করুন এবং তারা কোনও এপিআই সরবরাহ করে কিনা তা নির্ধারণ করুন। সুতরাং, উদাহরণস্বরূপ, অ্যান্ড্রয়েড ওপেন সোর্স প্রকল্পের ক্যালেন্ডার অ্যাপ্লিকেশন, যে মায়রা উদ্ধৃত করেছে, কোনও ডকুমেন্টেড এবং সমর্থিত এপিআই সরবরাহ করে না। গুগল এমনকি ডেভেলপারদের মায়রা উল্লেখ করে টিউটোরিয়ালে বর্ণিত কৌশলগুলি ব্যবহার না করার জন্যও স্পষ্টভাবে জানিয়েছে

আপনার কাছে প্রশ্নযুক্ত ইন্টারনেট ক্যালেন্ডারে ইভেন্টগুলি যুক্ত করার জন্য আরেকটি বিকল্প। উদাহরণস্বরূপ, অ্যান্ড্রয়েড ওপেন সোর্স প্রকল্পের ক্যালেন্ডার অ্যাপ্লিকেশনটিতে ইভেন্টগুলি যুক্ত করার সর্বোত্তম উপায় হ'ল যথাযথ জিডিটা এপিআইয়ের মাধ্যমে ইভেন্টটির ব্যবহারকারীর গুগল ক্যালেন্ডারে যুক্ত করা।


হালনাগাদ

অ্যান্ড্রয়েড 4.0.০ (এপিআই স্তর ১৪) যুক্ত করেছে একটি CalendarContract ContentProvider


6
আমরা একটি নির্দিষ্ট ক্যালেন্ডার লক্ষ্যবস্তু করতে চাই না - আমরা কেবল ব্যবহারকারীদের যে কোনও ক্যালেন্ডার ব্যবহার করি না কেন ইভেন্টগুলিতে যুক্ত করতে সক্ষম হতে চাই user আমাদের অ্যাপ্লিকেশনটি এমন একটি ওয়েবসাইটকে একটি ইন্টারফেস সরবরাহ করে যা পেশাদার সভা এবং সম্মেলনগুলি আয়োজন করে। সুতরাং যদি কেউ কারও জন্য সাইন আপ করে তবে এটি তাদের ক্যালেন্ডারে পপ করা ভাল।
পিটার নেলসন

3
@ পিটার নেলসন: "আমরা একটি নির্দিষ্ট ক্যালেন্ডারকে টার্গেট করতে চাই না - আমরা কেবল ব্যবহারকারীদের যে কোনও ক্যালেন্ডার ব্যবহার করছি, কেবল ব্যবহারকারীদের সুবিধার্থে ইভেন্টগুলি যুক্ত করতে সক্ষম হতে চাই।" - উইন্ডোজে আপনি যা করতে পারেন তার চেয়ে বেশি অ্যানড্রয়েডে আপনি আর পারবেন না। দুটি প্ল্যাটফর্মের ক্ষেত্রেই আপনি কী জানেন যে "ব্যবহারকারীরা যে কোনও ক্যালেন্ডার ব্যবহার করছে" এবং কোনও প্ল্যাটফর্মেই এই জাতীয় ক্যালেন্ডার অ্যাপ্লিকেশন নিয়ে কাজ করার জন্য একটি সর্বজনীন এপিআই নেই।
কমন্সওয়েয়ার

22
আপনি কেন এটি উইন্ডোজের সাথে তুলনা করে চলেছেন তা আমি জানি না - আমার পরিচিত প্রত্যেক ব্যক্তি তাদের ফোনটি তাদের সময়সূচী এবং অ্যাপয়েন্টমেন্টগুলি গুছিয়ে রাখার জন্য ব্যবহার করে - আমি তাদের কাউকেই চিনি না যারা তাদের পিসিতে এটি করে - সম্ভবত এটি একটি প্রজন্মের জিনিস। তবে আমি পেয়েছি যে অ্যান্ড্রয়েড এটি করতে পারে না। ধন্যবাদ।
পিটার নেলসন

5
@ পিটার নেলসন: আমি এটি উইন্ডোজের সাথে তুলনা করে চলেছি কারণ লোকেরা একই ধারণা অনুধাবন করে। অনেকগুলি বিকাশকারী মনে করেন যে তারা উইন্ডোজটিতে "ব্যবহারকারীরা যে কোনও ক্যালেন্ডার ব্যবহার করছেন" তাতে ইভেন্টগুলি যুক্ত করতে পারে, কারণ তারা মনে করে যে সবাই আউটলুক ব্যবহার করে এবং তাই কেবলমাত্র "যাই হোক না কেন ক্যালেন্ডার" রয়েছে।
কমন্সওয়্যার

1
@ ইয়ার: "মূল অ্যান্ড্রয়েড ফোন ক্যালেন্ডার, যে কোনও অ্যান্ড্রয়েড ফোন রয়েছে" " - অ্যাপ্লিকেশনটি নেই এমন সমস্ত অ্যান্ড্রয়েড ডিভাইস বাদে। উদাহরণস্বরূপ, অনেক এইচটিসি ডিভাইসে সেই অ্যাপটি নেই, বরং তাদের নিজস্ব ক্যালেন্ডার অ্যাপ্লিকেশন রয়েছে, যেমন আমার বামে এইচটিসি ড্রোড অবিশ্বাস্য। ইঞ্চি। ডিভাইস প্রস্তুতকারকরা ক্যালেন্ডার অ্যাপটি - বা অন্য কোনও অ্যাপ্লিকেশন সম্পর্কে - তাদের নিজস্ব প্রয়োগের মাধ্যমে প্রতিস্থাপন করতে স্বাগত।
কমন্সওয়্যার

290

আপনার কোড এ চেষ্টা করুন:

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
আমি এই সমাধানটি অনেক পছন্দ করি। মূলত কারণ এটি ব্যবহারকারীকে তার নিজস্ব ক্যালেন্ডার নির্বাচন করতে চাপ দেয় (যদি তার একাধিক থাকে)।
সেবাস্তিয়ান রথ

2
এটিকে অ্যান্ড্রয়েড ২.২ এর জন্য কীভাবে সামঞ্জস্য করবেন?
শ্রীকান্ত পাই পাই

13
আপনি সেট টাইপের পরিবর্তে .setData (ক্যালেন্ডার কনট্রাক্ট.ইভেন্টস.কন্ট্রিউরি) ব্যবহার করা উচিত কারণ সেট টাইপ (স্ট্রিং) দিয়ে এটি কিছু ডিভাইসে ক্রাশ হবে!
Informatic0re

4
এখানে সম্পূর্ণ টিউটোরিয়াল: কোড. tutsplus.com/tutorials/… টাইপস এড়ানোর জন্য ধ্রুবক ব্যবহার করা আরও ভাল;)
অ্যাড্রিয়েন ক্যাডেট

7
আপনার কোডটি আপনার অ্যাপ্লিকেশনটিকে অন্য একটি (ক্যালেন্ডার) অ্যাপ্লিকেশনে ডেটা প্রেরণ করতে বলে যা এরপরে নতুন ক্যালেন্ডার ইভেন্ট যুক্ত করতে সেই ডেটা ব্যবহার করে। আপনার অ্যাপ্লিকেশন ক্যালেন্ডার ডেটা লিখছে বা পড়বে না, তাই আপনাকে ম্যানিফেস্টে কোনও অনুমতিের দরকার নেই।
গীত হয়েছে

66

এই কোডটি আপনার কোডটিতে ব্যবহার করুন .. এটি আপনাকে ইভেন্টটি সন্নিবেশ করতে সহায়তা করবে, অনুস্মারক সহ ইভেন্ট এবং মিটিংয়ের সাথে ইভেন্টটি সক্ষম করা যেতে পারে ... এই এপিআই প্ল্যাটফর্ম ২.১ এর জন্য কাজ করে এবং উপরে যাঁরা সামগ্রীর পরিবর্তে ২.১ এর চেয়ে কম ব্যবহার করেন: // কম .android.cender / ইভেন্টগুলি সামগ্রী: // ক্যালেন্ডার / ইভেন্টগুলি ব্যবহার করে

 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
আমি যুক্ত event.put("eventTimezone", "UTC/GMT +2:00")এবং মুছে ফেলা করেছি event.put("visibility", 3)এবং event.put("transparency", 0)এটি ভালভাবে কাজ করে
বৈধ ক্যাট

1
টাইমজোন ত্রুটি পেতে পারেন। আমি এটি এবং এর কাজগুলিকে ইভেন্টভ্যালু.পুট ("ইভেন্টটাইমজোন", টাইমজোন.জেট ডিফল্ট ()। GetID ()) জুড়েছি;
চেনিট

2
আমি android.database.sqlite.SQLiteExceptionলাইনে আছিUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
সিবিধরণ ২১

1
তবে আমি যখন মানগুলি সেট করি তখন একটি ("rrule", "FREQ = DAILY"); এবং এন্ডেট ডেট সেট করুন, এটি কাজ করছে না। সমস্ত দিন ইভেন্ট সেট শেষ তারিখ না হওয়া পর্যন্ত। @
অমিতাভা

1
মানগুলি। মান.পুট (ক্যালেন্ডারকন্ট্র্যাক্ট। রিমাইন্ডার্স.টাইটেল, "প্রতিদিনের রুটিন 1"); মান.পুট (ক্যালেন্ডারকন্ট্র্যাক্ট.রিমাইন্ডারস.ডিটিএসটিআরটি, মিলিসেকেন্ডসটাইমসএভারডে); মান.পুট (ক্যালেন্ডারকন্ট্র্যাক্ট। রিমাইন্ডারস Hএইচএস_এলআরএম, সত্য); মান.পুট ("rrule", "FREQ = DAILY"); // ইউএনটিআইএল = 1924885800000 মান.পুট (ক্যালেন্ডারকন্ট্রাক্ট.রিমাইন্ডার্স.ডিটিএন্ডএড, এন্ডটাইমইনমিলিসেকেন্ডস); @
অমিতাবা

57

আমি নীচের কোডটি ব্যবহার করেছি, এটি আইসিএসে ডিফল্ট ডিভাইস ক্যালেন্ডারে ইভেন্ট যুক্ত করতে এবং আইসিএসের কম সংস্করণে আমার সমস্যা সমাধান করে

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

আশা করি এটি সাহায্য করবে .....


বিল্ড.ভ্যাশন.এসডি কে.এনপি> 14 সম্পর্কে, আমি কীভাবে 60 মিনিটের জন্য একটি ডিফল্ট অনুস্মারক যুক্ত করতে পারি এবং আমি কীভাবে অনুস্মারকের আইডি পেতে পারি? ধন্যবাদ
ব্যবহারকারী 1796624

হাই, আমি ভাবছিলাম যে এটি সম্পাদনাযোগ্য ক্যালেন্ডার ক্ষেত্রগুলি দেখায় এমন পর্দাটি সংশোধন করা সম্ভব (যেমন কিছু মতামত কীভাবে পরিবর্তিত হয়)?
ব্যবহারকারী 1950599

@ ব্যবহারকারী1950599 অবশ্যই না। ইন্টেন্টটি অন্য অ্যাপ্লিকেশন থেকে একটি ক্রিয়াকলাপ শুরু করে এবং এর সাথে একমাত্র ইন্টারঅ্যাকশনটি হ'ল ডেটাটি আপনি উদ্দেশ্যটির মাধ্যমে প্রেরণ করেন।
পাইজুসন

40

অ্যান্ড্রয়েড সংস্করণ হিসাবে official.০ অফিশিয়াল এপিআই এবং ইনটেন্ট উপলব্ধ ক্যালেন্ডার সরবরাহকারীদের সাথে ইন্টারঅ্যাক্ট করার জন্য উপলব্ধ ।


4
সত্যিই দরকারী মন্তব্য, এটি যথেষ্ট চাপ দিতে পারে না :)
ওয়ারপজিট

1
কেবলমাত্র লিংক-উত্তর সহ আপনি কিছু কোড সরবরাহ করতে পারেন?
jww

8

কারও ক্ষেত্রে যদি সি # তে জ্যামারিনের জন্য কারও এটির প্রয়োজন হয়:

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

সহায়ক কার্যাদি:

    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

গুগল ক্যালেন্ডার হল "নেটিভ" ক্যালেন্ডার অ্যাপ। যতদূর আমি জানি, সমস্ত ফোনগুলি এর সংস্করণ ইনস্টল হয় এবং এটি ডিফল্ট এসডিকে একটি সংস্করণ সরবরাহ করে।

এটির সাথে কাজ করার জন্য আপনি এই টিউটোরিয়ালটি পরীক্ষা করে দেখতে পারেন।


7

এটা চেষ্টা কর ,

   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

আপনার যদি তারিখ এবং সময় সহ একটি নির্দিষ্ট তারিখের স্ট্রিং থাকে।

যেমন String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

ক্যালেন্ডারে তারিখ এবং সময় সহ একটি ইভেন্ট যুক্ত করতে নিম্নলিখিত কোডটি ব্যবহার করুন

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

আপনাকে পতাকা যুক্ত করতে হবে:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

অথবা আপনি এর মাধ্যমে ত্রুটি সৃষ্টি করবেন:

startActivity() ক্রিয়াকলাপের প্রেক্ষাপটের বাইরে থেকে প্রয়োজন FLAG_ACTIVITY_NEW_TASK

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.