2011-10-05 19 views
6

Sto tentando di aggiornare l'evento di un calendario sul mio telefono dal mio codice, ma l'aggiornamento context.getContentResolver(). Continua a restituire 0 e, naturalmente, non vengono apportate modifiche a l'evento quando lo guardo nell'app Calendario.Impossibile aggiornare l'evento sul calendario del telefono dal codice

Ricevo l'ID evento, l'ora di inizio, ecc. Con context.getContentResolver(). Query, e ottengo numeri univoci come 431, 4, 233, ecc. Quindi presumo gli ID evento I sto usando sono reali.

Capisco che il modo ufficiale per farlo è quello di passare attraverso i server di Google invece di usare update(), ma per la mia implementazione non ha senso farlo in quel modo (o anche in generale, ma sto divagando) .

Sto facendo qualcosa di sbagliato, o sto cercando di fare qualcosa che Android semplicemente non permetterà?

Uri updateEventUri = ContentUris.withAppendedId(Uri.parse("content://com.android.calendar/events"), id); 

ContentValues cv = new ContentValues(); 
begin.set(Calendar.HOUR_OF_DAY, arg0.getCurrentHour()); //begin is a java.util.Calendar object 
begin.set(Calendar.MINUTE, arg0.getCurrentMinute()); 
//cv.put("_id", id); 
//cv.put("title", "yeahyeahyeah!"); 
cv.put("dtstart", begin.getTimeInMillis()); 
int updatedrowcount = context.getContentResolver().update(updateEventUri, cv, null, null); 
System.out.println("updated "+updatedrowcount+" rows with id "+id); 

Una questione collegata è stata pubblicata qui con risposte https://stackoverflow.com/questions/5636350/update-android-calendar-event

Fatemi sapere se posso chiarire nulla; Gradirei davvero ogni contributo che voi ragazzi e bambole potreste fornire!

+0

Spero che il permesso dell'utente non abbia nulla a che fare con esso – the100rabh

+0

Una parte di me desidera che sia/è il caso; almeno sarebbe una soluzione facile. Ho Android.permission.READ_CALENDAR e android.permission.WRITE_CALENDAR impostato nel manifest – atraudes

+0

e il calendario che sto cercando di modificare è il mio calendario principale di Google, quindi dubito che sia di sola lettura o qualcosa di – atraudes

risposta

3

avevo provato un sacco e, infine, si è conclusa con la soluzione (inaffidabile però) .. ma funziona bene ..

public static boolean updateCalendar(Context context,String cal_Id,String eventId) 
    { 
    try{ 

     Uri CALENDAR_URI = Uri.parse(CAL_URI+"events"); 
     Cursor c = context.getContentResolver().query(CALENDAR_URI, null, null, null, null); 
     String[] s = c.getColumnNames(); 

     if (c.moveToFirst()) 
     { 
       while (c.moveToNext()) 
      { 

       String _id = c.getString(c.getColumnIndex("_id")); 
       String CalId = c.getString(c.getColumnIndex("calendar_id"));    
       if ((_id==null) && (CalId == null)) 
       { 
           return false; 
       } 
       else 
       { 
        if (_id.equals(eventId) && CalId.equals(cal_Id)) 
           { 
         Uri uri = ContentUris.withAppendedId(CALENDAR_URI, Integer.parseInt(_id)); 
         context.getContentResolver().update(uri, null, null, null);// need to give your data here 
         return true; 
        } 
       } 
      } 
     } 


    } 
    finally 
    { 
     return true; 
    } 
    } 

e, infine, non sono sicuro se funziona con tutti i dispositivi.

+0

Ho lavorato per alcune ore su quest'ultimo notte e credo che il tuo suggerimento mi ha portato alla risposta. Pubblicherò tutti i dettagli sulla soluzione e segnerò la tua risposta come accettata una volta che avrò finito di sbrogliarlo stasera. Grazie! – atraudes

2

Ok, quindi, il problema era che stavo usando diversi URI tra il recupero degli eventi e la loro modifica. Ho utilizzato il codice di esempio da here e utilizzavo l'URI "content: //com.android.calendar/instances/when" per recuperare gli eventi e visualizzarli sullo schermo. Quando ho apportato una modifica stavo usando "content: //com.android.calendar/events" per modificare con id come nel mio esempio sopra.

Quello che ho trovato, grazie alla tua risposta, ntc, era che gli id ​​per gli eventi tra i due URI erano diversi, e quindi non potevo modificare gli eventi in modo coerente con le informazioni che mi davano. Presumevo che gli id ​​degli eventi che stavo ottenendo fossero id di sistema e universali per il telefono.

Immagino che dovrò fare qualche test e vedere quale hardware non è compatibile con questo metodo. Sto usando un HTC Evo per i test e finora tutto bene.

+0

Mi piacerebbe che qualcuno inserisse il motivo per cui questo è il caso. Lo sto facendo ora, ma sono perplesso sul motivo per cui gli ID erano diversi – atraudes

0

Quando si esegue una query sulla tabella Instances, utilizzare Instances.EVENT_ID per ottenere l'identificativo per l'evento che si desidera modificare, anziché Instances._ID.

Problemi correlati