Интеграция Android Calendar в Android OS 4 - PullRequest
5 голосов
/ 05 марта 2012

Я использую недокументированные API для добавления события календаря для ОС Android 2.2. Теперь Android OS 4 вышла, естественно, API, которые я использовал, не работают! Я посмотрел на Android SDK относительно API-интерфейсов календаря на 14-м уровне, но не смог найти подсказку, как использовать это в своем проекте, который я создал с помощью Android OS 2.2. Потому что, когда я использую класс CalendarContract в моем проекте, он показывает ошибку. Поэтому я не могу найти подсказку, что делать и как использовать этот класс в моем проекте, который я создал с помощью ОС Android 2.2.

Если у кого-либо есть образцы или ссылка на образцы, сообщите мне.

Календарь Api Class

public abstract class CalendarAPI 
{
private static CalendarAPI api;

public static CalendarAPI getAPI() 
{
    String apiClass;
    if (Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.FROYO) {
        apiClass = "com.example.calendar.CycleManagerSDK8 ";
    } else {
        apiClass = "com.example.calendar.CycleManagerSDK14 ";
    }

    try 
    {
        Class<? extends CalendarAPI> realClass = Class.forName(apiClass).asSubclass(CalendarAPI.class);
        api = realClass.newInstance();
    } 
    catch (Exception e) 
    {
        throw new IllegalStateException(e);
    }

    return api;
}

public abstract boolean setAlertOnDevice(Context c) ;
}

класс для SDKVersion 8 - 13

public class CycleManagerSDK8 extends CalendarAPI
{
public boolean setAlertOnDevice(Context c)
{                   
    Resources res = c.getResources();

    Uri EVENTS_URI = Uri.parse("content://com.android.calendar/" + "events");

    Uri REMINDERS_URI = Uri.parse("content://com.android.calendar/" + "reminders");

        ContentResolver cr = c.getContentResolver();

    Date dtStartDate = getStartDate();  

    Calendar cal = Calendar.getInstance();

    cal.setTime(dtStartDate);
    cal.add(Calendar.DATE, m_iStart);

    cal.set(Calendar.HOUR_OF_DAY, 8);  
    cal.set(Calendar.MINUTE, DEFAULT_TIME_OF_DATE);     
    cal.set(Calendar.SECOND, DEFAULT_TIME_OF_DATE); 
    cal.set(Calendar.MILLISECOND, DEFAULT_TIME_OF_DATE);

    String str = m_reminderText + res.getString(R.string.alert_start);                                          
    m_strDescription = res.getString(R.string.alert_start_msg);

    ContentValues values = new ContentValues();
    values.put("calendar_id", 1);
    values.put("title", str);
    values.put("description", m_strDescription);                    
    values.put("dtstart", cal.getTimeInMillis()); 
    values.put("dtend", cal.getTimeInMillis()); 
    values.put("hasAlarm", 1);
    Uri event = cr.insert(EVENTS_URI, values);

    m_calendarEvents[m_calendarEventCount] = event;
    m_calendarEventCount = m_calendarEventCount + 1;

    values = new ContentValues();
    values.put("event_id", Long.parseLong(event.getLastPathSegment()));
    values.put("method", 1);
    values.put("minutes", 10);
    cr.insert(REMINDERS_URI, values);
}

}

класс для SDK версии 14

 public class CycleManagerSDK14 extends CalendarAPI
 {
      public void setAlertOnDevice(Context c)
     {
        long startMillis = 0; 
        long endMillis = 0;     
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2012, 2, 2, 7, 0);
        startMillis = beginTime.getTimeInMillis();
        Calendar endTime = Calendar.getInstance();
        endTime.set(2012, 2, 2, 7, 0);
        endMillis = endTime.getTimeInMillis();

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

        values.put(CalendarContract.Events.DTSTART, startMillis);
        values.put(CalendarContract.Events.DTEND, endMillis);
        values.put(CalendarContract.Events.TITLE, "Walk The Dog");
        values.put(CalendarContract.Events.DESCRIPTION, "My dog is bored, so we're going on a really long walk!");
        values.put(CalendarContract.Events.CALENDAR_ID, 1);
        values.put(CalendarContract.Events.EVENT_TIMEZONE, "eventTimezone");
            cr.insert(CalendarContract.Events.CONTENT_URI, values);
    }

}

Спасибо.

1 Ответ

3 голосов
/ 05 марта 2012

Как я понял, у вас 2 проблемы ...

  1. Вам необходим доступ к Calender в версии 2.2 (API 8 и выше)
  2. Из API 14 вам нужно использовать CalendarContract для доступа к Календарю

Я бы предложил создать абстрактный класс и определить индивидуальную реализацию.

Например

String apiClass;
if (Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT) {
    apiClass = "com.example.calendar.version8plus";
} else {
    apiClass = "com.example.calendar.version14plus";
}

try {
    Class<? extends CalendarAPI> realClass = Class.forName(apiClass).asSubclass(CalendarAPI.class);
    api = realClass.newInstance();
} catch (Exception e) {
    throw new IllegalStateException(e);
}

При этом вы создаете две разные реализации согласно API ...

При компиляции в зависимости от вашего уровня API исключите другой файл из компиляции, для этого вам нужно изменить уровень API в Manifest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...