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'ün nasıl kullanılacağı gösterilmektedir. Kişi Sağlayıcı'ya doğrudan erişmek yerine, Intent, uygun olan kişiler uygulamasını başlatır. Activity. Bu derste açıklanan değişiklik işlemleri için genişletilmiş verileri Intent içinde gönderirseniz bu veriler Başlatılan Activity.

Tek bir kişi eklemek veya güncellemek için Intent kullanılması tercih edilir Kişiler Sağlayıcısı'nda değişiklik yapmanın kolay bir yolu yoktur:

  • 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ı.
  • Bu, istemeniz gereken izin sayısını azaltır. Uygulamanızın izne ihtiyacı yok için Kişiler uygulamasında değişiklikler yetkisi verdiğinden Bu izin zaten bu izne sahip.

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, Örneğin, bir restoran eleştirisi uygulaması, kullanıcıların restoranı ziyaret ederken bu restoran incelemem gerekiyor. 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şiler'e yeni bir ham kişi eklenir Sağlayıcının ContactsContract.RawContacts tablosu. Gerekirse Kişiler uygulaması, ham verileri oluştururken kullanıcılardan hesap türü ve hesap ile iletişime geçin. Kişiler uygulaması, ham kişi zaten mevcut olduğunda da kullanıcıları bilgilendirir. Daha sonra kullanıcılar ekleme işlemini iptal etme seçeneği bulunur. Bu durumda hiçbir kişi oluşturulmaz. Öğrenmek için daha fazla bilgi edinmek için Kişi Sağlayıcı API kılavuzu.

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 bilgileriniz zaten varsa bunları genişletilmiş veri olarak amaca ekleyin. Bir anahtar değeri için Intents.Insert 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 girin ve Bitti'yi tıkladığınızda kişiler uygulamasının kişi listesi görünür. Kullanıcıların geri dönmesi: Geri'yi tıklayarak uygulamanıza gidin.

Niyet kullanarak mevcut bir kişiyi düzenleme

Intent kullanarak mevcut bir kişiyi düzenlemek, kullanıcının ilgi çekici bir kişi zaten seçti. Örneğin, telefon veya e-tablonuzdaki kişileri bulan bir ancak posta kodunun olmaması, kullanıcılara kodu arama ve sonra da bunu kişiye ekliyorum.

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 da niyeti gönderin. Kişiler uygulaması, yanıt olarak bir düzenleme ekranı gösterir. 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. Telefonla arama setDataAndType() ile Contacts.CONTENT_LOOKUP_URI ve MIME türüne odaklanmak Contacts.CONTENT_ITEM_TYPE MIME türü; çünkü setType(), Intent, verileri ve MIME türünü aynı anda ayarlamanız gerekir.

Bir kişinin Contacts.CONTENT_LOOKUP_URI numarasını almak için şu numarayı arayın: Kişinin bilgileri ile Contacts.getLookupUri(id, lookupkey) Contacts._ID ve Şu şekilde Contacts.LOOKUP_KEY değerleri: bağımsız değişkenlerdir.

Not: Bir 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. Şu konuma 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 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ın hiç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 ekle

Intent cihazına daha fazla genişletilmiş veri eklemek için şu numarayı arayın: İsteğinize göre putExtra(). Intents.Insert bölümünde belirtilen anahtar değerlerini kullanarak yaygın iletişim alanları için genişletilmiş veriler ekleyebilirsiniz. Bazı işlerin ContactsContract.Contacts tablosundaki sütunlar değiştirilemez. Bu sütunlar, sınıfa ait API referansının özet bölümündeki "Güncelleme" başlığı altında listelenir. ContactsContract.Contacts

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 intent kullanarak ekleme veya düzenleme seçmesine izin ver

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 eklemelerine veya ek bir iletişim olarak eklemelerine izin ver mevcut bir kişinin adresi. Bu niyetin MIME türünü şuna ayarla: Contacts.CONTENT_ITEM_TYPE 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. Niyete eklediğiniz tüm genişletilmiş veri alanları, gösterilen ekranı doldurur. Intents.Insert bölümünde belirtilen anahtar değerlerinden 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);