1. 程式人生 > >利用com.googlecode.libphonenumber解析手機號歸屬地

利用com.googlecode.libphonenumber解析手機號歸屬地

libphonenumber是一個Google開發的Common Java類庫用於解析,格式化,儲存和校驗國際電話號碼;

缺點是太新的號碼無法正確識別

https://github.com/googlei18n/libphonenumber

package com.base.phone;

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;
/**
    程式碼示例
*/
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, Integer countryCode){

        long phone = Long.parseLong(phoneNumber);

        PhoneNumber pn = new PhoneNumber();
        pn.setCountryCode(countryCode);
        pn.setNationalNumber(phone);

        return phoneNumberUtil.isValidNumber(pn);

    }

    /**
     * 根據國家程式碼和手機號  判斷手機運營商
     * @date 2017-4-26 上午11:30:18
     * @param phoneNumber
     * @param countryCode
     * @return
     */
    public static String getCarrier(String phoneNumber, Integer countryCode){

        long phone = Long.parseLong(phoneNumber);

        PhoneNumber pn = new PhoneNumber();
        pn.setCountryCode(countryCode);
        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: 根據國家程式碼和手機號  手機歸屬地
    * @date 2017-4-26 上午11:33:18
    * @param phoneNumber
    * @param countryCode
    * @return    引數
     */
    public static String getGeo(String phoneNumber, Integer countryCode){

        long phone = Long.parseLong(phoneNumber);

        PhoneNumber pn = new PhoneNumber();
        pn.setCountryCode(countryCode);
        pn.setNationalNumber(phone);

        return geocoder.getDescriptionForNumber(pn, Locale.CHINESE);

    }

    public static void main(String[] args) {
            System.out.println(PhoneUtil.getCarrier("159657755",86));

    }

}

        <dependency>
		   <groupId>com.googlecode.libphonenumber</groupId>
		   <artifactId>geocoder</artifactId>
		   <version>2.82</version>
        </dependency>
        
        <dependency>
		   <groupId>com.googlecode.libphonenumber</groupId>
		   <artifactId>libphonenumber</artifactId>
		   <version>8.8.5</version>
        </dependency>
        
        <dependency>
		   <groupId>com.googlecode.libphonenumber</groupId>
		   <artifactId>prefixmapper</artifactId>
		   <version>2.82</version>
       </dependency>
       <dependency>
		   <groupId>com.googlecode.libphonenumber</groupId>
		   <artifactId>carrier</artifactId>
		   <version>1.72</version>
       </dependency>