2012-12-04 5 views
20

Chcę dodać zdarzenia kalendarza programowo (bezpośrednio) w Androidzie 4+. Czy można testować na emulatorze? Nie mam telefonu z Androidem. Doceniony zostanie przykładowy kod. Czytam dostawcę kalendarza dla programistów Androida, ale jestem zdezorientowany. Jak mogę dodać wydarzenia do domyślnego kalendarza użytkownika? Nie muszę być zsynchronizowane.Jak dodać wydarzenia kalendarza do domyślnego kalendarza, bez użycia intencji, w Androidzie 4?

EDYCJA: Nie chcę uruchamiać zdarzenia dodającego zamiar. Zamiast tego chcę je całkowicie dodać z kodu i nie uruchamiać innej czynności. Muszę umieć przetestować na emulatorze, czy wydarzenia zostaną dodane do głównego kalendarza domyślnego użytkownika urządzenia. Jak skonfigurować emulator, aby wyświetlić domyślny kalendarz użytkownika?

+0

Możliwy duplikat [Jak dodać kalendarz imprez w Androidzie?] (http://stackoverflow.com/questions/3721963/how-to-add-calendar -events-in-android) – jww

+1

@jww On chce to zrobić po cichu, inaczej niż inne pytanie – vitormm

Odpowiedz

32

Here jest przykładem pracy, co w końcu zrobiłem to:

ContentResolver cr = ctx.getContentResolver(); 
ContentValues values = new ContentValues(); 

values.put(CalendarContract.Events.DTSTART, dtstart); 
values.put(CalendarContract.Events.TITLE, title); 
values.put(CalendarContract.Events.DESCRIPTION, comment); 

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

// Default calendar 
values.put(CalendarContract.Events.CALENDAR_ID, 1); 

values.put(CalendarContract.Events.RRULE, "FREQ=DAILY;UNTIL=" 
     + dtUntill); 
// Set Period for 1 Hour 
values.put(CalendarContract.Events.DURATION, "+P1H"); 

values.put(CalendarContract.Events.HAS_ALARM, 1); 

// Insert event to calendar 
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values); 

gdzie dtuntil jest

SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd"); 
Calendar dt = Calendar.getInstance(); 

// Where untilDate is a date instance of your choice, for example 30/01/2012 
dt.setTime(untilDate); 

// If you want the event until 30/01/2012, you must add one day from our day because UNTIL in RRule sets events before the last day 
dt.add(Calendar.DATE, 1); 
String dtUntill = yyyyMMdd.format(dt.getTime()); 

Ref: Recurrence Rule

+3

Czy format nie powinien mieć wartości "rrrrMMdd" zamiast "rrrrmmdd"? "m" oznacza minuty zgodnie z tym: http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html – silmeth

+0

Alarm działa tylko dla mnie w tym formacie: 'values.put (CalendarContract.Events.HAS_ALARM, false); ' – keybee

+0

spójrz na ten problem: http://stackoverflow.com/questions/28871921/add-weekly-event-to -calendar – Sun

9

Uważam, że sekcja, której szukasz, to Using an intent to insert an event. W tej sekcji opisano sposób tworzenia intencji wydarzenia, które chcesz dodać, a następnie domyślny program kalendarza na emulatorze odpowie i doda go. Być może będziesz musiał skonfigurować fałszywy profil, aby program kalendarza został uruchomiony, jeśli rzeczywiście chcesz, aby otrzymywał poprawne informacje.


Kod z Android Dev Site:

Calendar beginTime = Calendar.getInstance(); 
beginTime.set(2012, 0, 19, 7, 30); 
Calendar endTime = Calendar.getInstance(); 
endTime.set(2012, 0, 19, 8, 30); 
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, "[email protected],[email protected]"); 
startActivity(intent); 
+1

Nie chcę dodawać tego zdarzenia programowo.z jak http://stackoverflow.com/questions/7859005/how-to- czytaj i edytuj-android-kalendarz-event-using-the-new-android-4-0-ice-cream – oikonomopo

+0

W tym linku również pokazują tę metodę powyżej. Jak to opisałem, nie programując? Masz na myśli, że nie chcesz używać intencji? Chcesz cicho dodawać zdarzenia na wypowiedź? – Velocitas

+1

Tak, chcę cicho dodawać zdarzenia do domyślnego kalendarza. – oikonomopo

2

Za pomocą tego kodu, można programowo dodać wydarzenie do kalendarza urządzenia. Testowałem w Marshmallow i działa to dla mnie dobrze.

private void addToDeviceCalendar(String startDate,String endDate, String title,String description, String location) { 

     String stDate = startDate; 
     String enDate = endDate; 

     GregorianCalendar calDate = new GregorianCalendar(); 
     //GregorianCalendar calEndDate = new GregorianCalendar(); 

     SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
     SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy,MM,dd,HH,mm"); 
     Date date,edate; 
     try { 
      date = originalFormat.parse(startDate); 
      stDate=targetFormat.format(date); 

     } catch (ParseException ex) {} 

     long startMillis = 0; 
     long endMillis = 0; 
     String dates[] = stDate.split(","); 

     SD_YeaR = dates[0]; 
     SD_MontH = dates[1]; 
     SD_DaY = dates[2]; 
     SD_HouR = dates[3]; 
     SD_MinutE = dates[4]; 


     /*Log.e("YeaR ", SD_YeaR); 
     Log.e("MontH ",SD_MontH); 
     Log.e("DaY ", SD_DaY); 
     Log.e(" HouR", SD_HouR); 
     Log.e("MinutE ", SD_MinutE);*/ 

     calDate.set(Integer.parseInt(SD_YeaR), Integer.parseInt(SD_MontH)-1, Integer.parseInt(SD_DaY), Integer.parseInt(SD_HouR), Integer.parseInt(SD_MinutE)); 
     startMillis = calDate.getTimeInMillis(); 
/* 
     try { 
      edate = originalFormat.parse(endDate); 
      enDate=targetFormat.format(edate); 

     } catch (ParseException ex) {} 


     String end_dates[] = endDate.split(","); 

     String ED_YeaR = end_dates[0]; 
     String ED_MontH = end_dates[1]; 
     String ED_DaY = end_dates[2]; 

     String ED_HouR = end_dates[3]; 
     String ED_MinutE = end_dates[4]; 


     calEndDate.set(Integer.parseInt(ED_YeaR), Integer.parseInt(ED_MontH)-1, Integer.parseInt(ED_DaY), Integer.parseInt(ED_HouR), Integer.parseInt(ED_MinutE)); 
     endMillis = calEndDate.getTimeInMillis();*/ 

     try { 
      ContentResolver cr = getActivity().getContentResolver(); 
      ContentValues values = new ContentValues(); 
      values.put(CalendarContract.Events.DTSTART, startMillis); 
      values.put(CalendarContract.Events.DTEND, calDate.getTimeInMillis() + 60 * 60 * 1000); 
      values.put(CalendarContract.Events.TITLE, title); 
      values.put(CalendarContract.Events.DESCRIPTION, description); 
      values.put(CalendarContract.Events.EVENT_LOCATION,location); 
      values.put(CalendarContract.Events.HAS_ALARM,1); 
      values.put(CalendarContract.Events.CALENDAR_ID, 1); 
      values.put(CalendarContract.Events.EVENT_TIMEZONE, Calendar.getInstance() 
        .getTimeZone().getID()); 
      System.out.println(Calendar.getInstance().getTimeZone().getID()); 
      if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { 

       return; 
      } 
      Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values); 

      long eventId = Long.parseLong(uri.getLastPathSegment()); 
      Log.d("Ketan_Event_Id", String.valueOf(eventId)); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+1

proszę dodać kilka punktów, a nie tylko wklejać kod. – surajsn

+0

@Kanan Ramani: Nie działa na urządzeniu Marshmellow, ale nie ma błędu. – Aniruddha

+0

Myślę, że brakuje jakiejś części w tym kodzie ... – exequielc

0

Zgadzam się z odpowiedziami ale przede wszystkim import jest kalendarz Id. nie możesz użyć 1, ponieważ telefon Samsung używa 1 do swojego kalendarza (S Planner). Ten identyfikator kalendarza jest identyfikatorem, dla którego e-mail chcesz wydarzenie. można dostać kalandrującego id wykonując kod dla określonego zdarzenia

int calenderId=-1; 
     String calenderEmaillAddress="[email protected]"; 
     String[] projection = new String[]{ 
       CalendarContract.Calendars._ID, 
       CalendarContract.Calendars.ACCOUNT_NAME}; 
     ContentResolver cr = activity.getContentResolver(); 
     Cursor cursor = cr.query(Uri.parse("content://com.android.calendar/calendars"), projection, 
       CalendarContract.Calendars.ACCOUNT_NAME + "=? and (" + 
         CalendarContract.Calendars.NAME + "=? or " + 
         CalendarContract.Calendars.CALENDAR_DISPLAY_NAME + "=?)", 
       new String[]{calenderEmaillAddress, calenderEmaillAddress, 
         calenderEmaillAddress}, null); 

     if (cursor.moveToFirst()) { 

      if (cursor.getString(1).equals(calenderEmaillAddress)) 
       calenderId=cursor.getInt(0); //youre calender id to be insered in above 2 answer 


     }