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.
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 |
|---|---|
| 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.CalendarsveCalendarContract.Eventstabloları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_IDveDTSTARTeklemeniz gerekir.EVENT_TIMEZONEeklemeniz gerekir. Sistemde yüklü saat dilimi kimliklerinin listesini almak içingetAvailableIDs()komutunu kullanın. Etkinlik eklemek için intent kullanma bölümünde açıklananINSERTintent'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
DTENDparametresini eklemeniz gerekir. - Düzenli etkinlikler için
RRULEveyaRDATEdeğerine ek olarakDURATIONdeğerini de eklemeniz gerekir. Etkinlik eklemek için intent kullanma bölümünde açıklananINSERTIntent aracılığıyla etkinlik ekliyorsanız bu kuralın geçerli olmadığını unutmayın. Bu senaryoda,RRULEöğesiniDTSTARTveDTENDile 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 |
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. |
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_TIMECalendarContract.EXTRA_EVENT_END_TIME |
|
EDIT |
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_TIMECalendarContract.EXTRA_EVENT_END_TIME |
EDIT INSERT |
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:
- URI olarak
Events.CONTENT_URIbelirtir. - Formu etkinliğin zamanıyla önceden doldurmak için
CalendarContract.EXTRA_EVENT_BEGIN_TIMEveCalendarContract.EXTRA_EVENT_END_TIMEek alanlarını kullanır. Bu zamanların değerleri, sıfır zamanından itibaren UTC milisaniye cinsinden olmalıdır. - Davetlilerin e-posta adresleriyle belirtilen, virgülle ayrılmış bir listesini sağlamak için
Intent.EXTRA_EMAILekstra alanını kullanır.
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_SYNCADAPTERdeğerinitrueolarak ayarlayarak senkronizasyon adaptörü olduğunu belirtmesi gerekir. - Senkronizasyon adaptörünün, URI'de sorgu parametresi olarak
ACCOUNT_NAMEveACCOUNT_TYPEsağ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_NAMEveACCOUNT_TYPEile 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(); }