2013-07-22 13 views
5

Sono molto confuso su come utilizzare i colori in Android CalendarProvider. Posso aggiungere eventi, ma quando provo a inserirne uno con un colore particolare, questa preferenza sembra essere ignorata per il colore predefinito del calendario (blu chiaro).Android CalendarProvider Events Colore

Immagino di non essere esattamente sicuro di come vengono usati i colori. Mi chiedo se qualcuno potrebbe essere così gentile da fare luce sull'argomento.

Nel frattempo, ecco il mio codice (parametro Event è una classe personalizzata, so che il nome si confonde):

public long insert(Event event) throws ParseException{ 

    ContentValues eventValues = new ContentValues(); 
    eventValues.put("calendar_id", 1); 
    eventValues.put(Events.SYNC_DATA1, event.getId()); 
    eventValues.put(Events.TITLE, event.getTitle()); 
    eventValues.put(Events.DESCRIPTION, event.getTitle()); 
    eventValues.put(Events.EVENT_COLOR, Color.RED); 
    eventValues.put(Events.EVENT_TIMEZONE, "Europe/Rome"); 

    eventValues.put(Events.DTSTART, event.getStart().getTime()); 
    eventValues.put(Events.DTEND, event.getEnd().getTime()); 

    Uri eventUri = mContentResolver.insert(Uri.parse(eventUriString).buildUpon().appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true").appendQueryParameter(Calendars.ACCOUNT_NAME, "DUMMY").appendQueryParameter(Calendars.ACCOUNT_TYPE, "accountType").build(), eventValues); 
    return Long.parseLong(eventUri.getLastPathSegment()); 
} 

Grazie.

risposta

3

Beh, credo di essere stato bruciato l'altra notte. Tuttavia, nel caso in cui qualcun altro finisca qui, è giusto dare una breve spiegazione sull'interazione Calendario-> Eventi per quanto ho capito.

Per farla breve: i colori degli eventi dipendono dal calendario in cui li hai inseriti. Perché c'è una colonna events_color se viene sostituita dal colore del Calendario? Sapevo che lo sapevo.

Quindi, una volta che si imposta lo SyncAdapter fantasia, utente ecc è necessario creare un nuovo calendario:

public long insertCalendar(EventType eventType) { 

    Uri calUri = CalendarContract.Calendars.CONTENT_URI; 
    ContentValues cv = new ContentValues(); 
    cv.put(CalendarContract.Calendars.ACCOUNT_NAME, "DUMMY"); 
    cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL); 
    cv.put(CalendarContract.Calendars.NAME, eventType.getDescription()); 
    cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, eventType.getDescription()); 
    cv.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.parseColor(eventType.getColor())); 
    cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER); 
    cv.put(CalendarContract.Calendars.OWNER_ACCOUNT, true); 
    cv.put(CalendarContract.Calendars.VISIBLE, 1); 
    cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1); 
    //cv.put(CalendarContract.Calendars.CAL_SYNC1, eventType.getId()); 

    calUri = calUri.buildUpon() 
     .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") 
     .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "DUMMY") 
     .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL) 
     .build(); 

    Uri result = mContentResolver.insert(calUri, cv); 
    return Long.parseLong(result.getLastPathSegment()); 
} 

Si prega di notare che sto mettendo un colore nella colonna CALENDAR_COLOR, in questo caso io' Sto analizzando qualcosa come # 000000 in Color.BLACK. Notare anche il valore all'interno di ACCOUNT_TYPE. Da quello che ho raccolto non sembra esserci un altro modo per aggirare questo.

public long insert(Event event, long calendarID) throws ParseException { 

    EventTypeDal adapter = new EventTypeDal(); 
    EventType et = adapter.GetEventTypeById(event.getFkEventType()); 

    ContentValues eventValues = new ContentValues(); 

    eventValues.put("calendar_id", calendarID); 
    //eventValues.put(Events.SYNC_DATA1, event.getId()); 
    eventValues.put(Events.TITLE, event.getTitle()); 
    eventValues.put(Events.DESCRIPTION, et.getDescription()); 

    eventValues.put(Events.EVENT_TIMEZONE, "Europe/Rome"); 

    eventValues.put(Events.DTSTART, event.getStart().getTime()); 
    eventValues.put(Events.DTEND, event.getEnd().getTime()); 

    Uri eventUri = mContentResolver.insert(Uri.parse(eventUriString).buildUpon().appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true").appendQueryParameter(Calendars.ACCOUNT_NAME, "DUMMY").appendQueryParameter(Calendars.ACCOUNT_TYPE, "accountType").build(), eventValues); 
    return Long.parseLong(eventUri.getLastPathSegment()); 
} 

Ora sto mettendo un evento all'interno di un calendario (param calendarID). Questo evento verrà visualizzato con il colore del calendario.

1

È necessario utilizzare Events.EVENT_COLOR_KEY anziché EVENT_COLOR (che è di sola lettura). Il valore che utilizzi deve essere un COLOR_KEY dal ColorsColumns table di tipo TYPE_EVENT.