2012-01-16 17 views
10

La aplicación de calendario en Android puede fusionar varios calendarios separados: calendario de teléfono local, calendarios de Google, etc.¿Cómo puedo agregar un nuevo calendario de teléfono a Android?

¿Cómo puedo agregar un nuevo calendario de este tipo al teléfono Android? Quiero generar dinámicamente los eventos en ese calendario sin acceder a ningún recurso en línea como Google.

Editar: Me gustaría apoyar teléfonos con Android 1.5 y 2.3.4. Probablemente recibiré una actualización de 4.0 para el teléfono más nuevo algún día, pero quién sabe cuándo será ...

+0

ICS: Usted tendrá que implementar un adaptador de sincronización para que la autoridad com.android.calendar y crear una fila en CalendarContract .Calendario donde configura ACCOUNT_NAME y ACCOUNT_TYPE a su nombre y valores. La funcionalidad para 2.3 y anterior no se ha publicado, pero funciona ... * aproximadamente * de la misma manera, pero ir hacia atrás para la interoperabilidad más allá de eso va a ser complicado y requerirá mucho tiempo para probarlo. – Jens

Respuesta

3

He encontrado this link que analiza el acceso al proveedor de contenido de calendario en teléfonos anteriores a la 4.0.

Básicamente sólo hay que conocer las cadenas URI para el proveedor:

  • content://calendar para Android 2.2 <
  • content://com.android.calendar para Android 2.2 +.
3

He escrito la siguiente actividad (más algunos recursos, etc.) para insertar un calendario (no sincronizado) en el emulador de API nivel 15 (porque la aplicación de calendario no tiene ninguna función para agregar un calendario a diferencia de la aplicación en mi teléfono (API 8), o no lo encontré ...). El diseño debe incluir campos de texto para el nombre y el nombre para mostrar del calendario, un botón de agregar y una vista de texto de estado para enviar comentarios después de la inserción. Asegúrate de que tienes los permisos establecidos en el manifiesto:

<uses-permission android:name="android.permission.WRITE_CALENDAR"/> 
<uses-permission android:name="android.permission.READ_CALENDAR"/> 

Aquí es Código:

public class CalUtilActivity extends Activity { 
private EditText name; 
private EditText display; 
private TextView status; 

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.main); 

    this.name = (EditText) this.findViewById(R.id.name); 
    this.display = (EditText) this.findViewById(R.id.displayname); 
    this.status = (TextView) this.findViewById(R.id.status); 

    final Button b = (Button) this.findViewById(R.id.add); 
    b.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(final View v) { 
      CalUtilActivity.this.addCalendar(); 
     } 
    }); 
} 

private void addCalendar() { 
    final String cname = this.name.getText().toString(); 
    final String dname = this.display.getText().toString(); 
    if(cname.length() == 0 || dname.length() == 0) { 
     this.status.setText(this.getResources().getString(R.string.errorNames)); 
     return; 
    } 
    this.status.setText(""); 

    final Uri calUri = CalendarContract.Calendars.CONTENT_URI; 
    final ContentValues v = new ContentValues(); 
    v.put(CalendarContract.Calendars.NAME, cname); 
    v.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, dname); 
    v.put(CalendarContract.Calendars.VISIBLE, 1); 

    final Uri result = this.getContentResolver().insert(calUri, v); 

    this.status.setText(result.toString()); 
} 

}

Para API 13 y antes de que usted no puede utilizar el proveedor de contenidos, hay que accede a la base de datos directamente. Para añadir un calendario debe agregar una fila a la tabla calendarios, que se define de acuerdo a la siguiente instrucción create

CREATE TABLE Calendars (_id INTEGER PRIMARY KEY,_sync_account TEXT,_sync_account_type TEXT,_sync_id TEXT,_sync_version TEXT,_sync_time TEXT,_sync_local_id INTEGER,_sync_dirty INTEGER,_sync_mark INTEGER,url TEXT,name TEXT,displayName TEXT,hidden INTEGER NOT NULL DEFAULT 0,color INTEGER,access_level INTEGER,selected INTEGER NOT NULL DEFAULT 1,sync_events INTEGER NOT NULL DEFAULT 0,location TEXT,timezone TEXT,ownerAccount TEXT, organizerCanRespond INTEGER NOT NULL DEFAULT 1); 

Configuración _ID, el nombre y idioma debe trabajar si no es necesario sincronizar el calendario. Sin embargo, no puede probar en el emulador, porque falta la aplicación de calendario y su base de datos. Y los proveedores de dispositivos podrían haber modificado la base de datos teóricamente, pero dado que hay muchas aplicaciones de calendario disponibles, personalmente no creo que hayan modificado el esquema de la base de datos.

13

Me las arreglé para agregar un calendario usando la nueva API de ICS. La respuesta de Stefan ayudó, pero para poder escribir en todas las columnas, debe hacer la operación como un adaptador de sincronización. Puede hacerlo desde una aplicación normal usando CalendarContract.ACCOUNT_TYPE_LOCAL. El siguiente código debería funcionar en ICS. Tal vez algunos valores de columna no son correctos. Consulte la documentación de CalendarContract.Calendars. Desafortunadamente no puedo ayudarte con las versiones anteriores de Android, pero CalendarContract solo se usa para algunos valores de cadena constantes. Quizás estos también funcionen en versiones anteriores.

Uri calUri = CalendarContract.Calendars.CONTENT_URI; 
ContentValues cv = new ContentValues(); 
cv.put(CalendarContract.Calendars.ACCOUNT_NAME, yourAccountName); 
cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL); 
cv.put(CalendarContract.Calendars.NAME, yourInternalName); 
cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, yourDisplayName); 
cv.put(CalendarContract.Calendars.CALENDAR_COLOR, yourColor); 
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); 

calUri = calUri.buildUpon() 
    .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") 
    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, ACCOUNT_NAME) 
    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL) 
    .build(); 
Uri result = this.getContentResolver().insert(calUri, cv); 
+0

+1 me ayuda mucho, muchas gracias. – Andrain

-5

Lo más fácil es crearla en Google Calendar en el ordenador y sincronizarlo

+8

Me hiciste reír :) ... Al menos, espero que haya sido una broma. – Glenn85

Cuestiones relacionadas