`

用Java解析手机号获取手机信息(归属地、Sim卡类型、移动或是联通、区号、邮编)

 
阅读更多
生活中经常遇到要根据手机号码查询手机的归属地或者其他信息,如下所示:

手机号码:15968833161
省份:浙江
城市:杭州
区号:0571
邮编:310000
移动公司名称:中国移动
卡类型:GSM

为此,本人闲得蛋疼的就写了段Java代码,通过网上现有的手机解析API获取手机详细信息。

设计思想:
用百度搜索了下,网上有个网址有API可以提供,详细信息见连接http://api.showji.com/Locating/help.htm#IFRAME

本人是用HttpClient基于超链接的形式进行查询,例如http://guishu.showji.com/search.htm?m=13900008888

下面详细解释下代码:

首先,我定义了一个手机对象,用来存储手机信息
package com.zhengtian.tools.bean.phone;

/**
 * $Id: $
 * 
 * @author zhengtian
 * @time 2012-12-26
 */
public class MobilePhone {
	// 移动手机号码
	private long phone_number;
	// 省份
	private String province;
	// 城市
	private String city;
	// 城市区号
	private String city_code;
	// 城市邮编
	private long zip_code;
	// 卡类型
	private String card_type;
	// 移动公司名称
	private String corporation_name;

	/**
	 * 输出手机详细信息
	 * 
	 * @return
	 */
	public String getPhoneInfo() {
		StringBuilder info = new StringBuilder();
		
		info.append("手机号码:").append(phone_number).append("\n");
		info.append("省份:").append(province).append("\n");
		info.append("城市:").append(city).append("\n");
		info.append("区号:").append(city_code).append("\n");
		info.append("邮编:").append(zip_code).append("\n");
		info.append("移动公司名称:").append(corporation_name).append("\n");
		info.append("卡类型:").append(card_type).append("\n");
		
		return info.toString();
	}

	public long getPhone_number() {
		return phone_number;
	}

	public void setPhone_number(long phone_number) {
		this.phone_number = phone_number;
	}

	public String getProvince() {
		return province;
	}

	public void setProvince(String province) {
		this.province = province;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getCity_code() {
		return city_code;
	}

	public void setCity_code(String city_code) {
		this.city_code = city_code;
	}

	public long getZip_code() {
		return zip_code;
	}

	public void setZip_code(long zip_code) {
		this.zip_code = zip_code;
	}

	public String getCard_type() {
		return card_type;
	}

	public void setCard_type(String card_type) {
		this.card_type = card_type;
	}

	public String getCorporation_name() {
		return corporation_name;
	}

	public void setCorporation_name(String corporation_name) {
		this.corporation_name = corporation_name;
	}

}


接着,是用HttpClient对手机号码进行解析,附件中tools-0.0.1-SNAPSHOT-sources.jar是源代码,tools_fat.jar是可执行jar包。phoneTools.rar是我自己用的Maven工程,有兴趣的朋友们,可以直接导入后查看代码和运行。如果朋友们需要重新打可运行的jar包,可以参考一下链接http://zheng12tian.iteye.com/blog/1765626

下面讲解下解析手机号码的类,如下所示:

package com.zhengtian.tools.service.phone;

import java.io.IOException;

import net.sf.json.JSONObject;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;

import com.zhengtian.tools.bean.phone.MobilePhone;
import com.zhengtian.tools.util.JsonUtils;

/**
 * 手机信息查询工具类,主要实现根据手机号码查询手机归属地等信息。
 * 
 * @author zhengtian
 * @time 2012-12-26
 */
public class MobilePhoneTool {
	/**
	 * 手机信息查询全局变量
	 */
	// 手机信息查询网址
	private static final String URL = "http://api.showji.com/Locating/www.showji.com.aspx";
	/**
	 * 上网代理全局变量
	 */
	// 代理Host
	private static final String proxyHost = "10.10.10.78";
	// 代理端口
	private static final int proxyProt = 8080;
	// 代理用户名
	private static final String proxyUserName = "zhengtian";
	// 代理密码
	private static final String proxyPassword = "4rfv.com";
	/**
	 * 响应包编码方式
	 */
	private static final String responseCharset = "UTF-8";

	private MobilePhone getMobilePhone(long phone_number) {
		HttpClient client = new HttpClient();
		// 设置代理
		//setProxy(client, proxyHost, proxyProt, proxyUserName, proxyPassword);
		// get方式
		HttpMethod method = new GetMethod(URL);
		try {
			// 设置get参数
			NameValuePair m = new NameValuePair("m", String.valueOf(phone_number));
			NameValuePair output = new NameValuePair("output", "json");
			method.setQueryString(new NameValuePair[] { m, output });
			// 服务器返回的状态(200:ok)
			int statusCode = client.executeMethod(method);
			if (statusCode == 200) {
				// 服务器返回的信息
				String responseBody = new String(method.getResponseBody(), responseCharset);
				if (StringUtils.isNotEmpty(responseBody)) {
					JSONObject json = JSONObject.fromObject(responseBody);
					return convertJsonToMobilePhone(json);
				}
				System.out.println("查询结果为空");
			} else {
				System.out.println("查询失败");
			}
		} catch (HttpException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 释放连接
			method.releaseConnection();
		}
		return null;
	}

	/**
	 * 将json对象转换为MobilePhone
	 * 
	 * @param json
	 * @return
	 */
	private MobilePhone convertJsonToMobilePhone(JSONObject json) {
		if (JsonUtils.isNotEmpty(json)) {
			MobilePhone phone = new MobilePhone();
			// 获取手机号码
			long mobile = JsonUtils.getLongValue(json, "Mobile");
			phone.setPhone_number(mobile);
			// 获取省份
			String province = JsonUtils.getStringValue(json, "Province");
			phone.setProvince(province);
			// 获取城市
			String city = JsonUtils.getStringValue(json, "City");
			phone.setCity(city);
			// 获取城市区号
			String areacode = JsonUtils.getStringValue(json, "AreaCode");
			phone.setCity_code(areacode);
			// 获取邮编
			long postcode = JsonUtils.getLongValue(json, "PostCode");
			phone.setZip_code(postcode);
			// 获取公司
			String corp = JsonUtils.getStringValue(json, "Corp");
			phone.setCorporation_name(corp);
			// 获取sim卡类型
			String card = JsonUtils.getStringValue(json, "Card");
			phone.setCard_type(card);

			return phone;
		}
		return null;
	}

	/**
	 * 设置代理
	 * 
	 * @param client
	 * @param proxyHost
	 * @param proxyProt
	 * @param userName
	 * @param password
	 */
	private void setProxy(HttpClient client, String proxyHost, int proxyProt, String userName, String password) {
		// 设置HTTP代理IP和端口
		client.getHostConfiguration().setProxy(proxyHost, proxyProt);
		// 代理认证
		UsernamePasswordCredentials creds = new UsernamePasswordCredentials(userName, password);
		client.getState().setProxyCredentials(AuthScope.ANY, creds);
	}

	public static void main(String[] args) {
		long no = args != null && args.length > 0 ? Long.valueOf(args[0]) : 18658155313L;
		if (args != null && args.length > 1) {
			no = Long.valueOf(args[0]);
		}
		MobilePhoneTool phone = new MobilePhoneTool();
		MobilePhone info = phone.getMobilePhone(no);
		if (info != null) {
			System.out.println(info.getPhoneInfo());
		}
	}
}




如果机器上有jdk的环境,那么可以直接用cmd运行tools_fat.jar,详细用法如下
  • lib.rar (1.5 MB)
  • 下载次数: 28
  • 大小: 31.5 KB
分享到:
评论
1 楼 yunxi_2015 2016-11-06  
不好用啊,查询失败

相关推荐

    Android获取手机号码归属地

    首先,我们要明白手机号码的归属地信息通常包括运营商(如中国移动、中国联通、中国电信)以及省份和城市信息。这些数据并不存储在设备本地,而是需要通过网络查询第三方API或者数据库获取。因此,开发过程中需要...

    Android代码-SIM卡运营商获取手机号码功能暂时无法实现.zip

    在Android系统中,获取SIM卡运营商信息相对简单,但直接通过SIM卡获取手机号码的功能却存在一定的限制。这是因为出于隐私保护和安全考虑,Android系统并未开放直接读取用户手机号码的API接口。开发者通常可以通过...

    Android SIM卡号码获取

    在Android系统中,获取SIM卡号码以及运营商标识是移动应用开发中常见的需求,尤其是在涉及到通信功能或者个性化服务时。SIM卡(Subscriber Identity Module)包含了用户的运营商信息和一个唯一的国际移动用户识别码...

    获取SIM卡信息

    在Android开发中,获取网络和SIM卡信息是常见的需求,这涉及到系统服务的调用以及权限的管理。本文将详细讲解如何在Android应用中获取SIM卡信息,包括运营商名称、SIM卡ID(IMEI)、SIM序列号(IMSI)等,并简要提及...

    Android 获取移动网络及SIM卡运营商信息.rar

    Android 获取移动网络及SIM卡运营商信息,可获取到SIM卡国别、SIM卡序列号、SIM卡状态、运营商代号、手机制式等信息。获取各个数据项的值:  listValues.add(tm.getDeviceId());//获取设备编号  listValues.add(tm...

    安卓通讯录联系人打电话归属地相关-SIM卡运营商获取手机号码功能暂时无法实现.zip

    首先,我们要明白“SIM卡运营商”指的是手机用户所使用的移动通信服务提供商,如中国移动、中国联通、中国电信等。这些运营商为用户提供手机号码并负责网络连接。在安卓系统中,通过编程接口(API)可以获取到SIM卡...

    手机号码归属地查询软件 v6.7.1.1113 免费版.zip

    手机号码归属地查询支持全国最新的15X号段、18X号段的查询,自带数据库总量超过十八万五千条手机号码归属地信息,可以详细查询到手机号码的开户地信息,包括该号码所属省份、城市、长途区号以及该号码 SIM卡类型(仅...

    ios-获取国际手机区号.zip

    在iOS开发中,获取国际手机区号是一项常见的需求,特别是在涉及到国际通信或者用户地理位置信息处理时。本资源“ios-获取国际手机区号.zip”提供了一个解决方案,帮助开发者能够便捷地获取不同国家和地区的手机区号...

    获取手机SIM卡运营商

    在IT行业中,获取手机SIM卡运营商的信息是一项常见的需求,尤其在移动应用开发、数据分析和位置服务等领域。这个任务涉及到通信网络、操作系统API以及隐私保护等多个方面。以下将详细阐述相关知识点。 首先,SIM卡...

    安卓号码归属地获取模块

    在安卓平台上,开发一个“安卓号码归属地获取模块”是为了帮助应用程序识别并处理手机号码的归属地信息,以及判断手机SIM卡的类型。这个模块通常用于提供服务,如电话拦截、营销定向、用户分析等。以下是一些核心...

    手机号码归属地

    手机号码归属地是指手机SIM卡登记的初始运营商所在地,通常与用户的实际居住地并不完全一致,但能提供一个大致的地理位置信息。它包括运营商(如中国移动、中国联通、中国电信)和对应的省份、城市信息。 描述中...

    Android判断单双卡(5.0以上),获取手机号码;

    获取每个SIM卡的手机号码,同样需要使用`SubscriptionManager`。首先,获取所有活跃的`SubscriptionInfo`对象,然后从中提取电话号码。这里需要注意,有些SIM卡可能没有分配电话号码,因此需要进行异常处理: ```...

    Android获取手机号码和运营商信息的方法

    在Android平台上,获取手机的号码和运营商信息是常见的需求,特别是在开发涉及通信功能的应用时。以下是如何在Android中实现这一功能的详细步骤和相关知识点。 首先,为了获取手机号码和运营商信息,我们需要使用`...

    手机号码归属地数据库.mdb格式 有20多万条记录!并有最新移动182号码段的部分数据

    5. **其他信息**:可能还包括区号、SIM卡类型、网络制式(2G、3G、4G、5G)等。 mdb数据库的优势在于它支持SQL查询,可以高效地进行数据检索和分析。例如,你可以快速找出某个城市的所有移动182号码,或者统计特定...

    Android获取手机sim卡信息

    Android获取手机sim卡信息,包含手机平台,运营商等信息。

    获取运营商sim卡信息

    总结来说,获取运营商SIM卡信息是Android开发中的常见任务,通过`TelephonyManager`类可以方便地获取网络类型、运营商名称等信息,但需注意不同运营商网络类型的差异以及Android的权限管理。在实际应用中,确保兼容...

    Android高级应用源码-SIM卡运营商(获取手机号码功能暂时无法实现).rar

    在这个"Android高级应用源码-SIM卡运营商(获取手机号码功能暂时无法实现).rar"压缩包中,我们可以推测这是一个专注于获取SIM卡信息,特别是运营商信息的应用。然而,值得注意的是,描述中提到获取手机号码的功能...

    sid手机号码归属地编号

    "sid手机号码归属地编号"可能指的是SIM卡识别号(Subscriber Identity Module Identifier,SID)与手机号码结合,用于追踪和管理移动设备的地理位置信息。下面将详细阐述这一主题。 首先,SIM卡是手机连接到移动...

    sim卡引脚定义

    4. **SIM卡座的多样性**:由于SIM卡广泛应用于各种移动通信设备中,如手机、平板电脑等,因此SIM卡座的设计也多种多样。这就要求在选择SIM卡座时,应根据具体的应用场景和设备类型来确定合适的尺寸和形状。 #### 四...

Global site tag (gtag.js) - Google Analytics