Bu derste, yeni bir kişi eklemek veya bir kişinin verilerini değiştirmek için Intent
etiketinin nasıl kullanılacağı gösterilmektedir. Intent
, doğrudan Kişi Sağlayıcı'ya erişmek yerine uygun Activity
uygulamasını çalıştıran kişiler uygulamasını başlatır. Bu derste açıklanan değişiklik işlemleri için Intent
aracında genişletilmiş veri gönderirseniz bu veriler, başlatılan Activity
kullanıcı arayüzüne girilir.
Aşağıdaki nedenlerden dolayı, Kişi Sağlayıcısı'nı değiştirmek için tek bir kişi eklemek veya güncellemek üzere Intent
kullanılması tercih edilir:
- Kendi kullanıcı arayüzünüzü ve kodunuzu geliştirmek için harcayacağınız zamandan ve çabadan tasarruf etmenizi sağlar.
- Kişi Sağlayıcı'nın kurallarına uymayan değişikliklerden kaynaklanan hatalar oluşmasını önler.
- Bu, istemeniz gereken izin sayısını azaltır. Uygulamanızın Kişi Sağlayıcı'ya yazmak için izne ihtiyacı yoktur çünkü zaten bu izne sahip olan kişiler uygulamasında yapılan değişiklikler için yetki verir.
Amaç kullanarak yeni kişi ekleme
Genellikle, uygulamanız yeni veri aldığında kullanıcının yeni bir kişi eklemesine izin vermek istersiniz. Örneğin, bir restoran inceleme uygulaması, kullanıcıların restoranı incelerken kişi olarak eklemelerine izin verebilir. Niyet kullanarak bunu yapmak için mümkün olduğunca çok veri kullanarak amacı oluşturun ve ardından amacı kişiler uygulamasına gönderin.
Kişiler uygulamasını kullanarak kişi eklendiğinde Kişi Sağlayıcı'nın ContactsContract.RawContacts
tablosuna yeni bir ham kişi eklenir. Kişiler uygulaması gerekirse ham kişiyi oluştururken kullanacakları hesap türü ve hesabı ister. Kişiler uygulaması, ham kişinin zaten mevcut olup olmadığını kullanıcılara bildirir. Böylece kullanıcılar, eklemeyi iptal edebilir. Bu durumda herhangi bir kişi oluşturulmaz. Ham kişiler hakkında daha fazla bilgi edinmek için Contacts Provider API rehberine bakın.
Amaç oluşturun
Başlamak için Intents.Insert.ACTION
işlemiyle yeni bir Intent
nesnesi oluşturun.
MIME türünü RawContacts.CONTENT_TYPE
olarak ayarlayın. Örneğin:
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 zaten bilginiz (ör. telefon numarası veya e-posta adresi) varsa bunları genişletilmiş veri olarak amaca ekleyebilirsiniz. Anahtar değeri için Intents.Insert
değerinden uygun sabit değeri kullanın. Kişiler uygulaması, verileri ekleme ekranında görüntüleyerek kullanıcıların daha fazla düzenleme ve ekleme yapmasına olanak tanır.
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
oluşturduktan sonra startActivity()
yöntemini ç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 girmelerine 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ı, ilgili kişiyi zaten seçmişse Intent
kullanarak mevcut bir kişiyi düzenlemek yararlı olabilir. Örneğin, posta adresleri olan ancak posta kodu bulunmayan kişileri bulan bir uygulama, kullanıcılara kodu arayıp kişiye ekleme seçeneği sunabilir.
Niyet kullanarak mevcut bir kişiyi düzenlemek için kişi eklemeye benzer bir prosedür kullanın. Amaç kullanarak yeni kişi ekleme bölümünde açıklandığı gibi bir amaç oluşturun ancak kişinin
Contacts.CONTENT_LOOKUP_URI
ve MIME türünü
Contacts.CONTENT_ITEM_TYPE
amaca ekleyin. Kişiyi sahip olduğunuz ayrıntılarla düzenlemek istiyorsanız bunları amacın genişletilmiş verilerine ekleyebilirsiniz. Bazı ad sütunlarının amaç kullanılarak düzenlenemeyeceğini unutmayın. Bu sütunlar, ContactsContract.Contacts
sınıfının API referansının özet bölümünde "Güncelle" başlığı altında listelenir.
Son olarak amacı gönderin. Buna yanıt olarak, kişiler uygulaması bir düzenleme ekranı görüntüler. Kullanıcı düzenlemeyi bitirip düzenlemeleri kaydettikten sonra, kişiler uygulaması bir kişi listesi görüntüler. 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 bir amaç oluşturmak üzere Intent(action)
numaralı telefonu arayın. Niyetin veri değerini kişinin Contacts.CONTENT_LOOKUP_URI
ve MIME türünü Contacts.CONTENT_ITEM_TYPE
MIME türü olarak ayarlamak için setDataAndType()
yöntemini çağırın. setType()
çağrısının Intent
için geçerli veri değerinin üzerine yazması nedeniyle verileri ve MIME türünü aynı anda ayarlamanız gerekir.
Bir kişinin Contacts.CONTENT_LOOKUP_URI
değerini almak için kişinin Contacts._ID
ve Contacts.LOOKUP_KEY
değerlerini bağımsız değişken olarak kullanarak Contacts.getLookupUri(id, lookupkey)
yöntemini çağırın.
Not: Bir kişinin LOOKUP_KEY
değeri, bir kişiyi geri almak için kullanmanız gereken tanımlayıcıdır. Sağlayıcı, dahili işlemleri gerçekleştirmek için kişinin satır kimliğini değiştirse bile 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 oluyor. Uygulamanız kişiler uygulamasına bir düzenleme amacı gönderdiğinde ve kullanıcılar bir kişiyi düzenleyip kaydettiğinde Geri'yi tıkladıklarında kişi listesi ekranını görürler. Uygulamanıza geri gitmek için Son Kullanılanlar'ı tıklayıp uygulamanızı seçmeleri gerekir.
Android 4.0.3 (API sürümü 15) ve sonraki sürümlerde bu sorunu çözmek için finishActivityOnSaveCompleted
genişletilmiş veri anahtarını true
değeriyle ekleyin.
Android 4.0'dan önceki Android sürümleri bu anahtarı kabul etse de herhangi bir etkisi yoktur. 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);
Başka genişletilmiş veriler ekleme
Intent
aracına daha fazla genişletilmiş veri eklemek için putExtra()
numaralı telefonu arayın.
Intents.Insert
politikasında belirtilen anahtar değerlerini kullanarak ortak kişi 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ının API referansının özet bölümünde "Güncelle" başlığı altında listelenir.
Amacı gönderin
Son olarak oluşturduğunuz amacı gönderin. Örneğin:
Kotlin
// Sends the Intent startActivity(editIntent)
Java
// Sends the Intent startActivity(editIntent);
Kullanıcıların bir amaç kullanarak ekleme veya düzenleme yapma seçmesine izin ver
Kullanıcıların, ACTION_INSERT_OR_EDIT
işlemiyle bir Intent
göndererek kişi ekleme veya mevcut bir kişiyi düzenleme arasında seçim yapmalarına 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şi için ek adres olarak eklemesine olanak tanıyabilir. Bu amacın MIME türünü Contacts.CONTENT_ITEM_TYPE
olarak ayarlayın ancak veri URI'sini ayarlamayın.
Bu amacı gönderdiğinizde kişiler uygulaması bir kişiler listesi görüntüler.
Kullanıcılar yeni bir kişi ekleyebilir veya mevcut bir kişiyi seçip düzenleyebilir.
Niyete eklediğiniz genişletilmiş veri alanları, görünen ekranı doldurur. Intents.Insert
politikasında belirtilen anahtar/değerlerden herhangi birini kullanabilirsiniz. Aşağıdaki kod snippet'inde amacın 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);