1. 程式人生 > >java手機號歸屬地查詢

java手機號歸屬地查詢

所需的包:carrier-1.75.jar geocoder-2.85.jarlibphonenumber-8.8.8.jarprefixmapper-2.85.jar

物件:
public class PhoneModel {

	/** 省份名稱 */
	private String provinceName;

	/** 城市名稱 */
	private String cityName;

	/** 運營商:移動/電信/聯通 */
	private String carrier;

	/**
	 * 省份名稱
	 * 
	 * @return 獲取provinceName屬性值
	 */
	public String getProvinceName() {
		return provinceName;
	}

	/**
	 * 省份名稱
	 * 
	 * @param provinceName
	 *            設定 provinceName 屬性值為引數值 provinceName
	 */
	public void setProvinceName(String provinceName) {
		this.provinceName = provinceName;
	}

	/**
	 * 城市名稱
	 * 
	 * @return 獲取cityName屬性值
	 */
	public String getCityName() {
		return cityName;
	}

	/**
	 * 城市名稱
	 * 
	 * @param cityName
	 *            設定 cityName 屬性值為引數值 cityName
	 */
	public void setCityName(String cityName) {
		this.cityName = cityName;
	}

	/**
	 * 運營商:移動/電信/聯通
	 * 
	 * @return 獲取carrier屬性值
	 */
	public String getCarrier() {
		return carrier;
	}

	/**
	 * 運營商:移動/電信/聯通
	 * 
	 * @param carrier
	 *            設定 carrier 屬性值為引數值 carrier
	 */
	public void setCarrier(String carrier) {
		this.carrier = carrier;
	}

}
程式碼實現和測試:
import java.util.Locale;

import com.csg.statistics.bean.PhoneModel;
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;

/**
 * 手機號歸屬地查詢
 * jar依賴:com.googlecode.libphonenumber(Libphonenumber、Geocoder、Prefixmapper
 * 、Carrier) pom依賴:http://mvnrepository.com/search?q=libphonenumber
 * 專案地址:https://github.com/googlei18n/libphonenumber
 *
 */
public class PhoneUtil {

	/** 直轄市 */
	private final static String[] MUNICIPALITY = { "北京市", "天津市", "上海市", "重慶市" };

	/** 自治區 */
	private final static String[] AUTONOMOUS_REGION = { "新疆", "內蒙古", "西藏",
			"寧夏", "廣西" };

	private static PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil
			.getInstance();

	/** 提供與電話號碼相關的運營商資訊 */
	private static PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper
			.getInstance();

	/** 提供與電話號碼有關的地理資訊 */
	private static PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder
			.getInstance();

	/** 中國大陸區區號 */
	private final static int COUNTRY_CODE = 86;

	/**
	 * 根據手機號 判斷手機號是否有效
	 * 
	 * @param phoneNumber
	 *            手機號碼
	 * @return true-有效 false-無效
	 */
	public static boolean checkPhoneNumber(String phoneNumber) {
		long phone = Long.parseLong(phoneNumber);

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

		return phoneNumberUtil.isValidNumber(pn);

	}

	/**
	 * 根據手機號 判斷手機運營商
	 * 
	 * @param phoneNumber
	 *            手機號碼
	 * @return 如:廣東省廣州市移動
	 */
	public static String getCarrier(String phoneNumber) {

		long phone = Long.parseLong(phoneNumber);

		PhoneNumber pn = new PhoneNumber();
		pn.setCountryCode(COUNTRY_CODE);
		pn.setNationalNumber(phone);
		// 返回結果只有英文,自己轉成成中文
		String carrierEn = carrierMapper.getNameForNumber(pn, Locale.ENGLISH);
		String carrierZh = "";
		switch (carrierEn) {
		case "China Mobile":
			carrierZh += "移動";
			break;
		case "China Unicom":
			carrierZh += "聯通";
			break;
		case "China Telecom":
			carrierZh += "電信";
			break;
		default:
			break;
		}
		return carrierZh;
	}

	/**
	 * 根據手機號 獲取手機歸屬地
	 * 
	 * @param phoneNumber
	 *            手機號碼
	 * @return 如:廣東省廣州市
	 */
	public static String getGeo(String phoneNumber) {
		long phone = Long.parseLong(phoneNumber);

		PhoneNumber pn = new PhoneNumber();
		pn.setCountryCode(COUNTRY_CODE);
		pn.setNationalNumber(phone);
		return geocoder.getDescriptionForNumber(pn, Locale.CHINESE);
	}

	/**
	 * 根據手機號 獲取手機資訊模型
	 * 
	 * <pre>
	 * 若返回值為null,則說明該號碼無效
	 * </pre>
	 * 
	 * @param phoneNumber
	 *            手機號碼
	 * @return 手機資訊模型PhoneModel
	 */
	public static PhoneModel getPhoneModel(String phoneNumber) {
		if (checkPhoneNumber(phoneNumber)) {
			String geo = getGeo(phoneNumber);
			PhoneModel phoneModel = new PhoneModel();
			String carrier = getCarrier(phoneNumber);
			phoneModel.setCarrier(carrier);
			// 直轄市
			for (String val : MUNICIPALITY) {
				if (geo.equals(val)) {
					phoneModel.setProvinceName(val.replace("市", ""));
					phoneModel.setCityName(val);
					return phoneModel;
				}
			}
			// 自治區
			for (String val : AUTONOMOUS_REGION) {
				if (geo.startsWith(val)) {
					phoneModel.setProvinceName(val);
					phoneModel.setCityName(geo.replace(val, ""));
					return phoneModel;
				}
			}

			// 其它
			String[] splitArr = geo.split("省");
			if (splitArr != null && splitArr.length == 2) {
				phoneModel.setProvinceName(splitArr[0]);
				phoneModel.setCityName(splitArr[1]);
				return phoneModel;
			}
		}
		return null;
	}
	
	public static void main(String[] args) {
		PhoneModel phoneModel = PhoneUtil.getPhoneModel("13456555555");
		if(phoneModel != null){
			System.out.println(phoneModel.getProvinceName());
			System.out.println(phoneModel.getCityName());
			System.out.println(phoneModel.getCarrier());
		}else{
			System.err.println("該號碼無效");
		}
	}

}
測試結果: