Android利用WebService查询手机号码归属地

简介: MainActivity如下: package cc.testwebservice;import java.io.ByteArrayOutputStream;import java.

MainActivity如下:

package cc.testwebservice;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.http.HttpStatus;
import org.xmlpull.v1.XmlPullParser;
import android.os.Bundle;
import android.util.Xml;
import android.app.Activity;
/**
 * Demo描述:
 * 利用WebService查询手机号码归属地
 * 
 * 注意事项:
 * 在http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo
 * 的SOAP 1.2中明确提示请求的设置:
 * POST /WebServices/MobileCodeWS.asmx HTTP/1.1
 * Host: webservice.webxml.com.cn
 * Content-Type: application/soap+xml; charset=utf-8
 * Content-Length: length
 * 即:
 * 请求方法:POST 采用HTTP协议 路径为/WebServices/MobileCodeWS.asmx
 * 主机名称:webservice.webxml.com.cn
 * 所以请求路径为http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx
 * 亦明确提示在POST请求时需要设置:
 * Content-Type和Content-Length字段及其值
 * 
 * 参考文档:
 * 1 http://www.webxml.com.cn/zh_cn/index.aspx
 * 2 http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx
 * 3 http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo
 * 
 * 备注说明:
 * 该服务在少数时候,会访问失败403错误.
 * 多试几次即可
 */
public class MainActivity extends Activity {
    private final String mobileNumber="1500280";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		new Thread(){
			public void run() {
				String city=queryMobileCodeByWebService(mobileNumber);
				System.out.println("city="+city);
			};
		}.start();
		
	}
    private String queryMobileCodeByWebService(String mobileNumber){
    	String city=null;
    	try {
    		InputStream inputStream=this.getAssets().open("soap.xml");
    		byte [] soapData=inputStreamToByteArray(inputStream);
    		String soapContent=new String(soapData, "UTF-8");
    		//替换soap.xml中的占位符$number
    		soapContent = soapContent.replaceAll("\\$number", mobileNumber);
    		byte [] entity=soapContent.getBytes();
    		
    		String webServicePath = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
    		URL webServiceURL=new URL(webServicePath);
    		HttpURLConnection httpURLConnection = (HttpURLConnection) webServiceURL.openConnection();
    		httpURLConnection.setConnectTimeout(8000);
    		httpURLConnection.setRequestMethod("POST");
    		//因为要发送SOAP协议,所以允许对外输出
    		httpURLConnection.setDoOutput(true);
    		//设置该SOAP协议要求的Content-Type字段
    		httpURLConnection.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
    		//设置该SOAP协议要求的Content-Length字段
    		httpURLConnection.setRequestProperty("Content-Length", String.valueOf(entity.length));
    		OutputStream outputStream = httpURLConnection.getOutputStream();
    		//发送数据
    		outputStream.write(entity);
    		if (httpURLConnection.getResponseCode()==HttpStatus.SC_OK) {
				city=parseSOAPResponse(httpURLConnection.getInputStream());
			}
		} catch (Exception e) {
			
		}
    	
		return city;
    }
    
    //解析服务器以XML形式返回的SOAP
    public String parseSOAPResponse(InputStream inputStream) {
		String city = null;
		try {
			XmlPullParser xmlPullParser = Xml.newPullParser();
			xmlPullParser.setInput(inputStream, "UTF-8");
			int eventType = xmlPullParser.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				case XmlPullParser.START_TAG:
					if ("getMobileCodeInfoResult".equals(xmlPullParser.getName())) {
						city = xmlPullParser.nextText();
						return city;
					}
					break;
				}
				eventType = xmlPullParser.next();
			}
		} catch (Exception e) {
			
		}

		return city;
	}
    
   
    public  byte[] inputStreamToByteArray(InputStream inputStream){
    	ByteArrayOutputStream byteArrayOutputStream=null;
    	try {
    		byteArrayOutputStream = new ByteArrayOutputStream();
    		byte[] buffer = new byte[1024];
    		int len = 0;
    		while( (len= inputStream.read(buffer)) != -1 ){
    			byteArrayOutputStream.write(buffer, 0, len);
    		}
    		byteArrayOutputStream.close();
    		inputStream.close();
		} catch (Exception e) {
			
		}
		return byteArrayOutputStream.toByteArray();
	}
	
}


main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="利用WebService查询手机号码归属地"
        android:layout_centerInParent="true"
     />

</RelativeLayout>


soap.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
      <mobileCode>$number</mobileCode>
      <userID></userID>
    </getMobileCodeInfo>
  </soap12:Body>
</soap12:Envelope>


 

相关文章
|
6月前
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
5036 2
|
29天前
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
58 4
|
1月前
|
API
查手机号归属地免费API接口教程
此API用于查询指定手机号码的归属地信息,包括号段、省份、城市、运营商等。支持POST和GET请求方式,需提供用户ID、KEY及手机号作为参数。返回结果包含状态码、信息提示及详细归属地信息。示例请求地址:https://cn.apihz.cn/api/ip/shouji.php?id=88888888&key=88888888&phone=13219931963。
|
1月前
|
安全 搜索推荐 Android开发
Android vs. iOS:解锁智能手机操作系统的奥秘####
【10月更文挑战第21天】 在当今这个数字化时代,智能手机已成为我们生活中不可或缺的伙伴。本文旨在深入浅出地探讨两大主流操作系统——Android与iOS的核心差异、优势及未来趋势,帮助读者更好地理解这两个平台背后的技术哲学和用户体验设计。通过对比分析,揭示它们如何塑造了我们的数字生活方式,并展望未来可能的发展路径。无论您是技术爱好者还是普通用户,这篇文章都将带您走进一个充满创新与可能性的移动世界。 ####
71 3
|
2月前
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
165 2
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
|
2月前
|
Web App开发 Android开发
利用firefox调试安卓手机端web
该教程详细介绍如何通过Firefox浏览器实现手机与电脑的远程调试。手机端需安装最新版Firefox,并按指定步骤设置完成;电脑端则需安装15版及以上Firefox。设置完成后,通过工具栏中的“远程调试”选项,输入手机IP地址即可连接。连接确认后,即可使用电脑端Firefox调试器调试手机上的Web信息。注意,调试前手机需提前打开目标网页。
99 2
|
2月前
|
Android开发 iOS开发 UED
安卓与iOS的较量:谁才是智能手机市场的王者?
本文将深入探讨安卓和iOS两大智能手机操作系统之间的竞争关系,分析它们各自的优势和劣势。通过对比两者在市场份额、用户体验、应用生态等方面的表现,我们将揭示出谁才是真正的市场领导者。无论你是安卓粉丝还是iOS忠实用户,这篇文章都将为你提供一些有趣的观点和见解。
|
4月前
|
Android开发
【Azure 环境】记录使用Notification Hub,安卓手机收不到Push通知时的错误,Error_Code 30602 or 30608
【Azure 环境】记录使用Notification Hub,安卓手机收不到Push通知时的错误,Error_Code 30602 or 30608
|
5月前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
4月前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。