Получить контактную информацию при открытии приложения из контактной информации пользовательской строки - PullRequest
0 голосов
/ 02 июля 2019

Я создал пользовательскую строку в контактной информации с пользовательским MIME-типом и связал этот MIME-тип с действием в моем приложении

<activity
        android:name=".xxxx.xxxxxActivity"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="vnd.android.cursor.item/com.sample.profile2"/>
        </intent-filter>
    </activity>

enter image description here

Когда я щелкаю строку «образец» в контактной информации, он открывает мое приложение (ранее закрытое) для правильного действия, но я не знаю, как получить контактную информацию, откуда пришло намерение.

Как я могу получить контактную информацию в моем приложении?Например, номер телефона.

Редактировать Если это поможет, я добавлю пользовательскую строку в контактную информацию

fun addContact(context: Context, contact: Contact) {
    val resolver = context.contentResolver
    resolver.delete(ContactsContract.RawContacts.CONTENT_URI,
            ContactsContract.RawContacts.ACCOUNT_TYPE + " = ?", arrayOf(AccountGeneral.ACCOUNT_TYPE))

    //...


    val ops = ArrayList<ContentProviderOperation>()

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(ContactsContract.RawContacts.CONTENT_URI, true))
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, AccountGeneral.ACCOUNT_NAME)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, AccountGeneral.ACCOUNT_TYPE)
            .build())

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Settings.CONTENT_URI, true))
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, AccountGeneral.ACCOUNT_NAME)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, AccountGeneral.ACCOUNT_TYPE)
            .withValue(Settings.UNGROUPED_VISIBLE, 1)
            .build())

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
            .withValueBackReference(Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Contacts.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
            .withValue(StructuredName.GIVEN_NAME, givenName)
            .withValue(StructuredName.FAMILY_NAME, familyName)
            .build())

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
            .withValueBackReference(ContactsContract.Contacts.Data.RAW_CONTACT_ID, 0)
            .withValue(Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.aliasName.getFormattedPhoneNumber())
            .build())

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
            .withValueBackReference(ContactsContract.Contacts.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Contacts.Data.MIMETYPE, MIMETYPE)
            .withValue(ContactsContract.Contacts.Data.DATA1, Integer.valueOf(14))
            .withValue(ContactsContract.Contacts.Data.DATA2, "sample")
            .withValue(ContactsContract.Contacts.Data.DATA3, "sample")
            .build())

    try {
        val results = resolver.applyBatch(ContactsContract.AUTHORITY, ops)
        if (results.isEmpty())
            return
    } catch (e: Exception) {
        e.printStackTrace()
    }


private fun addCallerIsSyncAdapterParameter(uri: Uri, isSyncOperation: Boolean): Uri {
    return if (isSyncOperation) {
        uri.buildUpon()
                .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
                .build()
    } else uri
}

EDIT2 С помощью следующего кода

val intent = intent
if (intent.data != null) {
    Logger.e("intent received", intent.data!!.toString())

    val uri = intent.data
    val projection = arrayOf(ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)

    val cursor = applicationContext.contentResolver.query(uri, projection, null, null, null)
    cursor!!.moveToFirst()

    val numberColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
    val number = cursor.getString(numberColumnIndex)

    val nameColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
    val name = cursor.getString(nameColumnIndex)

    Logger.e("name number", "$number $name")
    cursor.close()
} else {
    Logger.e("intent received", "null intent received")
}

я получаю это в журналах

E/intent received: content://com.android.contacts/data/5875
E/name number: 14 John Doe

Не уверен, что представляет 14.но это не номер телефона.Не ContactsContract.CommonDataKinds.Phone.NUMBER правильный столбец для получения номера телефона?

...