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

如何从设备本地联系人中仅获取手机号,排除WhatsApp、Duo等号码

如何仅获取设备本地原生手机号(排除WhatsApp/Duo等第三方号码)

核心原理

第三方通讯应用(如WhatsApp、Google Duo)添加的联系人号码,会在ContactsContract.CommonDataKinds.Phone.DATA_SET字段中标记专属应用ID(例如"com.whatsapp"),而设备本地原生手机号的该字段值为空或null。利用这一特性即可精准过滤。

修改后的查询代码

直接替换你原有的查询逻辑,添加过滤条件:

// 只查询需要的字段,减少内存占用
val projection = arrayOf(
    ContactsContract.CommonDataKinds.Phone.NUMBER,
    ContactsContract.CommonDataKinds.Phone.DATA_SET
)

// 筛选条件:指定联系人ID + DATA_SET为空/Null(排除第三方应用号码)
val selection = """
    ${ContactsContract.CommonDataKinds.Phone.CONTACT_ID} = ? 
    AND (${ContactsContract.CommonDataKinds.Phone.DATA_SET} IS NULL 
         OR ${ContactsContract.CommonDataKinds.Phone.DATA_SET} = '')
""".trimMargin()

val phones: Cursor? = contentResolver.query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    projection,
    selection,
    arrayOf(contactId),
    null
)

// 遍历结果,获取本地手机号
phones?.use { cursor ->
    while (cursor.moveToNext()) {
        val numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
        val localPhoneNumber = cursor.getString(numberIndex)
        // 处理你的本地手机号
    }
}

可选:按号码类型精准筛选

如果只需要移动手机号,可在筛选条件中加入类型判断:

val selection = """
    ${ContactsContract.CommonDataKinds.Phone.CONTACT_ID} = ? 
    AND (${ContactsContract.CommonDataKinds.Phone.DATA_SET} IS NULL 
         OR ${ContactsContract.CommonDataKinds.Phone.DATA_SET} = '')
    AND ${ContactsContract.CommonDataKinds.Phone.TYPE} = ${ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE}
""".trimMargin()

若需要兼容住宅、工作等原生号码类型,可使用IN条件:

AND ${ContactsContract.CommonDataKinds.Phone.TYPE} IN (
    ${ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE},
    ${ContactsContract.CommonDataKinds.Phone.TYPE_HOME},
    ${ContactsContract.CommonDataKinds.Phone.TYPE_WORK}
)

内容的提问来源于stack exchange,提问作者Tippu Fisal Sheriff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:25:20