Bu derste, yeni bir kişi eklemek veya bir kişinin verilerini değiştirmek için Intent
'ün nasıl kullanılacağı gösterilmektedir. Intent
, doğrudan Kişiler Sağlayıcısına erişmek yerine, uygun Activity
'ı çalıştıran Kişiler uygulamasını başlatır. Bu derste açıklanan değiştirme işlemlerinde, genişletilmiş verileri Intent
içinde gönderirseniz söz konusu veriler, başlatılan Activity
öğesinin kullanıcı arayüzüne girilir.
Tek bir kişi eklemek veya güncellemek için Intent
kullanmak, aşağıdaki nedenlerden dolayı Kişi Sağlayıcı'yı değiştirmek için tercih edilen yöntemdir:
- Kendi kullanıcı arayüzünüzü ve kodunuzu geliştirirken daha az zaman ve çaba harcamanızı sağlar.
- Kişi Sağlayıcı kurallarına uymayan değişikliklerden kaynaklanan hataların ortaya çıkmasını önler.
- Bu sayede, istemeniz gereken izinlerin sayısını azaltabilirsiniz. Uygulamanızın, kişiler uygulamasına yetki verdiği için kişiler sağlayıcısına yazma izni almasına gerek yoktur.
Niyet kullanarak yeni bir kişi ekleme
Uygulamanız yeni veriler aldığında genellikle kullanıcının yeni bir kişi eklemesine izin vermek istersiniz. Örneğin, bir restoran inceleme uygulaması, kullanıcıların restoranı inceleyen kişiler olarak eklemelerine olanak tanıyabilir. Bunu bir intent kullanarak yapmak için, elinizdeki tüm verileri kullanarak intent'i oluşturun ve ardından intent'i Kişiler uygulamasına gönderin.
Kişiler uygulamasını kullanarak bir kişi eklediğinizde, Kişi Sağlayıcı'nın ContactsContract.RawContacts
tablosuna yeni bir ham kişi eklenir. Gerekirse kişiler uygulaması, ham kişiyi oluştururken kullanıcılardan hesap türünü ve kullanılacak hesabı ister. Kişiler uygulaması, ham kişi zaten mevcutsa kullanıcıları bilgilendirir. Kullanıcılar bu durumda eklemeyi iptal edebilir. Bu durumda herhangi bir kişi oluşturulmaz. Ham kişiler hakkında daha fazla bilgi edinmek için Kişi Sağlayıcı API kılavuzunu inceleyin.
Amaç oluştur
Başlamak için Intents.Insert.ACTION
işlemini içeren yeni bir Intent
nesnesi oluşturun.
MIME türünü RawContacts.CONTENT_TYPE
olarak ayarlayın. Örnek:
Kotlin
... // Creates a new Intent to insert a contact val intent = Intent(ContactsContract.Intents.Insert.ACTION).apply { // Sets the MIME type to match the Contacts Provider type = ContactsContract.RawContacts.CONTENT_TYPE }
Java
... // Creates a new Intent to insert a contact Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION); // Sets the MIME type to match the Contacts Provider intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
Kişiyle ilgili telefon numarası veya e-posta adresi gibi ayrıntılar varsa bunları genişletilmiş veri olarak amaca ekleyebilirsiniz. Anahtar değeri için Intents.Insert
içindeki uygun sabit değeri kullanın. Kişiler uygulaması, verileri ekleme ekranında gösterir. Böylece kullanıcılar daha fazla düzenleme ve ekleme yapabilir.
Kotlin
private var emailAddress: EditText? = null private var phoneNumber: EditText? = null ... /* Assumes EditText fields in your UI contain an email address * and a phone number. * */ emailAddress = findViewById(R.id.email) phoneNumber = findViewById(R.id.phone) ... /* * Inserts new data into the Intent. This data is passed to the * contacts app's Insert screen */ intent.apply { // Inserts an email address putExtra(ContactsContract.Intents.Insert.EMAIL, emailAddress?.text) /* * In this example, sets the email type to be a work email. * You can set other email types as necessary. */ putExtra( ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK ) // Inserts a phone number putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber?.text) /* * In this example, sets the phone type to be a work phone. * You can set other phone types as necessary. */ putExtra( ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK ) }
Java
private EditText emailAddress = null; private EditText phoneNumber = null; ... /* Assumes EditText fields in your UI contain an email address * and a phone number. * */ emailAddress = (EditText) findViewById(R.id.email); phoneNumber = (EditText) findViewById(R.id.phone); ... /* * Inserts new data into the Intent. This data is passed to the * contacts app's Insert screen */ // Inserts an email address intent.putExtra(ContactsContract.Intents.Insert.EMAIL, emailAddress.getText()) /* * In this example, sets the email type to be a work email. * You can set other email types as necessary. */ .putExtra(ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK) // Inserts a phone number .putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber.getText()) /* * In this example, sets the phone type to be a work phone. * You can set other phone types as necessary. */ .putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
Intent
dosyasını oluşturduktan sonra startActivity()
işlevini çağırarak gönderin.
Kotlin
/* Sends the Intent */ startActivity(intent)
Java
/* Sends the Intent */ startActivity(intent);
Bu görüşme, kişiler uygulamasında kullanıcıların yeni kişi girmesine olanak tanıyan bir ekran açar. Kişinin hesap türü ve hesap adı ekranın üst kısmında listelenir. Kullanıcılar verileri girip Bitti'yi tıkladıktan sonra Kişiler uygulamasının kişi listesi görünür. Kullanıcılar Geri'yi tıklayarak uygulamanıza geri döner.
Niyet kullanarak mevcut bir kişiyi düzenleme
Kullanıcı, ilgilendiğiniz bir kişiyi zaten seçmişse Intent
kullanarak mevcut bir kişiyi düzenlemek yararlı olur. Örneğin, posta adresi olan ancak posta kodu olmayan kişileri bulan bir uygulama, kullanıcılara kodu arayıp kişiye ekleme seçeneği sunabilir.
Mevcut bir kişiyi niyet kullanarak düzenlemek için kişi eklemeye benzer bir prosedür kullanın. Intent kullanarak yeni kişi ekleme bölümünde açıklandığı gibi bir intent oluşturun ancak intent'e kişinin Contacts.CONTENT_LOOKUP_URI
ve MIME türünü Contacts.CONTENT_ITEM_TYPE
ekleyin. Kişiyi, sahip olduğunuz ayrıntılarla düzenlemek istiyorsanız bu ayrıntıları intent'in genişletilmiş verilerine ekleyebilirsiniz. Bazı ad sütunlarının intent kullanılarak düzenlenemediğini unutmayın. Bu sütunlar, ContactsContract.Contacts
sınıfına ait API referansının özet bölümündeki "Güncelleme" başlığı altında listelenir.
Son olarak, niyeti gönderin. Bunun karşılığında kişiler uygulamasında bir düzenleme ekranı görüntülenir. Kullanıcı düzenlemeyi tamamlayıp düzenlemeleri kaydettiğinde kişiler uygulaması bir kişi listesi gösterir. Kullanıcı Geri'yi tıkladığında uygulamanız gösterilir.
Amaç oluşturma
Bir kişiyi düzenlemek için ACTION_EDIT
işlemiyle intent oluşturmak üzere Intent(action)
işlevini çağırın. Intent için veri değerini kişinin Contacts.CONTENT_LOOKUP_URI
değerine, MIME türünü ise Contacts.CONTENT_ITEM_TYPE
MIME türüne ayarlamak üzere setDataAndType()
'ü çağırın. setType()
çağrısı, Intent
için geçerli veri değerinin üzerine yazdığı için verileri ve MIME türünü aynı anda ayarlamanız gerekir.
Bir kişinin Contacts.CONTENT_LOOKUP_URI
değerini almak için Contacts.getLookupUri(id, lookupkey)
işlevini, kişinin Contacts._ID
ve Contacts.LOOKUP_KEY
değerlerini bağımsız değişken olarak belirterek çağırın.
Not: Kişinin LOOKUP_KEY
değeri, bir kişiyi almak için kullanmanız gereken tanımlayıcıdır. Sağlayıcı, dahili işlemleri yönetmek için kişinin satır kimliğini değiştirse bile bu kimlik sabit kalır.
Aşağıdaki snippet'te, intent'in nasıl oluşturulacağı gösterilmektedir:
Kotlin
// The Cursor that contains the Contact row var mCursor: Cursor? = null // The index of the lookup key column in the cursor var lookupKeyIndex: Int = 0 // The index of the contact's _ID value var idIndex: Int = 0 // The lookup key from the Cursor var currentLookupKey: String? = null // The _ID value from the Cursor var currentId: Long = 0 // A content URI pointing to the contact var selectedContactUri: Uri? = null ... /* * Once the user has selected a contact to edit, * this gets the contact's lookup key and _ID values from the * cursor and creates the necessary URI. */ mCursor?.apply { // Gets the lookup key column index lookupKeyIndex = getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY) // Gets the lookup key value currentLookupKey = getString(lookupKeyIndex) // Gets the _ID column index idIndex = getColumnIndex(ContactsContract.Contacts._ID) currentId = getLong(idIndex) selectedContactUri = ContactsContract.Contacts.getLookupUri(currentId, mCurrentLookupKey) } // Creates a new Intent to edit a contact val editIntent = Intent(Intent.ACTION_EDIT).apply { /* * Sets the contact URI to edit, and the data type that the * Intent must match */ setDataAndType(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE) }
Java
// The Cursor that contains the Contact row public Cursor mCursor; // The index of the lookup key column in the cursor public int lookupKeyIndex; // The index of the contact's _ID value public int idIndex; // The lookup key from the Cursor public String currentLookupKey; // The _ID value from the Cursor public long currentId; // A content URI pointing to the contact Uri selectedContactUri; ... /* * Once the user has selected a contact to edit, * this gets the contact's lookup key and _ID values from the * cursor and creates the necessary URI. */ // Gets the lookup key column index lookupKeyIndex = mCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY); // Gets the lookup key value currentLookupKey = mCursor.getString(lookupKeyIndex); // Gets the _ID column index idIndex = mCursor.getColumnIndex(ContactsContract.Contacts._ID); currentId = mCursor.getLong(idIndex); selectedContactUri = Contacts.getLookupUri(currentId, mCurrentLookupKey); ... // Creates a new Intent to edit a contact Intent editIntent = new Intent(Intent.ACTION_EDIT); /* * Sets the contact URI to edit, and the data type that the * Intent must match */ editIntent.setDataAndType(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE);
Gezinme işaretini ekleme
Android 4.0 (API sürümü 14) ve sonraki sürümlerde, kişiler uygulamasındaki bir sorun yanlış gezinmeye neden olur. Uygulamanız kişiler uygulamasına bir düzenleme isteği gönderdiğinde ve kullanıcılar bir kişiyi düzenleyip kaydettiğinde Geri'yi tıkladıklarında kişiler listesi ekranını görürler. Kullanıcıların uygulamanıza geri dönmek için En son'u tıklayıp uygulamanızı seçmesi gerekir.
Android 4.0.3 (API sürümü 15) ve sonraki sürümlerde bu sorunu gidermek için finishActivityOnSaveCompleted
genişletilmiş veri anahtarını true
değerine sahip olarak intent'e ekleyin.
Android 4.0'tan önceki Android sürümleri bu anahtarı kabul eder ancak anahtar hiçbir etkide bulunmaz. Genişletilmiş verileri ayarlamak için aşağıdakileri yapın:
Kotlin
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true)
Java
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true);
Diğer genişletilmiş verileri ekleme
Intent
'ye ek genişletilmiş veriler eklemek için dilediğiniz zaman putExtra()
'yi arayın.
Intents.Insert
bölümünde belirtilen anahtar değerlerini kullanarak yaygın iletişim alanları için genişletilmiş veriler ekleyebilirsiniz. ContactsContract.Contacts
tablosundaki bazı sütunların değiştirilemeyeceğini unutmayın.
Bu sütunlar, ContactsContract.Contacts
sınıfı için API referansının özet bölümünde, "Güncelle" başlığı altında listelenir.
Niyeti gönderme
Son olarak, oluşturduğunuz intent'i gönderin. Örnek:
Kotlin
// Sends the Intent startActivity(editIntent)
Java
// Sends the Intent startActivity(editIntent);
Kullanıcıların bir intent kullanarak ekleme veya düzenleme yapmayı seçmesine izin verme
ACTION_INSERT_OR_EDIT
işlemini içeren bir Intent
göndererek kullanıcıların yeni bir kişi eklemeyi veya mevcut bir kişiyi düzenlemeyi seçmesine izin verebilirsiniz. Örneğin, bir e-posta istemci uygulaması, kullanıcıların, gelen e-posta adresini yeni bir kişiye veya mevcut bir kişinin ek adresi olarak eklemesine olanak tanıyabilir. Bu intent için MIME türünü Contacts.CONTENT_ITEM_TYPE
olarak ayarlayın ancak veri URI'sini ayarlamayın.
Bu intent'i gönderdiğinizde kişiler uygulaması, kişilerin listesini gösterir.
Kullanıcılar yeni bir kişi ekleyebilir veya mevcut bir kişiyi seçip düzenleyebilir.
Intent'e eklediğiniz tüm genişletilmiş veri alanları, görünen ekranı doldurur. Intents.Insert
bölümünde belirtilen anahtar değerlerinden herhangi birini kullanabilirsiniz. Aşağıdaki kod snippet'inde, intent'in nasıl oluşturulacağı ve gönderileceği gösterilmektedir:
Kotlin
// Creates a new Intent to insert or edit a contact val intentInsertEdit = Intent(Intent.ACTION_INSERT_OR_EDIT).apply { // Sets the MIME type type = ContactsContract.Contacts.CONTENT_ITEM_TYPE } // Add code here to insert extended data, if desired // Sends the Intent with an request ID startActivity(intentInsertEdit)
Java
// Creates a new Intent to insert or edit a contact Intent intentInsertEdit = new Intent(Intent.ACTION_INSERT_OR_EDIT); // Sets the MIME type intentInsertEdit.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); // Add code here to insert extended data, if desired ... // Sends the Intent with an request ID startActivity(intentInsertEdit);