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.
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