如何从设备本地联系人中仅获取手机号,排除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
相关产品推荐
相关产品推荐

