title: Google公共電話號碼解析庫--libphonenumber
date: 2018-09-13 17:40:50
categories:
- libphonenumber
tags:
- libphonenumber
libphonenumber是用于解析、格式化、存儲和校驗(yàn)電話號碼的Java、C++或JavaScript類庫。2010年,libphonenumber的Java實(shí)現(xiàn)首次以開源形式發(fā)布。在2014年,libphonenumber成為Debian發(fā)行版的一部分。其中Java版本優(yōu)化用于運(yùn)行在智能手機(jī)上,并且用在了 Android framework 4.0 (Ice Cream Sandwich)以上的版本中。
GitHub 地址:<u>https://github.com/googlei18n/libphonenumber</u>
//***************************************libphonenumber*************************************************
//https://mvnrepository.com/artifact/com.googlecode.libphonenumber
"libphonenumber" : "com.googlecode.libphonenumber:libphonenumber:${versions["libphonenumber"]}",
"geocoder" : "com.googlecode.libphonenumber:geocoder:${versions["geocoder"]}",
"carrier" : "com.googlecode.libphonenumber:carrier:${versions["carrier"]}",
"prefixmapper" : "com.googlecode.libphonenumber:prefixmapper:${versions["prefixmapper"]}",
基本概念
一些基本概念的介紹
國家代碼
國家代碼(或國家編碼)是一組用來代表國家和境外領(lǐng)土的地理代碼。國家代碼是由字母或數(shù)字組成的短字串,方便用于數(shù)據(jù)處理和通訊。世界上有許多不同的國家代碼標(biāo)準(zhǔn),其中最廣為人知是為國際標(biāo)準(zhǔn)化組織的<u>ISO 3166-1</u>。國家代碼也可以指<u>國際長途電話</u>國家號碼,即<u>國際電信聯(lián)盟</u>的國際電話區(qū)號(E.164)
中國86
港澳臺地區(qū) 香港852澳門853臺灣886
國際冠碼
<u>國際電信聯(lián)盟</u>早些前已認(rèn)可00為通用的國際冠碼,并被多數(shù)國家所采用,但仍有一些國家決定采用不同的國際冠碼,甚至提供多組冠碼。

國際電話
撥打國際電話的一般順序是:國際冠碼-國際電話區(qū)號-國內(nèi)電話區(qū)號-開放電話號碼;國際冠碼-國際電話區(qū)號-封閉電話號碼。
國際電話區(qū)號
國際電話區(qū)號,即<u>國際電信聯(lián)盟</u>根據(jù)E.164標(biāo)準(zhǔn)分配給各國的代碼。所有的號碼都是前綴號,也就是說這些號碼是用來“撥到”目的國家。每一個(gè)國家還有一個(gè)前綴來“撥出”所在國家,這個(gè)前綴叫<u>國際冠碼</u>。

E164號碼
E.164 是國際電信聯(lián)盟定義的在PSTN和一些數(shù)據(jù)網(wǎng)使用的國際公共電話碼號方案,同時(shí)定義了具體的碼號的格式。E.164定義了最大15數(shù)字,完整號碼有國際呼叫前綴。
E.164號碼是MSISDN號碼,它是主叫用戶為呼叫移動通信網(wǎng)中用戶所需撥號的號碼。
其格式為:CC+NDC+SN,也可以表示為:國家代碼+N1N2N3+H0H1H2H3+ABCD
(CC=國家碼,中國為86;NDC=國內(nèi)目的碼;SN=用戶號碼)
例如給中國廣東深圳0755-12345678撥號,處理后的結(jié)果是+8675512345678。其中+號表示要進(jìn)行國際撥號,在撥號到運(yùn)營商網(wǎng)絡(luò)時(shí)候會自動(gsm會,cdma不一定)轉(zhuǎn)成一個(gè)號碼(中國就是00,+86在中國打的話其實(shí)就是0086),這個(gè)號碼代表撥號時(shí)注冊的運(yùn)營商網(wǎng)絡(luò)所在國家;86代表目的所在國家代碼,中國的是86;755代表國內(nèi)地區(qū)碼(中國很大,按地區(qū)分,有些小國根本不需要),0755中的0是國內(nèi)長途接入碼,例如國內(nèi)座機(jī)撥打外地手機(jī)號要加0,國際撥號的時(shí)候不需要;最后是目的地的號碼,座機(jī)或者手機(jī)號碼。
https://blog.csdn.net/qq_33645265/article/details/53609609
1.快速集成
jar包下載地址
http://repo1.maven.org/maven2/com/googlecode/libphonenumber/
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('libs/carrier-1.9.jar')
compile files('libs/geocoder-2.93.jar')
compile files('libs/libphonenumber-8.9.4.jar')
compile files('libs/prefixmapper-2.93.jar')
/**
* 根據(jù)國家代碼和手機(jī)號 判斷手機(jī)運(yùn)營商
*
* @param phoneNumber
* @return
*/
public static String getCarrier(Context context, String phoneNumber, int countryCode) {
int ccode = countryCode;
long phone = Long.parseLong(phoneNumber);
Phonenumber.PhoneNumber pn = new Phonenumber.PhoneNumber();
pn.setCountryCode(ccode);
pn.setNationalNumber(phone);
//返回結(jié)果只有英文,自己轉(zhuǎn)成成中文
String carrierEn = carrierMapper.getNameForNumber(pn, Locale.ENGLISH);
String carrierZh = "";
if (countryCode == 86 && Locale.CHINA.getCountry().equals(Locale.getDefault().getCountry())) {
switch (carrierEn) {
case "China Mobile":
carrierZh += "中國移動";
break;
case "China Unicom":
carrierZh += "中國聯(lián)通";
break;
case "China Telecom":
carrierZh += "中國電信";
break;
default:
break;
}
return carrierZh;
} else {
return carrierEn;
}
}
/**
* 根據(jù)國家代碼和手機(jī)號判斷歸屬地
*
* @param context
* @param phoneNumber
* @param countryCode
* @return
*/
public static String getGeo(Context context, String phoneNumber, int countryCode) {
int ccode = countryCode;
long phone = Long.parseLong(phoneNumber);
Phonenumber.PhoneNumber pn = new Phonenumber.PhoneNumber();
pn.setCountryCode(ccode);
pn.setNationalNumber(phone);
PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();
Locale locale = context.getResources().getConfiguration().locale;
return geocoder.getDescriptionForNumber(pn, locale);
}
/**
* 根據(jù)國家代碼和手機(jī)號 判斷手機(jī)號是否有效
*
* @param phoneNumber
* @param countryCode
* @return
*/
public static boolean checkPhoneNumber(String phoneNumber, String countryCode) {
int ccode = Integer.valueOf(countryCode);
long phone = Long.valueOf(phoneNumber);
Phonenumber.PhoneNumber pn = new Phonenumber.PhoneNumber();
pn.setCountryCode(ccode);
pn.setNationalNumber(phone);
return mPhoneNumberUtil.isValidNumber(pn);
}