Google公共電話號碼解析庫--libphonenumber


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ù)國家所采用,但仍有一些國家決定采用不同的國際冠碼,甚至提供多組冠碼。

image.png

國際電話

撥打國際電話的一般順序是:國際冠碼-國際電話區(qū)號-國內(nèi)電話區(qū)號-開放電話號碼;國際冠碼-國際電話區(qū)號-封閉電話號碼。

國際電話區(qū)號

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

image.png

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);

    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容