Java手机号码工具类(判断运营商、获取归属地)以及简要的原理跟踪 您所在的位置:网站首页 手机号归属地怎么隐藏了 Java手机号码工具类(判断运营商、获取归属地)以及简要的原理跟踪

Java手机号码工具类(判断运营商、获取归属地)以及简要的原理跟踪

2024-06-01 06:45| 来源: 网络整理| 查看: 265

最近做的项目有一部分关于手机号码的操作,于是搜罗了一些资料,整了一个工具类。主要有以下三个功能:判断号码是否有效、获取号码运营商、获取号码归属地。

首先需要引入google开发的相关依赖或者下载对应的jar包

com.googlecode.libphonenumber geocoder 2.15 com.googlecode.libphonenumber libphonenumber 6.3 com.googlecode.libphonenumber prefixmapper 2.15 com.googlecode.libphonenumber carrier 1.5

下面是工具类的源码:

import java.util.Locale; import com.google.i18n.phonenumbers.PhoneNumberToCarrierMapper; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder; /** * * @ClassName: PhoneUtil * @Description:手机号码归属地工具类 */ public class PhoneUtil { private static PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); private static PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper.getInstance(); private static PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance(); /** * 根据国家代码和手机号 判断手机号是否有效 * @param phoneNumber * @param countryCode * @return */ public static boolean checkPhoneNumber(String phoneNumber, String countryCode){ int ccode = StringUtils.obj2Int(countryCode); long phone = StringUtils.toLong(phoneNumber); PhoneNumber pn = new PhoneNumber(); pn.setCountryCode(ccode); pn.setNationalNumber(phone); return phoneNumberUtil.isValidNumber(pn); } /** * 根据国家代码和手机号 判断手机运营商 * @param phoneNumber * @param countryCode * @return */ public static String getCarrier(String phoneNumber, String countryCode){ int ccode = StringUtils.obj2Int(countryCode); long phone = StringUtils.toLong(phoneNumber); PhoneNumber pn = new PhoneNumber(); pn.setCountryCode(ccode); pn.setNationalNumber(phone); //返回结果只有英文,自己转成成中文 String carrierEn = carrierMapper.getNameForNumber(pn, Locale.ENGLISH); String carrierZh = ""; carrierZh += geocoder.getDescriptionForNumber(pn, Locale.CHINESE); switch (carrierEn) { case "China Mobile": carrierZh += "移动"; break; case "China Unicom": carrierZh += "联通"; break; case "China Telecom": carrierZh += "电信"; break; default: break; } return carrierZh; } /** * * @Description: 根据国家代码和手机号 手机归属地 * @param @param phoneNumber * @param @param countryCode * @param @return 参数 * @throws */ public static String getGeo(String phoneNumber, String countryCode){ int ccode = StringUtils.obj2Int(countryCode); long phone = StringUtils.toLong(phoneNumber); PhoneNumber pn = new PhoneNumber(); pn.setCountryCode(ccode); pn.setNationalNumber(phone); return geocoder.getDescriptionForNumber(pn, Locale.CHINESE); } /** * * @Title: getPhoneRegionCode * @Description: 得到手机的归宿地编码 * @return String 返回类型 * @throws */ public static String getPhoneRegionCode(String phoneNumber, String countryCode){ String areaName=getGeo(phoneNumber,countryCode); if(StringUtils.isEmpty(areaName)){ return ""; } if(areaName.length() 0) { Integer possibleLength = currentSetOfLengths.last(); String phonePrefixStr = String.valueOf(phonePrefix); if (phonePrefixStr.length() > possibleLength) { phonePrefix = Long.parseLong(phonePrefixStr.substring(0, possibleLength)); } currentIndex = binarySearch(0, currentIndex, phonePrefix); if (currentIndex < 0) { return null; } int currentPrefix = phonePrefixMapStorage.getPrefix(currentIndex); if (phonePrefix == currentPrefix) { return phonePrefixMapStorage.getDescription(currentIndex); } currentSetOfLengths = currentSetOfLengths.headSet(possibleLength); } return null; }

下面看看getDescription的实现方法,descriptionPool是一个字符串数组,通过计算出来的index获取对应的号码归属地。

public String getDescription(int index) { int indexInDescriptionPool = readWordFromBuffer(descriptionIndexes, descIndexSizeInBytes, index); return descriptionPool[indexInDescriptionPool]; }

下图是获取归属地时的descriptionPool详情

获取运营商的方法与获取归属地最终调用的方法相同,只是查询运营商时传入的参数是英文,而查询归属地时传入的参数是中文,下图是查询运营商时的getDescription情况,可以看到descriptionPool现在的值是运营商。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有