Niyetleri kullanarak kişileri değiştirme

Bu derste, yeni bir kişi eklemek veya bir kişinin verilerini değiştirmek için Intent öğesini nasıl kullanacağınız gösterilmektedir. Kişiler Sağlayıcı'ya doğrudan erişmek yerine bir Intent, uygun Activity'yi çalıştıran Kişiler uygulamasını başlatır. Bu derste açıklanan değişiklik işlemleri için, Intent içinde genişletilmiş veri gönderirseniz bu veri, başlatılan Activity kullanıcı arayüzüne girilir.

Tek bir kişiyi eklemek veya güncellemek için Intent kullanmak, aşağıdaki nedenlerden dolayı Kişiler Sağlayıcı'yı değiştirmenin tercih edilen yoludur:

  • Kendi kullanıcı arayüzünüzü ve kodunuzu geliştirme zahmetinden kurtulursunuz.
  • Contacts Provider'ın kurallarına uymayan değişikliklerin neden olduğu hataların önüne geçer.
  • İstemeniz gereken izinlerin sayısını azaltır. Uygulamanızın, Contacts Provider'a yazma iznine ihtiyacı yoktur. Çünkü değişiklikleri, bu izne zaten sahip olan Kişiler uygulamasına devreder.

Intent kullanarak yeni kişi ekleme

Uygulamanız yeni veriler aldığında genellikle kullanıcının yeni bir kişi eklemesine izin vermek istersiniz. Örneğin, restoran yorumu uygulaması, kullanıcıların yorum yaparken restoranı kişi olarak eklemesine izin verebilir. Bu işlemi intent kullanarak yapmak için elinizdeki verileri kullanarak intent'i oluşturun ve ardından Kişiler uygulamasına gönderin.

Kişiler uygulamasını kullanarak kişi eklediğinizde, Kişiler Sağlayıcısı'nın ContactsContract.RawContacts tablosuna yeni bir ham kişi eklenir. Gerekirse Kişiler uygulaması, ham kişiyi oluştururken kullanılacak hesap türünü ve hesabı kullanıcılara sorar. Kişiler uygulaması, ham kişi zaten mevcutsa kullanıcıları bilgilendirir. Kullanıcılar ekleme işlemini iptal edebilir. Bu durumda kişi oluşturulmaz. Ham kişiler hakkında daha fazla bilgi edinmek için Contacts Provider API kılavuzunu inceleyin.

Niyet oluşturma

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 telefon numarası veya e-posta adresi gibi bilgilere zaten sahipseniz bunları intent'e genişletilmiş veri olarak ekleyebilirsiniz. Anahtar değeri için Intents.Insert sınıfındaki uygun sabiti kullanın. Kişiler uygulaması, verileri ekleme ekranında göstererek 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 çağrı, Kişiler uygulamasında kullanıcıların yeni bir 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 döner.

Intent kullanarak mevcut bir kişiyi düzenleme

Kullanıcı ilgilendiği bir kişiyi seçtiyse 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 arama ve ardından kişiye ekleme seçeneği sunabilir.

Intent kullanarak mevcut bir kişiyi 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ü Contacts.CONTENT_ITEM_TYPE değerlerini ekleyin. Kişiyi zaten sahip olduğunuz ayrıntılarla düzenlemek istiyorsanız bunları intent'in genişletilmiş verilerine ekleyebilirsiniz. Bazı ad sütunlarının bir intent kullanılarak düzenlenemediğini unutmayın. Bu sütunlar, ContactsContract.Contacts sınıfı için API referansının özet bölümünde "Güncelleme" başlığı altında listelenir.

Son olarak intent'i gönderin. Bunun üzerine Kişiler uygulamasında bir düzenleme ekranı gösterilir. Kullanıcı düzenlemeyi tamamlayıp kaydettiğinde Kişiler uygulaması bir kişi listesi gösterir. Kullanıcı Geri'yi tıkladığında uygulamanız gösterilir.

Niyeti oluşturma

Bir kişiyi düzenlemek için Intent(action) yöntemini çağırarak ACTION_EDIT işlemiyle bir intent oluşturun. Amacın veri değerini kişinin Contacts.CONTENT_LOOKUP_URI değerine ve MIME türünü Contacts.CONTENT_ITEM_TYPE MIME türüne ayarlamak için setDataAndType() yöntemini çağırın. setType() çağrısı, Intent için mevcut veri değerinin üzerine yazacağından 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, kişiyi 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 bu değer sabit kalır.

Aşağıdaki snippet'te bir 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);

Navigasyon 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 intent'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. Uygulamanıza geri dönmek 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 intent'e true değeriyle genişletilmiş veri anahtarı finishActivityOnSaveCompleted ekleyin. Android 4.0'dan önceki Android sürümleri bu anahtarı kabul eder ancak anahtarın herhangi bir etkisi olmaz. 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 öğesine daha fazla genişletilmiş veri eklemek için gerektiğinde putExtra() yöntemini çağırın. Intents.Insert bölümünde belirtilen anahtar değerleri kullanarak yaygın 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ı için API referansının özet bölümünde "Güncelleme" başlığı altında listelenir.

Niyeti gönder

Son olarak, oluşturduğunuz intent'i gönderin. Örneğin:

Kotlin

    // Sends the Intent
    startActivity(editIntent)

Java

    // Sends the Intent
    startActivity(editIntent);

Kullanıcıların bir intent kullanarak ekleme veya düzenleme yapmasına izin verme

ACTION_INSERT_OR_EDIT işlemiyle bir Intent göndererek kullanıcıların 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 bir e-posta adresini yeni bir kişiye eklemesine veya mevcut bir kişi için ek adres olarak eklemesine izin verebilir. Bu intent'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. Amaca eklediğiniz tüm genişletilmiş veri alanları, görünen ekranı doldurur. Intents.Insert içinde belirtilen anahtar değerlerden 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);