Skip to content

Instantly share code, notes, and snippets.

@delacrixmorgan
Last active June 23, 2021 14:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save delacrixmorgan/3b3efef4e449a9366836158c221142cd to your computer and use it in GitHub Desktop.
Save delacrixmorgan/3b3efef4e449a9366836158c221142cd to your computer and use it in GitHub Desktop.
Adding Android Contacts with Contacts Contract

Adding Android Contacts with Contacts Contract

fun saveMultipleFieldsContactTest() {
        if (ContextCompat.checkSelfPermission(
                appContext,
                Manifest.permission.WRITE_CONTACTS
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            Assert.fail("Write Contacts Permission Denied")
        }

        val firstName = "Aerith"
        val middleName = ""
        val lastName = "Gainsborough"

        val mobile = "+60000000001"
        val work = "+60000000002"
        val fax = "+60000000003"
        val otherPhone = ""

        val email1 = "aerith@gmail.com"
        val email2 = "aerith.gainsborough@gmail.com"
        val otherEmail = "aerithrawks@gmail.com"

        val contentProviderOperation = ArrayList<ContentProviderOperation>()
        val rawContactInsertIndex = contentProviderOperation.size

        contentProviderOperation.add(
            ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build()
        )

        /**
         * Name
         */

        val nameOperation = ContentProviderOperation
            .newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(
                ContactsContract.Contacts.Data.RAW_CONTACT_ID,
                rawContactInsertIndex
            )
            .withValue(
                ContactsContract.Contacts.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
            )

        nameOperation.withValue(
            ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
            firstName
        )
        nameOperation.withValue(
            ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME,
            middleName
        )
        nameOperation.withValue(
            ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
            lastName
        )

        contentProviderOperation.add(nameOperation.build())


        /**
         * Phone Number
         */

        val phoneList = listOf(mobile, work, fax, otherPhone)

        phoneList.forEach { phoneNumber ->
            val phoneNumberOperation = ContentProviderOperation
                .newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(
                    ContactsContract.Data.RAW_CONTACT_ID,
                    rawContactInsertIndex
                )
                .withValue(
                    ContactsContract.Contacts.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
                )

            phoneNumberOperation.withValue(
                ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber
            )

            when (phoneNumber) {
                mobile -> {
                    phoneNumberOperation.withValue(
                        ContactsContract.CommonDataKinds.Phone.TYPE,
                        ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE
                    )
                }
                work -> {
                    phoneNumberOperation.withValue(
                        ContactsContract.CommonDataKinds.Phone.TYPE,
                        ContactsContract.CommonDataKinds.Phone.TYPE_WORK
                    )
                }
                fax -> {
                    phoneNumberOperation.withValue(
                        ContactsContract.CommonDataKinds.Phone.TYPE,
                        ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK
                    )
                }
                otherPhone -> {
                    phoneNumberOperation.withValue(
                        ContactsContract.CommonDataKinds.Phone.TYPE,
                        ContactsContract.CommonDataKinds.Phone.TYPE_OTHER
                    )
                }
            }
            contentProviderOperation.add(phoneNumberOperation.build())
        }

        /**
         * Email
         */

        val emailList = listOf(email1, email2, otherEmail)

        emailList.forEach { email ->
            val emailOperation = ContentProviderOperation
                .newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(
                    ContactsContract.Data.RAW_CONTACT_ID,
                    rawContactInsertIndex
                )
                .withValue(
                    ContactsContract.Contacts.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
                )

            emailOperation.withValue(ContactsContract.CommonDataKinds.Email.DATA, email)

            when (email) {
                email1 -> emailOperation.withValue(
                    ContactsContract.CommonDataKinds.Email.TYPE,
                    ContactsContract.CommonDataKinds.Email.TYPE_MOBILE
                )
                email2 -> emailOperation.withValue(
                    ContactsContract.CommonDataKinds.Email.TYPE,
                    ContactsContract.CommonDataKinds.Email.TYPE_WORK
                )
                otherEmail -> emailOperation.withValue(
                    ContactsContract.CommonDataKinds.Email.TYPE,
                    ContactsContract.CommonDataKinds.Email.TYPE_OTHER
                )
            }

            contentProviderOperation.add(emailOperation.build())
        }

        try {
            contentResolver.applyBatch(ContactsContract.AUTHORITY, contentProviderOperation)
        } catch (exception: Exception) {
            Assert.fail(exception.localizedMessage)
        }
}
@math0guy009
Copy link

What if we also wanted to assign a group to the given contact
Tried following the same pattern but can't seem to get it to work right.... any pointers?

 val groups = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
            .withValue(
                ContactsContract.Contacts.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE
            )

        groups.withValue(ContactsContract.CommonDataKinds.GroupMembership.GROUP_SOURCE_ID, "Family")
        contentProviderOperation.add(groups.build())

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment