代码之家  ›  专栏  ›  技术社区  ›  Josh Hansen

为什么phonelookup和contactscontract.contacts picker之间的联系人id不匹配?

  •  0
  • Josh Hansen  · 技术社区  · 7 年前

    我的应用程序正在扫描短信并计算指标,然后将其存储在一个数据库中,该数据库由短信上与电话号码相关联的联系人ID键入。使用 PhoneLookup 机制。在稍后的时间里,我也让用户选择使用接触选择器意图的联系人。但是,即使选择同一个人,从拾取器返回的联系人ID也不同于所获得的联系人ID。 电话查找 .这是为什么?

    这里有一个活动显示了这种效果。套 PHONE_NUMBER 等于您手机上已知联系人的电话号码。然后点击“选择联系人”按钮并选择同一联系人。对我来说,这两种方法的联系人ID是不同的。

    import android.app.Activity
    import android.content.Intent
    import android.net.Uri
    import android.os.Bundle
    import android.provider.ContactsContract
    import android.support.v7.app.AppCompatActivity
    import android.util.Log
    import com.example.R
    import kotlinx.android.synthetic.main.activity_contact_idtest.*
    
    class ContactIDTest : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_contact_idtest)
        }
    
        companion object {
            const val TAG = "ContactIDTest"
            const val RQST_PICK_CONTACT = 1
            const val PHONE_NUMBER = "5551234567"
        }
    
        override fun onResume() {
            super.onResume()
    
            cmdPickContact.setOnClickListener {
                val pickContactIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
                pickContactIntent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE // Show user only contacts w/ phone numbers
                startActivityForResult(pickContactIntent, RQST_PICK_CONTACT)
            }
    
            contactForPhoneNumber(PHONE_NUMBER, { contactID, displayName, photoThumbnailUri ->
                txtContactID.text = contactID.toString()
                txtContactName.text = displayName
            }, {
                Log.e(TAG, "Error getting contact for phone number")
            })
        }
    
        private fun contactForPhoneNumber(phoneNumber: String, callback: (contactID: Long, displayName: String?, photoThumbnailUri: String?) -> Unit, error: () -> Unit) {
            val contactURI = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber))
    
            try {
                val cursor = contentResolver.query(contactURI,
                        arrayOf(ContactsContract.PhoneLookup.CONTACT_ID, ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup.PHOTO_THUMBNAIL_URI),
                        null,
                        null,
                        null
                )
    
                if(cursor == null || cursor.count <= 0) {
                    error()
                } else {
    
                    cursor.moveToFirst()
    
                    val contactID = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.CONTACT_ID))
                    val displayName = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.DISPLAY_NAME))
                    val photoThumbnailUri = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.PHOTO_THUMBNAIL_URI))
    
                    cursor.close()
    
                    callback(contactID, displayName, photoThumbnailUri)
    
                }
    
            } catch(e: Exception) {
                Log.e(TAG, "Error loading contact for phone number: $phoneNumber", e)
            }
        }
    
        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            if(requestCode == RQST_PICK_CONTACT) {
                if(resultCode == Activity.RESULT_OK) {
    
                    val contactData = data!!.data
                    val c = contentResolver.query(contactData, null, null, null, null)
                    if(c.moveToFirst()) {
                        val contactID = c.getLong(c.getColumnIndex(ContactsContract.Contacts._ID))
                        val displayName = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
    
                        txtPickedContactID.text = contactID.toString()
                        txtPickedContactName.text = displayName.toString()
                    }
                    c.close()
                }
            }
        }
    }
    

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/layoutContactIDTest"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".activities.ContactIDTest"
        tools:layout_editor_absoluteY="81dp">
    
        <TextView
            android:id="@+id/txtContactName"
            android:layout_width="wrap_content"
            android:layout_height="21dp"
            android:text="$CONTACT_NAME"
            app:layout_constraintBottom_toTopOf="@+id/cmdPickContact"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/txtContactID" />
    
        <TextView
            android:id="@+id/txtContactID"
            android:layout_width="wrap_content"
            android:layout_height="18dp"
            android:text="$CONTACT_ID"
            app:layout_constraintBottom_toTopOf="@+id/txtContactName"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/cmdPickContact"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Pick Contact"
            app:layout_constraintBottom_toTopOf="@+id/txtPickedContactID"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/txtContactName" />
    
        <TextView
            android:id="@+id/txtPickedContactID"
            android:layout_width="wrap_content"
            android:layout_height="17dp"
            android:text="$PICKED_CONTACT_ID"
            app:layout_constraintBottom_toTopOf="@+id/txtPickedContactName"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/cmdPickContact" />
    
        <TextView
            android:id="@+id/txtPickedContactName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="$PICKED_CONTACT_NAME"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/txtPickedContactID" />
    </android.support.constraint.ConstraintLayout>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   marmor    7 年前

    此代码:

    val pickContactIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
    pickContactIntent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
    

    将返回 CommonDataKinds.Phone._ID 不是一个 Contacts._ID