Начало активности в календаре

Я просто пытался запустить Calendar Activity с моего Activity. У меня есть следующий код в моем Button OnClickListener:

Intent calIntent = new Intent(Intent.ACTION_INSERT);
calIntent.setData(Uri.parse("content://com.android.calendar/events/"));  
startActivity(calIntent);

Но когда я нажимаю Button, мое устройство зависает, и мне приходится принудительно закрывать не отвечающее приложение.


person Aduait Pokhriyal    schedule 13.06.2012    source источник
comment
Какую версию Android вы используете? Это ICS или новее?   -  person McGarnagle    schedule 13.06.2012
comment
Android 4.0 API уровня 14   -  person Aduait Pokhriyal    schedule 13.06.2012


Ответы (5)


Это связано с тем, что Uri календаря отличается для разных версий (уровни API). андроид. Попробуйте этот код, чтобы получить Uri календаря для соответствующего уровня API.

/*
  * Determines if it's a pre 2.1 or a 2.2 calendar Uri, and returns the Uri
  */
 private String getCalendarUriBase(Context con) {
     String calendarUriBase = null;
     Uri calendars = Uri.parse("content://calendar/calendars");
     Cursor managedCursor = null;
     try {
         managedCursor = managedQuery(calendars, null, null, null, null);
     } catch (Exception e) {
         // eat
     }

     if (managedCursor != null) {
         calendarUriBase = "content://calendar/";
     } else {
         calendars = Uri.parse("content://com.android.calendar/calendars");
         try {
             managedCursor = managedQuery(calendars, null, null, null, null);
         } catch (Exception e) {
             // statement to print the stacktrace
         }

         if (managedCursor != null) {
             calendarUriBase = "content://com.android.calendar/";
         }

     }

     return calendarUriBase;
 }
person Pattabi Raman    schedule 13.06.2012

Это мой личный класс CalendarOrganizer, они изменили способ доступа к календарю из сэндвича с мороженым, на самом деле перед сэндвичем с мороженым рекомендуется использовать их онлайн-сервисы для обновления календаря, поскольку календарь Google может быть изменен или даже не установлен.

Правка. Я узнал, что мне нужно решать проблемы с намерением, но также и то, что некоторые телефоны на бутерброде с мороженым будут аварийно завершать работу из-за Intent.ACTION_INSERT, но не из-за Intent.ACTION_EDIT. Поэтому я обновил свою реализацию. Спасибо этому сообщению за решение.

import android.content.Context;
import android.content.Intent;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Events;

public class CalendarOrganizer {
    private final static int ICE_CREAM_BUILD_ID = 14;
    /**
     * Creates a calendar intent going from startTime to endTime
     * @param startTime
     * @param endTime
     * @param context
     * @return true if the intent can be handled and was started, 
     * false if the intent can't be handled
     */
    public static boolean createEvent(long startTime, long endTime, String title, String description, 
            String location, boolean isAllDay, Context context) {
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < ICE_CREAM_BUILD_ID) {
            // all SDK below ice cream sandwich
            Intent intent = new Intent(Intent.ACTION_EDIT);
            intent.setType("vnd.android.cursor.item/event");
            intent.putExtra("beginTime", startTime);
            intent.putExtra("endTime", endTime);
            intent.putExtra("title", title);
            intent.putExtra("description", description);
            intent.putExtra("eventLocation", location);
            intent.putExtra("allDay", isAllDay);
//          intent.putExtra("rrule", "FREQ=YEARLY");

            try {
                context.startActivity(intent);
                return true;
            } catch(Exception e) {
                return false;
            }
        } else {
            // ice cream sandwich and above
            Intent intent = new Intent(Intent.ACTION_EDIT);
            intent.setType("vnd.android.cursor.item/event");
            intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime);
            intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime);
            intent.putExtra(Events.TITLE, title);
            intent.putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE);
            intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY , isAllDay);
            intent.putExtra(Events.DESCRIPTION, description);
            intent.putExtra(Events.EVENT_LOCATION, location);

//          intent.putExtra(Events.RRULE, "FREQ=DAILY;COUNT=10") 
            try {
                context.startActivity(intent);
                return true;
            } catch(Exception e) {
                return false;
            }
        }
    }
}
person Warpzit    schedule 13.06.2012

Вот код, который работал у меня (используя > v4):

Uri uri = Uri.parse("content://com.android.calendar/events");
Intent calIntent = new Intent("android.intent.action.INSERT", uri)
    .setAction(Intent.ACTION_INSERT);
startActivity(calIntent);
person McGarnagle    schedule 13.06.2012

Для справки, намерения календаря ICS задокументированы здесь.

http://developer.android.com/guide/topics/providers/calendar-provider.html#intents

person user1139880    schedule 30.06.2012

Вот код, который работал у меня

Не нужно создавать активность в манифесте.

Будет работать со всеми платформами Android.

Покажет вам вид календаря на текущий месяц

            long epoch = new Date.getTime();
            Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
            builder.appendPath("time");
            ContentUris.appendId(builder, epoch);
            Intent intent = new Intent(Intent.ACTION_VIEW)
                    .setData(builder.build());
            startActivity(intent);
person Tejinder Bansal    schedule 03.03.2016