2011-10-05 13 views
6

Estoy intentando actualizar el evento de un calendario en mi teléfono desde mi código, pero la actualización context.getContentResolver(). Continúa mostrando 0 y, por supuesto, no se realizaron cambios en el evento cuando lo miro en la aplicación Calendario.No se puede actualizar el evento en el calendario del teléfono desde el código

Recibo la identificación del evento, la hora de inicio, etc. con la consulta context.getContentResolver(). Obtengo números únicos como 431, 4, 233, etc., así que supongo que los identificadores de eventos I Estoy usando son reales.

Entiendo que la manera oficial de hacerlo es ir a través de los servidores de Google en lugar de usar update(), pero para mi implementación no tiene sentido hacerlo de esa manera (o incluso en general, pero estoy divagando) .

¿Estoy haciendo algo mal, o estoy tratando de hacer algo que Android simplemente no va a permitir?

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 cuestión relacionada fue publicada aquí con ninguna respuesta https://stackoverflow.com/questions/5636350/update-android-calendar-event

Avísame si puedo aclarar cualquier cosa; ¡Realmente agradecería cualquier aporte que ustedes y las muñecas puedan proporcionar!

+0

Espero que el permiso del usuario no tenga nada que ver con él – the100rabh

+0

Parte de mí desea que fue/es el caso; al menos sería una solución fácil. Tengo android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR establecido en el manifiesto – atraudes

+0

y el calendario que estoy tratando de alterar es mi calendario principal de google, así que dudo que sea de solo lectura o algo – atraudes

Respuesta

3

Había intentado mucho y finalmente terminó con la solución (no fiable sin embargo) .. pero funciona bien ..

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

y, finalmente, no estoy seguro si funciona con todos los dispositivos.

+0

trabajé durante unas horas en este último de noche y creo que su sugerencia me llevó a la respuesta. Publicaré todos los detalles sobre la solución y marcaré su respuesta como aceptada una vez que termine de desenredarla esta noche. ¡Gracias! – atraudes

2

Ok, entonces, el problema era que estaba usando diferentes URI entre buscar los eventos y editarlos. He utilizado el ejemplo de código de here y estaba usando el URI "contenido: //com.android.calendar/instances/when" a buscar a los eventos y mostrarlos en la pantalla. Cuando hice un cambio, estaba usando "content: //com.android.calendar/events" para editar por id como en mi ejemplo anterior.

Lo que encontré, gracias a su respuesta, ntc, fue que los ids para los eventos entre los dos URIs eran diferentes, y por lo tanto no pude editar los eventos de forma coherente con la información que cada uno me daba. Estaba suponiendo que los identificadores de eventos que recibía eran identificadores del sistema y universales para el teléfono.

supongo que tendré que hacer algunas pruebas y ver lo que el hardware no es compatible con este método. Estoy usando un HTC Evo para probar y hasta ahora todo va bien.

+0

Me encantaría la opinión de cualquiera sobre por qué este es el caso. Lo tengo funcionando ahora, pero estoy perplejo sobre por qué los identificadores eran diferentes – atraudes

0

Al consultar la tabla Instances, utilice Instances.EVENT_ID para obtener el identificador del evento que desea editar, en lugar de Instances._ID.

Cuestiones relacionadas