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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。