Takvim sağlayıcısına genel bakış

Takvim Sağlayıcı, kullanıcının takvim etkinlikleri için bir depodur. Calendar Provider API; takvimler, etkinlikler, katılımcılar ve hatırlatıcılar gibi öğeler üzerinde sorgulama, ekleme, güncelleme ve silme işlemleri yapmanıza olanak tanır.

Calendar Provider API, uygulamalar ve senkronizasyon adaptörleri tarafından kullanılabilir. Kurallar, çağrıları yapan programın türüne göre değişir. Bu dokümanda, öncelikli olarak Calendar Provider API'nin uygulama olarak kullanılması ele alınmaktadır. Senkronizasyon adaptörlerinin nasıl farklı olduğuyla ilgili bir tartışma için Senkronizasyon Adaptörleri bölümüne bakın.

Normalde, takvim verilerini okumak veya yazmak için uygulamanın manifest dosyasında Kullanıcı İzinleri bölümünde açıklanan uygun izinlerin bulunması gerekir. Takvim Sağlayıcı, yaygın işlemlerin daha kolay gerçekleştirilmesi için Takvim Intent'leri bölümünde açıklandığı gibi bir dizi intent sunar. Bu intent'ler, kullanıcıları etkinlik eklemek, görüntülemek ve düzenlemek için Takvim uygulamasına yönlendirir. Kullanıcı, Takvim uygulamasıyla etkileşim kurar ve ardından orijinal uygulamaya geri döner. Bu nedenle, uygulamanızın izin istemesi veya etkinlikleri görüntülemek ya da oluşturmak için bir kullanıcı arayüzü sağlaması gerekmez.

Temel bilgiler

İçerik sağlayıcılar, verileri depolar ve uygulamaların erişimine sunar. Android platformu tarafından sunulan içerik sağlayıcılar (Takvim Sağlayıcı dahil), verileri genellikle ilişkisel veritabanı modeline dayalı bir tablo grubu olarak gösterir. Bu modelde her satır bir kayıt, her sütun ise belirli bir tür ve anlamda veridir. Calendar Provider API aracılığıyla uygulamalar ve senkronizasyon adaptörleri, kullanıcının takvim verilerini barındıran veritabanı tablolarına okuma/yazma erişimi elde edebilir.

Her içerik sağlayıcı, veri kümesini benzersiz şekilde tanımlayan herkese açık bir URI (Uri nesnesi olarak sarmalanmış) sunar. Birden fazla veri kümesini (birden fazla tablo) kontrol eden bir içerik sağlayıcı, her biri için ayrı bir URI sunar. Sağlayıcıların tüm URI'leri "content://" dizesiyle başlar. Bu, verilerin bir içerik sağlayıcı tarafından kontrol edildiğini gösterir. Takvim Sağlayıcı, sınıflarının (tablolarının) her biri için URI'lara yönelik sabitler tanımlar. Bu URI'lar <class>.CONTENT_URI biçimindedir. Örneğin, Events.CONTENT_URI.

Şekil 1'de, Takvim Sağlayıcı veri modelinin grafik gösterimi yer almaktadır. Ana tabloları ve bunları birbirine bağlayan alanları gösterir.

Takvim Sağlayıcı Veri Modeli
Şekil 1. Calendar Provider veri modelini kullanır.

Bir kullanıcının birden fazla takvimi olabilir ve farklı takvimler farklı hesap türleriyle (Google Takvim, Exchange vb.) ilişkilendirilebilir.

CalendarContract, takvim ve etkinlikle ilgili bilgilerin veri modelini tanımlar. Bu veriler, aşağıda listelenen tablolarda depolanır.

Tablo (Sınıf) Açıklama

CalendarContract.Calendars

Bu tablo, takvime özgü bilgileri içerir. Bu tablodaki her satırda, tek bir takvimin adı, rengi ve senkronizasyon bilgileri gibi ayrıntılar yer alır.
CalendarContract.Events Bu tablo, etkinliğe özel bilgileri içerir. Bu tablodaki her satırda tek bir etkinlikle ilgili bilgiler (ör. etkinlik başlığı, konum, başlangıç zamanı, bitiş zamanı) yer alır. Etkinlik bir kez gerçekleşebilir veya birden fazla kez tekrarlanabilir. Katılımcılar, hatırlatıcılar ve genişletilmiş özellikler ayrı tablolarda depolanır. Her birinde, Etkinlikler tablosundaki _ID değerine referans veren bir EVENT_ID bulunur.
CalendarContract.Instances Bu tabloda, bir etkinliğin her bir tekrarının başlangıç ve bitiş zamanı yer alır. Bu tablodaki her satır, tek bir etkinlik gerçekleşmesini temsil eder. Tek seferlik etkinliklerde, örnekler ile etkinlikler arasında 1:1 eşleme vardır. Düzenli etkinlikler için, etkinliğin birden fazla tekrarına karşılık gelen birden fazla satır otomatik olarak oluşturulur.
CalendarContract.Attendees Bu tabloda, etkinliğe katılanların (konukların) bilgileri yer alır. Her satır, bir etkinliğin tek bir davetlisini temsil eder. Davetlinin türünü ve etkinliğe katılım yanıtını belirtir.
CalendarContract.Reminders Bu tablo, uyarı/bildirim verilerini içerir. Her satır, bir etkinlikle ilgili tek bir uyarıyı temsil eder. Bir etkinliğin birden fazla hatırlatıcısı olabilir. Etkinlik başına maksimum hatırlatıcı sayısı, ilgili takvimin sahibi olan senkronizasyon adaptörü tarafından ayarlanan MAX_REMINDERS içinde belirtilir. Hatırlatıcılar, etkinlikten kaç dakika önce gösterileceği belirtilerek tanımlanır ve kullanıcının nasıl uyarılacağını belirleyen bir yönteme sahiptir.

Calendar Provider API, esnek ve güçlü olacak şekilde tasarlanmıştır. Aynı zamanda, iyi bir son kullanıcı deneyimi sunmak ve takvimin ve verilerinin bütünlüğünü korumak da önemlidir. Bu nedenle, API'yi kullanırken dikkat etmeniz gereken bazı noktalar şunlardır:

  • Takvim etkinliklerini ekleme, güncelleme ve görüntüleme Takvim Sağlayıcı'dan etkinlikleri doğrudan eklemek, değiştirmek ve okumak için uygun izinlere sahip olmanız gerekir. Ancak tam teşekküllü bir takvim uygulaması veya senkronizasyon adaptörü oluşturmuyorsanız bu izinleri istemeniz gerekmez. Bunun yerine, okuma ve yazma işlemlerini Android'in Takvim uygulamasına devretmek için bu uygulama tarafından desteklenen intent'leri kullanabilirsiniz. Intent'leri kullandığınızda uygulamanız, seçilen işlemi önceden doldurulmuş bir formda gerçekleştirmek için kullanıcıları Takvim uygulamasına yönlendirir. İşlem tamamlandıktan sonra kullanıcılar uygulamanıza geri döner. Uygulamanızı, yaygın işlemleri Takvim üzerinden gerçekleştirecek şekilde tasarlayarak kullanıcılara tutarlı ve sağlam bir kullanıcı arayüzü sunarsınız. Bu, önerilen yaklaşımdır. Daha fazla bilgi için Takvim intent'leri başlıklı makaleyi inceleyin.
  • Senkronizasyon adaptörleri Senkronizasyon adaptörü, kullanıcının cihazındaki takvim verilerini başka bir sunucu veya veri kaynağıyla senkronize eder. CalendarContract.Calendars ve CalendarContract.Events tablolarında, senkronizasyon adaptörlerinin kullanması için ayrılmış sütunlar vardır. Sağlayıcı ve uygulamalar bunları değiştirmemelidir. Aslında, senkronizasyon adaptörü olarak erişilmedikleri sürece görünür olmazlar. Senkronizasyon adaptörleri hakkında daha fazla bilgi için Senkronizasyon Adaptörleri başlıklı makaleyi inceleyin.

Kullanıcı izinleri

Takvim verilerini okumak için uygulamanın manifest dosyasında READ_CALENDAR izni bulunmalıdır. Takvim verilerini silmek, eklemek veya güncellemek için WRITE_CALENDAR iznini içermelidir:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"...>
    <uses-sdk android:minSdkVersion="14" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    ...
</manifest>

Takvimler tablosu

CalendarContract.Calendars tablosu, her bir takvimle ilgili ayrıntıları içerir. Aşağıdaki Calendars sütunları hem bir uygulama hem de bir senkronizasyon adaptörü tarafından yazılabilir. Desteklenen alanların tam listesi için CalendarContract.Calendars referansına bakın.

Sabit Açıklama
NAME Takvimin adı.
CALENDAR_DISPLAY_NAME Bu takvimin kullanıcıya gösterilen adı.
VISIBLE Takvimin gösterilmek üzere seçilip seçilmediğini belirten bir boole değeri. 0 değeri, bu takvimle ilişkili etkinliklerin gösterilmemesi gerektiğini belirtir. 1 değeri, bu takvimle ilişkili etkinliklerin gösterilmesi gerektiğini belirtir. Bu değer, CalendarContract.Instances tablosundaki satırların oluşturulmasını etkiler.
SYNC_EVENTS Takvimin senkronize edilip edilmeyeceğini ve etkinliklerinin cihazda saklanıp saklanmayacağını belirten bir boole değeri. 0 değeri, bu takvimin senkronize edilmemesi veya etkinliklerinin cihazda depolanmaması gerektiğini belirtir. 1 değeri, bu takvimin etkinliklerinin senkronize edilmesini ve cihazda depolanmasını sağlar.

Tüm işlemler için bir hesap türü ekleyin.

Calendars.ACCOUNT_NAME için sorgu yaparsanız seçime Calendars.ACCOUNT_TYPE değerini de eklemeniz gerekir. Bunun nedeni, belirli bir hesabın yalnızca hem ACCOUNT_NAME hem de ACCOUNT_TYPE değeriyle benzersiz olarak kabul edilmesidir. ACCOUNT_TYPE, hesap AccountManager ile kaydedilirken kullanılan hesap kimlik doğrulayıcısına karşılık gelen dizedir. Ayrıca, cihaz hesabıyla ilişkili olmayan takvimler için ACCOUNT_TYPE_LOCAL adında özel bir hesap türü de vardır. ACCOUNT_TYPE_LOCAL hesapları senkronize edilmez.

Takvim sorgulama

Aşağıda, belirli bir kullanıcıya ait takvimlerin nasıl alınacağını gösteren bir örnek verilmiştir. Basitlik açısından, bu örnekte sorgu işlemi kullanıcı arayüzü iş parçacığında ("ana iş parçacığı") gösterilmektedir. Uygulamada bu işlem, ana iş parçacığı yerine eşzamansız bir iş parçacığında yapılmalıdır. Daha fazla bilgi için Yükleyiciler bölümüne bakın. Verileri yalnızca okumuyor, aynı zamanda değiştiriyorsanız AsyncQueryHandler bölümüne bakın.

Kotlin

// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
private val EVENT_PROJECTION: Array<String> = arrayOf(
        CalendarContract.Calendars._ID,                     // 0
        CalendarContract.Calendars.ACCOUNT_NAME,            // 1
        CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,   // 2
        CalendarContract.Calendars.OWNER_ACCOUNT            // 3
)

// The indices for the projection array above.
private const val PROJECTION_ID_INDEX: Int = 0
private const val PROJECTION_ACCOUNT_NAME_INDEX: Int = 1
private const val PROJECTION_DISPLAY_NAME_INDEX: Int = 2
private const val PROJECTION_OWNER_ACCOUNT_INDEX: Int = 3

Java

// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
public static final String[] EVENT_PROJECTION = new String[] {
    Calendars._ID,                           // 0
    Calendars.ACCOUNT_NAME,                  // 1
    Calendars.CALENDAR_DISPLAY_NAME,         // 2
    Calendars.OWNER_ACCOUNT                  // 3
};

// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3;

Örneğin bir sonraki bölümünde sorgunuzu oluşturursunuz. Seçim, sorgu ölçütlerini belirtir. Bu örnekte sorgu, ACCOUNT_NAME "hera@example.com", ACCOUNT_TYPE "com.example" ve OWNER_ACCOUNT "hera@example.com" değerlerine sahip takvimleri arar. Kullanıcının sahip olduğu takvimlerin yanı sıra görüntülediği tüm takvimleri görmek istiyorsanız OWNER_ACCOUNT parametresini atlayın. Sorgu, veritabanı sorgusu tarafından döndürülen sonuç kümesini incelemek için kullanabileceğiniz bir Cursor nesnesi döndürür. İçerik sağlayıcılarda sorgu kullanma hakkında daha fazla bilgi için İçerik Sağlayıcılar başlıklı makaleyi inceleyin.

Kotlin

// Run query
val uri: Uri = CalendarContract.Calendars.CONTENT_URI
val selection: String = "((${CalendarContract.Calendars.ACCOUNT_NAME} = ?) AND (" +
        "${CalendarContract.Calendars.ACCOUNT_TYPE} = ?) AND (" +
        "${CalendarContract.Calendars.OWNER_ACCOUNT} = ?))"
val selectionArgs: Array<String> = arrayOf("hera@example.com", "com.example", "hera@example.com")
val cur: Cursor = contentResolver.query(uri, EVENT_PROJECTION, selection, selectionArgs, null)

Java

// Run query
Cursor cur = null;
ContentResolver cr = getContentResolver();
Uri uri = Calendars.CONTENT_URI;
String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND ("
                        + Calendars.ACCOUNT_TYPE + " = ?) AND ("
                        + Calendars.OWNER_ACCOUNT + " = ?))";
String[] selectionArgs = new String[] {"hera@example.com", "com.example",
        "hera@example.com"};
// Submit the query and get a Cursor object back.
cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);

Sonraki bölümde, sonuç kümesinde gezinmek için imleç kullanılır. Her alanın değerlerini döndürmek için örneğin başında ayarlanan sabitleri kullanır.

Kotlin

// Use the cursor to step through the returned records
while (cur.moveToNext()) {
    // Get the field values
    val calID: Long = cur.getLong(PROJECTION_ID_INDEX)
    val displayName: String = cur.getString(PROJECTION_DISPLAY_NAME_INDEX)
    val accountName: String = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX)
    val ownerName: String = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX)
    // Do something with the values...
}

Java

// Use the cursor to step through the returned records
while (cur.moveToNext()) {
    long calID = 0;
    String displayName = null;
    String accountName = null;
    String ownerName = null;

    // Get the field values
    calID = cur.getLong(PROJECTION_ID_INDEX);
    displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX);
    accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX);
    ownerName = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX);

    // Do something with the values...

   ...
}

Takvimi değiştirme

Bir takvimi güncellemek için takvimin _ID değerini URI'ye eklenmiş bir kimlik olarak (withAppendedId()) veya ilk seçim öğesi olarak sağlayabilirsiniz. Seçim "_id=?" ile başlamalı ve ilk selectionArg, takvimin _ID olmalıdır. Kimliği URI'da kodlayarak da güncelleme yapabilirsiniz. Bu örnekte, (withAppendedId()) yaklaşımı kullanılarak bir takvimin görünen adı değiştirilmektedir:

Kotlin

const val DEBUG_TAG: String = "MyActivity"
...
val calID: Long = 2
val values = ContentValues().apply {
    // The new display name for the calendar
    put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "Trevor's Calendar")
}
val updateUri: Uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calID)
val rows: Int = contentResolver.update(updateUri, values, null, null)
Log.i(DEBUG_TAG, "Rows updated: $rows")

Java

private static final String DEBUG_TAG = "MyActivity";
...
long calID = 2;
ContentValues values = new ContentValues();
// The new display name for the calendar
values.put(Calendars.CALENDAR_DISPLAY_NAME, "Trevor's Calendar");
Uri updateUri = ContentUris.withAppendedId(Calendars.CONTENT_URI, calID);
int rows = getContentResolver().update(updateUri, values, null, null);
Log.i(DEBUG_TAG, "Rows updated: " + rows);

Takvim ekleme

Takvimler öncelikle bir senkronizasyon adaptörü tarafından yönetilecek şekilde tasarlandığından yeni takvimleri yalnızca senkronizasyon adaptörü olarak eklemeniz gerekir. Uygulamalar, takvimlerde genellikle yalnızca yüzeysel değişiklikler (ör. görünen adı değiştirme) yapabilir. Bir uygulamanın yerel takvim oluşturması gerekiyorsa bunu, ACCOUNT_TYPE_LOCAL ACCOUNT_TYPE kullanarak takvim ekleme işlemini senkronizasyon adaptörü olarak gerçekleştirerek yapabilir. ACCOUNT_TYPE_LOCAL, bir cihaz hesabıyla ilişkili olmayan takvimler için özel bir hesap türüdür. Bu tür takvimler bir sunucuyla senkronize edilmez. Senkronizasyon adaptörleri hakkında bilgi edinmek için Senkronizasyon Adaptörleri başlıklı makaleyi inceleyin.

Etkinlikler tablosu

CalendarContract.Events tablosu, bağımsız etkinliklerle ilgili ayrıntıları içerir. Etkinlik eklemek, güncellemek veya silmek için bir uygulamanın manifest dosyasında WRITE_CALENDAR izni bulunmalıdır.

Aşağıdaki Etkinlikler sütunları hem bir uygulama hem de bir senkronizasyon adaptörü tarafından yazılabilir. Desteklenen alanların tam listesi için CalendarContract.Events referansına bakın.

Sabit Açıklama
CALENDAR_ID Etkinliğin ait olduğu takvimin _ID.
ORGANIZER Etkinliği düzenleyen kişinin (sahibinin) e-posta adresi.
TITLE Etkinliğin adı.
EVENT_LOCATION Etkinliğin gerçekleştiği yer.
DESCRIPTION Etkinliğin açıklaması.
DTSTART Etkinliğin başlangıç zamanı (epoch'tan bu yana geçen UTC milisaniye cinsinden).
DTEND Etkinliğin bitiş zamanı (epoch'tan bu yana geçen UTC milisaniye cinsinden).
EVENT_TIMEZONE Etkinliğin saat dilimi.
EVENT_END_TIMEZONE Etkinliğin bitiş zamanının saat dilimi.
DURATION Etkinliğin RFC5545 biçimindeki süresi. Örneğin, "PT1H" değeri etkinliğin bir saat sürmesi gerektiğini, "P2W" değeri ise 2 haftalık bir süreyi belirtir.
ALL_DAY 1 değeri, bu etkinliğin yerel saat dilimine göre tüm gün sürdüğünü gösterir. 0 değeri, günün herhangi bir saatinde başlayıp bitebilecek normal bir etkinlik olduğunu gösterir.
RRULE Etkinlik biçimi için yinelenme kuralı. Örneğin, "FREQ=WEEKLY;COUNT=10;WKST=SU". Daha fazla örnek için RFC5545 spesifikasyonuna bakın.
RDATE Etkinliğin yinelenme tarihleri. Tekrarlanan etkinliklerin toplu bir grubunu tanımlamak için genellikle RDATE ile RRULE birlikte kullanılır. Daha fazla bilgi için RFC5545 spesifikasyonuna bakın.
AVAILABILITY Bu etkinliğin meşgul zaman olarak mı yoksa üzerine planlama yapılabilecek boş zaman olarak mı sayılacağı.
GUESTS_CAN_MODIFY Davetlilerin etkinliği değiştirip değiştiremeyeceği.
GUESTS_CAN_INVITE_OTHERS Davetlilerin başka davetlileri davet edip edemeyeceği.
GUESTS_CAN_SEE_GUESTS Davetlilerin katılımcı listesini görüp göremeyeceği

Etkinlik ekle

Uygulamanız yeni bir etkinlik eklediğinde Etkinlik eklemek için intent kullanma bölümünde açıklandığı gibi INSERT intent kullanmanızı öneririz. Ancak gerekirse etkinlikleri doğrudan ekleyebilirsiniz. Bu bölümde, bu işlemin nasıl yapılacağı açıklanmaktadır.

Yeni bir etkinlik eklemeyle ilgili kurallar şunlardır:

  • CALENDAR_ID ve DTSTART eklemeniz gerekir.
  • EVENT_TIMEZONE eklemeniz gerekir. Sistemde yüklü saat dilimi kimliklerinin listesini almak için getAvailableIDs() komutunu kullanın. Etkinlik eklemek için intent kullanma bölümünde açıklanan INSERT intent'i aracılığıyla etkinlik ekliyorsanız bu kuralın geçerli olmadığını unutmayın. Bu senaryoda varsayılan bir saat dilimi sağlanır.
  • Tek seferlik etkinlikler için DTEND parametresini eklemeniz gerekir.
  • Düzenli etkinlikler için RRULE veya RDATE değerine ek olarak DURATION değerini de eklemeniz gerekir. Etkinlik eklemek için intent kullanma bölümünde açıklanan INSERT Intent aracılığıyla etkinlik ekliyorsanız bu kuralın geçerli olmadığını unutmayın. Bu senaryoda, RRULE öğesini DTSTART ve DTEND ile birlikte kullanabilirsiniz. Takvim uygulaması bunu otomatik olarak bir süreye dönüştürür.

Aşağıda, etkinlik eklemeyle ilgili bir örnek verilmiştir. Bu işlem, basitlik açısından kullanıcı arayüzü iş parçacığında gerçekleştirilir. Uygulamada, ekleme ve güncelleme işlemleri eşzamansız bir iş parçacığında yapılmalıdır. Böylece işlem, arka plan iş parçacığına taşınır. Daha fazla bilgi için AsyncQueryHandler sayfasına bakın.

Kotlin

val calID: Long = 3
val startMillis: Long = Calendar.getInstance().run {
    set(2012, 9, 14, 7, 30)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2012, 9, 14, 8, 45)
    timeInMillis
}
...

val values = ContentValues().apply {
    put(CalendarContract.Events.DTSTART, startMillis)
    put(CalendarContract.Events.DTEND, endMillis)
    put(CalendarContract.Events.TITLE, "Jazzercise")
    put(CalendarContract.Events.DESCRIPTION, "Group workout")
    put(CalendarContract.Events.CALENDAR_ID, calID)
    put(CalendarContract.Events.EVENT_TIMEZONE, "America/Los_Angeles")
}
val uri: Uri = contentResolver.insert(CalendarContract.Events.CONTENT_URI, values)

// get the event ID that is the last element in the Uri
val eventID: Long = uri.lastPathSegment.toLong()
//
// ... do something with event ID
//
//

Java

long calID = 3;
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
...

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);

// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());
//
// ... do something with event ID
//
//

Not: Bu örnekte, etkinlik oluşturulduktan sonra etkinlik kimliğinin nasıl yakalandığına dikkat edin. Etkinlik kimliği almanın en kolay yolu budur. Diğer takvim işlemlerini gerçekleştirmek (ör. bir etkinliğe katılımcı veya hatırlatıcı eklemek) için genellikle etkinlik kimliğine ihtiyacınız olur.

Güncelleme etkinlikleri

Uygulamanız kullanıcının bir etkinliği düzenlemesine izin vermek istediğinde, Etkinlik düzenlemek için intent kullanma bölümünde açıklandığı gibi bir EDIT Intent kullanmanızı öneririz. Ancak gerekirse etkinlikleri doğrudan düzenleyebilirsiniz. Bir etkinliği güncellemek için etkinliğin _ID değerini URI'ye eklenmiş bir kimlik (withAppendedId()) olarak veya ilk seçim öğesi olarak sağlayabilirsiniz. Seçim "_id=?" ile başlamalı ve ilk selectionArg, etkinliğin _ID olmalıdır. Kimliği olmayan bir seçim kullanarak da güncelleme yapabilirsiniz. Aşağıda bir etkinliğin güncellenmesiyle ilgili bir örnek verilmiştir. withAppendedId() yaklaşımını kullanarak etkinliğin başlığını değiştirir:

Kotlin

val DEBUG_TAG = "MyActivity"
...
val eventID: Long = 188
...
val values = ContentValues().apply {
    // The new title for the event
    put(CalendarContract.Events.TITLE, "Kickboxing")
}
val updateUri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val rows: Int = contentResolver.update(updateUri, values, null, null)
Log.i(DEBUG_TAG, "Rows updated: $rows")

Java

private static final String DEBUG_TAG = "MyActivity";
...
long eventID = 188;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
Uri updateUri = null;
// The new title for the event
values.put(Events.TITLE, "Kickboxing");
updateUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
int rows = cr.update(updateUri, values, null, null);
Log.i(DEBUG_TAG, "Rows updated: " + rows);

Etkinlikleri sil

Bir etkinliği, URI'ye eklenen kimlik olarak _ID ile veya standart seçimi kullanarak silebilirsiniz. Eklenmiş bir kimlik kullanıyorsanız seçim de yapamazsınız. Silme işleminin iki sürümü vardır: uygulama olarak ve senkronizasyon adaptörü olarak. Uygulama silme işlemi, deleted sütununu 1 olarak ayarlar. Bu işaret, senkronizasyon adaptörüne satırın silindiğini ve bu silme işleminin sunucuya yayılması gerektiğini bildirir. Senkronizasyon adaptörü silme işlemi, etkinliği ve ilişkili tüm verilerini veritabanından kaldırır. Aşağıda, uygulamanın _ID üzerinden bir etkinliği silmesine dair bir örnek verilmiştir:

Kotlin

val DEBUG_TAG = "MyActivity"
...
val eventID: Long = 201
...
val deleteUri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val rows: Int = contentResolver.delete(deleteUri, null, null)
Log.i(DEBUG_TAG, "Rows deleted: $rows")

Java

private static final String DEBUG_TAG = "MyActivity";
...
long eventID = 201;
...
ContentResolver cr = getContentResolver();
Uri deleteUri = null;
deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
int rows = cr.delete(deleteUri, null, null);
Log.i(DEBUG_TAG, "Rows deleted: " + rows);

Katılımcılar tablosu

CalendarContract.Attendees tablosunun her satırı, bir etkinliğin tek bir katılımcısını veya davetlisini temsil eder. query() çağrısı, belirtilen EVENT_ID değerine sahip etkinlik için katılımcıların listesini döndürür. Bu EVENT_ID, belirli bir etkinliğin _ID ile eşleşmelidir.

Aşağıdaki tabloda yazılabilir alanlar listelenmiştir. Yeni bir katılımcı eklerken ATTENDEE_NAME hariç tümünü eklemeniz gerekir.

Sabit Açıklama
EVENT_ID Etkinliğin kimliği.
ATTENDEE_NAME Katılımcının adı.
ATTENDEE_EMAIL Katılımcının e-posta adresi.
ATTENDEE_RELATIONSHIP

Katılımcının etkinlikle ilişkisi. Şunlardan biri:

ATTENDEE_TYPE

Katılımcının türü. Şunlardan biri:

ATTENDEE_STATUS

Katılımcının katılım durumu. Şunlardan biri:

Katılımcı ekleme

Aşağıda, bir etkinliğe tek bir katılımcı ekleyen bir örnek verilmiştir. EVENT_ID gerekli olduğunu unutmayın:

Kotlin

val eventID: Long = 202
...
val values = ContentValues().apply {
    put(CalendarContract.Attendees.ATTENDEE_NAME, "Trevor")
    put(CalendarContract.Attendees.ATTENDEE_EMAIL, "trevor@example.com")
    put(
        CalendarContract.Attendees.ATTENDEE_RELATIONSHIP,
        CalendarContract.Attendees.RELATIONSHIP_ATTENDEE
    )
    put(CalendarContract.Attendees.ATTENDEE_TYPE, CalendarContract.Attendees.TYPE_OPTIONAL)
    put(
        CalendarContract.Attendees.ATTENDEE_STATUS,
        CalendarContract.Attendees.ATTENDEE_STATUS_INVITED
    )
    put(CalendarContract.Attendees.EVENT_ID, eventID)
}
val uri: Uri = contentResolver.insert(CalendarContract.Attendees.CONTENT_URI, values)

Java

long eventID = 202;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Attendees.ATTENDEE_NAME, "Trevor");
values.put(Attendees.ATTENDEE_EMAIL, "trevor@example.com");
values.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
values.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL);
values.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_INVITED);
values.put(Attendees.EVENT_ID, eventID);
Uri uri = cr.insert(Attendees.CONTENT_URI, values);

Hatırlatıcılar tablosu

CalendarContract.Reminders tablosunun her satırı, bir etkinlikle ilgili tek bir hatırlatıcıyı temsil eder. query() çağrısı, belirli bir EVENT_ID değerine sahip etkinlik için hatırlatıcıların listesini döndürür.

Aşağıdaki tabloda, hatırlatıcılar için yazılabilir alanlar listelenmiştir. Yeni bir hatırlatıcı eklerken bunların tümü dahil edilmelidir. Senkronizasyon adaptörlerinin, destekledikleri hatırlatıcı türlerini CalendarContract.Calendars tablosunda belirttiğini unutmayın. Ayrıntılar için ALLOWED_REMINDERS sayfasına bakın.

Sabit Açıklama
EVENT_ID Etkinliğin kimliği.
MINUTES Hatırlatıcının etkinlikten kaç dakika önce gönderileceği.
METHOD

Sunucuda ayarlandığı şekliyle alarm yöntemi. Şunlardan biri:

Hatırlatma ekleyin

Bu örnekte, bir etkinliğe hatırlatıcı eklenmektedir. Hatırlatıcı, etkinlikten 15 dakika önce etkinleşir.

Kotlin

val eventID: Long = 221
...
val values = ContentValues().apply {
    put(CalendarContract.Reminders.MINUTES, 15)
    put(CalendarContract.Reminders.EVENT_ID, eventID)
    put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT)
}
val uri: Uri = contentResolver.insert(CalendarContract.Reminders.CONTENT_URI, values)

Java

long eventID = 221;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Reminders.MINUTES, 15);
values.put(Reminders.EVENT_ID, eventID);
values.put(Reminders.METHOD, Reminders.METHOD_ALERT);
Uri uri = cr.insert(Reminders.CONTENT_URI, values);

Örnekler tablosu

CalendarContract.Instances tablosu, bir etkinliğin gerçekleşme zamanının başlangıç ve bitiş saatini içerir. Bu tablodaki her satır, tek bir etkinlik gerçekleşmesini temsil eder. Örnekler tablosu yazılabilir değildir ve yalnızca etkinliklerin gerçekleşme sayısını sorgulama imkanı sunar.

Aşağıdaki tabloda, bir örnek için sorgulayabileceğiniz alanlardan bazıları listelenmiştir. Saat diliminin KEY_TIMEZONE_TYPE ve KEY_TIMEZONE_INSTANCES ile tanımlandığını unutmayın.

Sabit Açıklama
BEGIN Örneğin başlangıç zamanı (UTC milisaniye cinsinden).
END Örneğin bitiş zamanı (UTC milisaniye cinsinden).
END_DAY Takvimin saat dilimine göre örneğin Jülyen bitiş günü.
END_MINUTE Takvim'in saat diliminde gece yarısından itibaren ölçülen örneğin bitiş dakikası.
EVENT_ID Bu örnek için etkinliğin _ID.
START_DAY Örneğin, Takvim'in saat dilimine göre Jülyen başlangıç günü.
START_MINUTE Örneğin gece yarısından itibaren ölçülen başlangıç dakikası (Takvim'in saat dilimine göre).

Örnekler tablosunu sorgulama

Instances tablosunu sorgulamak için URI'de sorgu için bir zaman aralığı belirtmeniz gerekir. Bu örnekte CalendarContract.Instances, CalendarContract.EventsColumns arayüzünü uygulayarak TITLE alanına erişir. Diğer bir deyişle, TITLE, ham CalendarContract.Instances tablosu sorgulanarak değil, bir veritabanı görünümü aracılığıyla döndürülür.

Kotlin

const val DEBUG_TAG: String = "MyActivity"
val INSTANCE_PROJECTION: Array<String> = arrayOf(
        CalendarContract.Instances.EVENT_ID, // 0
        CalendarContract.Instances.BEGIN, // 1
        CalendarContract.Instances.TITLE // 2
)

// The indices for the projection array above.
const val PROJECTION_ID_INDEX: Int = 0
const val PROJECTION_BEGIN_INDEX: Int = 1
const val PROJECTION_TITLE_INDEX: Int = 2

// Specify the date range you want to search for recurring
// event instances
val startMillis: Long = Calendar.getInstance().run {
    set(2011, 9, 23, 8, 0)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2011, 10, 24, 8, 0)
    timeInMillis
}

// The ID of the recurring event whose instances you are searching
// for in the Instances table
val selection: String = "${CalendarContract.Instances.EVENT_ID} = ?"
val selectionArgs: Array<String> = arrayOf("207")

// Construct the query with the desired date range.
val builder: Uri.Builder = CalendarContract.Instances.CONTENT_URI.buildUpon()
ContentUris.appendId(builder, startMillis)
ContentUris.appendId(builder, endMillis)

// Submit the query
val cur: Cursor = contentResolver.query(
        builder.build(),
        INSTANCE_PROJECTION,
        selection,
        selectionArgs, null
)
while (cur.moveToNext()) {
    // Get the field values
    val eventID: Long = cur.getLong(PROJECTION_ID_INDEX)
    val beginVal: Long = cur.getLong(PROJECTION_BEGIN_INDEX)
    val title: String = cur.getString(PROJECTION_TITLE_INDEX)

    // Do something with the values.
    Log.i(DEBUG_TAG, "Event: $title")
    val calendar = Calendar.getInstance().apply {
        timeInMillis = beginVal
    }
    val formatter = SimpleDateFormat("MM/dd/yyyy")
    Log.i(DEBUG_TAG, "Date: ${formatter.format(calendar.time)}")
}

Java

private static final String DEBUG_TAG = "MyActivity";
public static final String[] INSTANCE_PROJECTION = new String[] {
    Instances.EVENT_ID,      // 0
    Instances.BEGIN,         // 1
    Instances.TITLE          // 2
  };

// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_BEGIN_INDEX = 1;
private static final int PROJECTION_TITLE_INDEX = 2;
...

// Specify the date range you want to search for recurring
// event instances
Calendar beginTime = Calendar.getInstance();
beginTime.set(2011, 9, 23, 8, 0);
long startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2011, 10, 24, 8, 0);
long endMillis = endTime.getTimeInMillis();

Cursor cur = null;
ContentResolver cr = getContentResolver();

// The ID of the recurring event whose instances you are searching
// for in the Instances table
String selection = Instances.EVENT_ID + " = ?";
String[] selectionArgs = new String[] {"207"};

// Construct the query with the desired date range.
Uri.Builder builder = Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, startMillis);
ContentUris.appendId(builder, endMillis);

// Submit the query
cur =  cr.query(builder.build(),
    INSTANCE_PROJECTION,
    selection,
    selectionArgs,
    null);

while (cur.moveToNext()) {
    String title = null;
    long eventID = 0;
    long beginVal = 0;

    // Get the field values
    eventID = cur.getLong(PROJECTION_ID_INDEX);
    beginVal = cur.getLong(PROJECTION_BEGIN_INDEX);
    title = cur.getString(PROJECTION_TITLE_INDEX);

    // Do something with the values.
    Log.i(DEBUG_TAG, "Event:  " + title);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(beginVal);
    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
    Log.i(DEBUG_TAG, "Date: " + formatter.format(calendar.getTime()));
    }
 }

Takvim amaçları

Uygulamanızın takvim verilerini okumak ve yazmak için izinlere ihtiyacı yoktur. Bunun yerine, okuma ve yazma işlemlerini Android'in Takvim uygulamasına devretmek için bu uygulamanın desteklediği intent'leri kullanabilir. Aşağıdaki tabloda, Takvim Sağlayıcı tarafından desteklenen intent'ler listelenmiştir:

İşlem URI Açıklama Ekstralar

VIEW

content://com.android.calendar/time/<ms_since_epoch>

URI'ya CalendarContract.CONTENT_URI ile de başvurabilirsiniz. Bu intent'in kullanımına dair bir örnek için Takvim verilerini görüntülemek için intent'leri kullanma başlıklı makaleyi inceleyin.
Takvimi <ms_since_epoch> tarafından belirtilen zamanda açar. Yok.

VIEW

content://com.android.calendar/events/<event_id>

URI'ya Events.CONTENT_URI ile de başvurabilirsiniz. Bu intent'in kullanımına dair bir örnek için Takvim verilerini görüntülemek için intent'leri kullanma başlıklı makaleyi inceleyin.
<event_id> tarafından belirtilen etkinliği görüntüleyin. CalendarContract.EXTRA_EVENT_BEGIN_TIME


CalendarContract.EXTRA_EVENT_END_TIME
EDIT

content://com.android.calendar/events/<event_id>

URI'ya Events.CONTENT_URI ile de başvurabilirsiniz. Bu intent'in kullanımına dair bir örnek için Bir etkinliği düzenlemek için intent kullanma başlıklı makaleyi inceleyin.
<event_id> tarafından belirtilen etkinliği düzenleyin. CalendarContract.EXTRA_EVENT_BEGIN_TIME


CalendarContract.EXTRA_EVENT_END_TIME
EDIT

INSERT

content://com.android.calendar/events

URI'ya Events.CONTENT_URI ile de başvurabilirsiniz. Bu intent'in kullanımına örnek olarak Etkinlik eklemek için intent kullanma başlıklı makaleyi inceleyin.
Bir etkinlik oluşturun. Aşağıdaki tabloda listelenen ekstralardan herhangi biri.

Aşağıdaki tabloda, Takvim Sağlayıcı tarafından desteklenen intent ekstraları listelenmiştir:

Intent Extra Açıklama
Events.TITLE Etkinliğin adı.
CalendarContract.EXTRA_EVENT_BEGIN_TIME Etkinliğin başlangıç zamanı (epoch'tan itibaren milisaniye cinsinden).
CalendarContract.EXTRA_EVENT_END_TIME Etkinliğin bitiş zamanı (epoch'tan itibaren milisaniye cinsinden).
CalendarContract.EXTRA_EVENT_ALL_DAY Bir etkinliğin tüm gün sürdüğünü belirten boole değeri. Değer true veya false olabilir.
Events.EVENT_LOCATION Etkinliğin konumu.
Events.DESCRIPTION Etkinlik açıklaması.
Intent.EXTRA_EMAIL Davet edilecek kişilerin e-posta adresleri (virgülle ayrılmış liste olarak).
Events.RRULE Etkinliğin yinelenme kuralı.
Events.ACCESS_LEVEL Etkinliğin gizli mi yoksa herkese açık mı olduğu
Events.AVAILABILITY Bu etkinliğin meşgul zaman olarak mı yoksa üzerine planlama yapılabilen boş zaman olarak mı sayılacağı.

Aşağıdaki bölümlerde bu intent'lerin nasıl kullanılacağı açıklanmaktadır.

Etkinlik eklemek için intent kullanma

INSERT Intent'i kullanmak, uygulamanızın etkinlik ekleme görevini Takvim'e devretmesine olanak tanır. Bu yaklaşımda, uygulamanızın manifest dosyasında WRITE_CALENDAR izninin bulunması bile gerekmez.

Kullanıcılar bu yaklaşımı kullanan bir uygulama çalıştırdığında, uygulama etkinliği ekleme işlemini tamamlamaları için kullanıcıları Takvim'e yönlendirir. INSERT Intent, Takvim'deki etkinliğin ayrıntılarını içeren bir formu önceden doldurmak için ek alanlar kullanır. Kullanıcılar daha sonra etkinliği iptal edebilir, formu gerektiği gibi düzenleyebilir veya etkinliği takvimlerine kaydedebilir.

Aşağıda, 19 Ocak 2012 tarihinde 07:30 ile 08:30 arasında gerçekleşecek bir etkinliği planlayan kod snippet'i verilmiştir. Bu kod snippet'iyle ilgili olarak aşağıdakilere dikkat edin:

Kotlin

val startMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 7, 30)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 8, 30)
    timeInMillis
}
val intent = Intent(Intent.ACTION_INSERT)
        .setData(CalendarContract.Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMillis)
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endMillis)
        .putExtra(CalendarContract.Events.TITLE, "Yoga")
        .putExtra(CalendarContract.Events.DESCRIPTION, "Group class")
        .putExtra(CalendarContract.Events.EVENT_LOCATION, "The gym")
        .putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com")
startActivity(intent)

Java

Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 0, 19, 8, 30);
Intent intent = new Intent(Intent.ACTION_INSERT)
        .setData(Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
        .putExtra(Events.TITLE, "Yoga")
        .putExtra(Events.DESCRIPTION, "Group class")
        .putExtra(Events.EVENT_LOCATION, "The gym")
        .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com");
startActivity(intent);

Bir etkinliği düzenlemek için intent kullanma

Etkinlikleri güncelleme bölümünde açıklandığı gibi bir etkinliği doğrudan güncelleyebilirsiniz. Ancak EDIT Intent'i kullanmak, izni olmayan bir uygulamanın etkinlik düzenleme işlemini Takvim uygulamasına devretmesine olanak tanır. Kullanıcılar Takvim'de etkinliklerini düzenlemeyi tamamladığında orijinal uygulamaya geri döner.

Aşağıda, belirtilen bir etkinlik için yeni bir başlık ayarlayan ve kullanıcıların Takvim'de etkinliği düzenlemesine olanak tanıyan bir intent örneği verilmiştir.

Kotlin

val eventID: Long = 208
val uri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val intent = Intent(Intent.ACTION_EDIT)
        .setData(uri)
        .putExtra(CalendarContract.Events.TITLE, "My New Title")
startActivity(intent)

Java

long eventID = 208;
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
Intent intent = new Intent(Intent.ACTION_EDIT)
    .setData(uri)
    .putExtra(Events.TITLE, "My New Title");
startActivity(intent);

Takvim verilerini görüntülemek için intent'leri kullanma

Takvim Sağlayıcı, VIEW Intent'i kullanmak için iki farklı yol sunar:

  • Takvim'i belirli bir tarihte açmak için kullanılır.
  • Bir etkinliği görüntülemek için

Aşağıda, Takvim'in belirli bir tarihte nasıl açılacağını gösteren bir örnek verilmiştir:

Kotlin

val startMillis: Long
...
val builder: Uri.Builder = CalendarContract.CONTENT_URI.buildUpon()
        .appendPath("time")
ContentUris.appendId(builder, startMillis)
val intent = Intent(Intent.ACTION_VIEW)
        .setData(builder.build())
startActivity(intent)

Java

// A date-time specified in milliseconds since the epoch.
long startMillis;
...
Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
ContentUris.appendId(builder, startMillis);
Intent intent = new Intent(Intent.ACTION_VIEW)
    .setData(builder.build());
startActivity(intent);

Aşağıdaki örnekte, bir etkinliğin görüntülemek için nasıl açılacağı gösterilmektedir:

Kotlin

val eventID: Long = 208
...
val uri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val intent = Intent(Intent.ACTION_VIEW).setData(uri)
startActivity(intent)

Java

long eventID = 208;
...
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
Intent intent = new Intent(Intent.ACTION_VIEW)
   .setData(uri);
startActivity(intent);

Senkronizasyon adaptörleri

Bir uygulamanın ve senkronizasyon adaptörünün Takvim Sağlayıcı'ya erişme şekli arasında yalnızca küçük farklılıklar vardır:

  • Senkronizasyon adaptörünün, CALLER_IS_SYNCADAPTER değerini true olarak ayarlayarak senkronizasyon adaptörü olduğunu belirtmesi gerekir.
  • Senkronizasyon adaptörünün, URI'de sorgu parametresi olarak ACCOUNT_NAME ve ACCOUNT_TYPE sağlaması gerekir.
  • Senkronizasyon adaptörünün yazma erişimi, bir uygulama veya widget'tan daha fazla sütunu kapsar. Örneğin, bir uygulama takvimin yalnızca birkaç özelliğini değiştirebilir. Bu özellikler arasında takvimin adı, görünen adı, görünürlük ayarı ve takvimin senkronize edilip edilmediği yer alır. Buna karşılık, bir senkronizasyon adaptörü yalnızca bu sütunlara değil, takvim rengi, saat dilimi, erişim düzeyi ve konum gibi diğer birçok sütuna da erişebilir. Ancak senkronizasyon adaptörü, belirttiği ACCOUNT_NAME ve ACCOUNT_TYPE ile sınırlıdır.

Senkronizasyon adaptörüyle kullanılacak bir URI döndürmek için kullanabileceğiniz yardımcı yöntem aşağıda verilmiştir:

Kotlin

fun asSyncAdapter(uri: Uri, account: String, accountType: String): Uri {
    return uri.buildUpon()
            .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, account)
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, accountType).build()
}

Java

static Uri asSyncAdapter(Uri uri, String account, String accountType) {
    return uri.buildUpon()
        .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
        .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
        .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
 }