Java获取手机号码归属地的实现
遇到一个需求,需要发送短信给全球各地的用户,但是各大运营商的API都是区分国内和国际,但是我们只有电话号码,只能自己添加一个方法,判断号码的归属地,然后再分别调用相应区域的API.
引入依赖包
com.googlecode.libphonenumber libphonenumber 7.0 com.googlecode.libphonenumber carrier 1.11 com.googlecode.libphonenumber geocoder 2.12
工具类方法
packagecn.net.jarvis.common.core;
importcom.alibaba.fastjson.JSONObject;
importcom.google.i18n.phonenumbers.NumberParseException;
importcom.google.i18n.phonenumbers.PhoneNumberUtil;
importcom.google.i18n.phonenumbers.Phonenumber;
importcom.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
importcom.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
importjava.util.Locale;
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
/**
*@authorMao,hongtu1993@sina.cn
*@versionEnterversionhere...,5:47PM2019/12/16
*/
publicclassPhoneUtil{
privatestaticPhoneNumberUtilphoneNumberUtil=PhoneNumberUtil.getInstance();
privatestaticPhoneNumberOfflineGeocodergeocoder=PhoneNumberOfflineGeocoder.getInstance();
/**
*根据国家代码和手机号判断手机号是否有效
*@paramphoneNumber手机号码
*@paramcountryCode国号(区号)
*@returntrue/false
*/
publicstaticbooleancheckPhoneNumber(longphoneNumber,intcountryCode){
PhoneNumberpn=newPhoneNumber();
pn.setCountryCode(countryCode);
pn.setNationalNumber(phoneNumber);
returnphoneNumberUtil.isValidNumber(pn);
}
privatestaticPatternphoneReg=Pattern.compile("\\+(9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\\d{1,14}$");
publicstaticJSONObjectgetPhoneNumberInfo(StringphoneNumber)throwsException{
//正则校验
Matchermatcher=phoneReg.matcher(phoneNumber);
if(!matcher.find()){
thrownewException("Thephonenumbermaybelike:"+"+[NationalNumber][Phonenumber],butgot"+phoneNumber);
}
Phonenumber.PhoneNumberreferencePhonenumber;
try{
Stringlanguage="CN";
referencePhonenumber=phoneNumberUtil.parse(phoneNumber,language);
}catch(NumberParseExceptione){
thrownewException(e.getMessage());
}
StringregionCodeForNumber=phoneNumberUtil.getRegionCodeForNumber(referencePhonenumber);
if(regionCodeForNumber==null){
thrownewException("Missingregioncodebyphonenumber"+phoneNumber);
}
booleancheckSuccess=PhoneUtil.checkPhoneNumber(referencePhonenumber.getNationalNumber(),referencePhonenumber.getCountryCode());
if(!checkSuccess){
thrownewException("Notanactivenumber:"+phoneNumber);
}
Stringdescription=geocoder.getDescriptionForNumber(referencePhonenumber,Locale.CHINA);
intcountryCode=referencePhonenumber.getCountryCode();
longnationalNumber=referencePhonenumber.getNationalNumber();
JSONObjectresultObject=newJSONObject();
//区域编码Locale:HK,US,CN...
resultObject.put("regionCode",regionCodeForNumber);
//国号:86,1,852...@link:https://blog.csdn.net/wzygis/article/details/45073327
resultObject.put("countryCode",countryCode);
//去掉+号和国号/区号后的实际号码
resultObject.put("nationalNumber",nationalNumber);
//所在地区描述信息
resultObject.put("description",description);
//去掉+号后的号码(用于阿里云发送短信)
resultObject.put("number",String.valueOf(countryCode)+nationalNumber);
resultObject.put("fullNumber",phoneNumber);
returnresultObject;
}
publicstaticvoidmain(String[]args)throwsException{
//{"number":"85268476749","regionCode":"HK","nationalNumber":68476749,"countryCode":852,"description":"香港","fullNumber":"+85268476749"}
System.out.println(PhoneUtil.getPhoneNumberInfo("+85268476749").toJSONString());
//{"number":"16467879865","regionCode":"US","nationalNumber":6467879865,"countryCode":1,"description":"美国","fullNumber":"+16467879865"}
System.out.println(PhoneUtil.getPhoneNumberInfo("+16467879865").toJSONString());
//Thephonenumbermaybelike:+[NationalNumber][Phonenumber],butgot+86155xxxx331
System.out.println(PhoneUtil.getPhoneNumberInfo("+86155xxxx331").toJSONString());
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。