You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中筛选手机通讯录以指定字母开头的联系人

解决通讯录筛选以指定字母开头联系人的问题

你当前代码的核心问题是使用了=精确匹配,这只会找出名字**完全等于"A"**的联系人,而不是以"A"开头的。要实现前缀匹配,需要用SQL的LIKE操作符配合通配符%。

修改后的代码示例

val selectedContactsList: ArrayList<SelectedContactItem> = arrayListOf()
val cursor = context.contentResolver.query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    arrayOf(
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER
    ),
    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " LIKE ?",
    arrayOf("A%"),
    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
)

cursor?.use { // 自动管理Cursor生命周期,避免内存泄漏
    while (it.moveToNext()) {
        val contactName = it.getString(it.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
        val contactNumber = it.getString(it.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER))
        val contactItem = SelectedContactItem(contactNumber, contactName)
        selectedContactsList.add(contactItem)
    }
}

额外优化建议

  • 忽略大小写匹配:如果需要同时匹配"A"和"a"开头的联系人,修改筛选条件为:
    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " LIKE ? COLLATE NOCASE",
    arrayOf("A%"),
    
  • 更安全的列索引获取:用getColumnIndexOrThrow替代getColumnIndex,列名错误时会直接抛出异常,便于快速排查问题。
  • 自动关闭Cursor:使用cursor?.use{}语法,无需手动调用cursor.close(),避免因忘记关闭导致的资源泄漏。

内容的提问来源于stack exchange,提问作者Ravi.Dudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:22:14