usar studio notificaciones google eventos escritorio configurar compartir como calendario añadir app java android android-calendar

java - studio - ¿Cómo agregar eventos del calendario al calendario predeterminado, en silencio y sin intención, en Android 4?



notificaciones google calendar android (5)

Quiero agregar eventos de calendario programáticamente (directamente) en Android 4+. ¿Es esto posible ser probado en el emulador? No tengo un teléfono android. Un código de ejemplo sería apreciado. Leí el proveedor de calendario de los desarrolladores de Android, pero estoy confundido. ¿Cómo puedo agregar eventos al calendario predeterminado de un usuario? No necesito estar sincronizado.

EDITAR: No quiero lanzar un evento que agregue Intención. En su lugar, quiero agregarlos completamente desde el código y no lanzar otra actividad. Necesito poder probar en un emulador que los eventos se agregarán al calendario principal del usuario predeterminado del dispositivo. ¿Cómo configuro un emulador para ver el calendario predeterminado del usuario?


Con este código, puede agregar un evento al calendario del dispositivo mediante programación. He probado en Marshmallow, y funciona bien para mí.

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


Creo que la sección que está buscando es Usar un intento de insertar un evento . En esta sección, se describe cómo crear una intención para el evento que desea agregar y luego el programa de calendario predeterminado en el emulador responderá y lo agregará. Es posible que tenga que configurar un perfil ficticio para que el programa de calendario se inicie si realmente desea ver que recibe la información correcta.

Código del sitio de desarrollo de Android :

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


De acuerdo con las respuestas anteriores, pero la importación es el ID del calendario. no puede usar 1, ya que el teléfono samsung usa 1 para su calendario (S Planner). Por lo tanto, el ID de calendario es id para el correo electrónico que desea enviar. puede obtener la identificación del calendario siguiendo el código para un evento específico

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 }


Esta es la forma de preguntar al usuario a qué calendario se debe agregar el evento. Como mi requisito era este y no encontré la solución en un solo lugar. He resumido y encontré esta solución, espero que ayude a alguien :)

final ContentResolver cr = this.getContentResolver(); Cursor cursor ; if (Integer.parseInt(Build.VERSION.SDK) >= 8 ) cursor = cr.query(Uri.parse("content://com.android.calendar/calendars"), new String[]{ "_id", "calendar_displayName" }, null, null, null); else cursor = cr.query(Uri.parse("content://calendar/calendars"), new String[]{ "_id", "displayname" }, null, null, null); if (cursor != null && cursor.moveToFirst() ) { final String[] calNames = new String[cursor.getCount()]; final int[] calIds = new int[cursor.getCount()]; for (int i = 0; i < calNames.length; i++) { calIds[i] = cursor.getInt(0); calNames[i] = cursor.getString(1); cursor.moveToNext(); } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); final long startDate = sdf.parse(slotData.getSlot_date() + " " + slotData.getSlot_from()).getTime(); final long endDate = sdf.parse(slotData.getSlot_date() + " " + slotData.getSlot_to()).getTime(); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select any one"); builder.setSingleChoiceItems(calNames, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ContentValues cv = new ContentValues(); cv.put("calendar_id", calIds[which]); cv.put("title", title); cv.put("dtstart", startDate); cv.put("hasAlarm", 1); cv.put("dtend", endDate); cv.put("eventTimezone", TimeZone.getDefault().getID()); Uri newEvent ; if (Integer.parseInt(Build.VERSION.SDK) >= 8 ) newEvent = cr.insert(Uri.parse("content://com.android.calendar/events"), cv); else newEvent = cr.insert(Uri.parse("content://calendar/events"), cv); if (newEvent != null) { long id = Long.parseLong( newEvent.getLastPathSegment() ); ContentValues values = new ContentValues(); values.put( "event_id", id ); values.put( "method", 1 ); values.put( "minutes", 15 ); // 15 minutes if (Integer.parseInt(Build.VERSION.SDK) >= 8 ) cr.insert( Uri.parse( "content://com.android.calendar/reminders" ), values ); else cr.insert( Uri.parse( "content://calendar/reminders" ), values ); } dialog.cancel(); } }); builder.create().show(); } if (cursor != null) { cursor.close(); }


Here hay un ejemplo de trabajo de lo que finalmente lo hice:

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

donde dtuntil es

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