Как я могу добавить новый календарь телефона на Android? - PullRequest
10 голосов
/ 16 января 2012

Приложение календаря в Android может объединять несколько отдельных календарей: календарь локального телефона, календари Google и т. Д.

Как добавить новый такой календарь в телефон Android?Я хочу динамически генерировать события в этом календаре, не обращаясь к каким-либо онлайн-ресурсам, таким как Google.

Редактировать: Я хотел бы поддерживать телефоны с Android 1.5 и 2.3.4.Возможно, когда-нибудь я получу обновление до 4.0 для более нового телефона, но кто знает, когда это будет ...

Ответы [ 4 ]

14 голосов
/ 12 марта 2012

Мне только что удалось добавить Календарь, используя новый API от ICS.Ответ Стефана помог, но чтобы записать все столбцы, вы должны выполнить операцию как адаптер синхронизации.Вы можете сделать это из обычного приложения, используя CalendarContract.ACCOUNT_TYPE_LOCAL.Следующий код должен работать на ICS.Возможно, некоторые значения столбца не верны.Ознакомьтесь с документацией CalendarContract.Calendars.К сожалению, я не могу помочь вам для более старых версий Android, но CalendarContract используется только для некоторых постоянных строковых значений.Может быть, они также работают на более старых версиях.

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);
4 голосов
/ 16 января 2012

Я написал следующее действие (плюс некоторые ресурсы и т. Д.) Для вставки календаря (не синхронизированного) в эмулятор API уровня 15 (поскольку приложение календаря не имеет возможности добавлять календарь в отличие от приложения на моем телефоне).(API 8) или я его не нашел ...).Макет должен содержать текстовые поля для имени календаря и отображаемого имени, кнопку добавления и текстовое представление статуса, чтобы оставить отзыв после вставки.Убедитесь, что в манифесте установлены разрешения:

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

Вот код:

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

}

Для API 13 и до того, как вы не сможете использовать содержимоепоставщик, вы должны получить доступ к базе данных напрямую.Чтобы добавить календарь, необходимо добавить строку в таблицу «Календари», которая определяется в соответствии со следующим оператором создания

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

Настройка _id, name и displayName должна работать, если вам не нужно синхронизироватькалендарь.Однако вы не можете проверить на эмуляторе, потому что отсутствует приложение календаря и его база данных.И поставщики устройств могли бы изменить базу данных теоретически, но, поскольку доступно много приложений для календаря, лично я не думаю, что они изменили схему базы данных.

3 голосов
/ 23 января 2012

Я нашел эту ссылку , в которой обсуждается доступ к поставщику содержимого календаря на телефонах до 4.0.

По сути, вам просто нужно знать строки URI для поставщика:

  • content://calendar для Android <2.2 </li>
  • content://com.android.calendar для Android 2.2 +.
0 голосов
/ 30 мая 2013

Самое простое - создать его в календаре Google на компьютере и синхронизировать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...