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>


 

相关文章
|
2月前
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
1524 2
|
3月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
151 0
|
1月前
|
存储 移动开发 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;
|
17天前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
3月前
|
缓存 Android开发 开发者
安卓系统优化:提升手机性能的秘诀
【5月更文挑战第31天】本文将探讨如何通过一系列简单的步骤和技巧,对安卓系统进行优化,以提升手机的性能。我们将从清理无用文件、管理后台应用、调整系统设置等方面入手,帮助你的安卓设备运行更加流畅。
|
3月前
|
Android开发
【苹果安卓通用】xlsx 和 vCard 文件转换器,txt转vCard文件格式,CSV转 vCard格式,如何批量号码导入手机通讯录,一篇文章说全
本文介绍了如何快速将批量号码导入手机通讯录,适用于企业客户管理、营销团队、活动组织、团队协作和新员工入职等场景。步骤包括:1) 下载软件,提供腾讯云盘和百度网盘链接;2) 打开软件,复制粘贴号码并进行加载预览和制作文件;3) 将制作好的文件通过QQ或微信发送至手机,然后按苹果、安卓或鸿蒙系统的指示导入。整个过程简便快捷,可在1分钟内完成。
分享:2秒快速查询40万手机号码归属地,批量手机号码归属地查询可以导出excel表格,WPS表格查询手机号码归属地怎么操作,批量手机号码归属地批量查询软件,批量号码查询按省份和城市分类,按运移动号码电信号码联通号码分类整理
本文介绍了如何批量快速查询手机号码归属地并进行分类。首先,通过提供的百度网盘或腾讯云盘链接下载免费查询软件。其次,开启软件,启用复制粘贴功能,直接粘贴号码列表并选择高速查询。软件能在极短时间内(如1.76秒内)完成40多万个号码的查询,结果包括归属地、运营商、邮箱和区号,且数据准确。之后,可直接导出数据至表格,若数据超过100万,可按省份、城市及运营商分类导出。文章还附带了操作动画演示,展示全程流畅的处理大量手机号码归属地查询的过程。
分享:2秒快速查询40万手机号码归属地,批量手机号码归属地查询可以导出excel表格,WPS表格查询手机号码归属地怎么操作,批量手机号码归属地批量查询软件,批量号码查询按省份和城市分类,按运移动号码电信号码联通号码分类整理
|
3月前
|
Android开发
【通讯录教程】苹果安卓鸿蒙系统通用,如何大批量导入手机号码到手机的通讯录,下面教你方法,只需1分钟搞定几万个号码的导入手机电话本
该文介绍了一种快速批量导入手机通讯录的方法,适用于处理大量手机号的需求,如微商管理、客户资料整理等。在QQ同步助手开始收费后,提供了免费的替代方案。步骤包括:下载批量导入软件(链接提供腾讯云盘和百度网盘地址),清空通讯录(非必需),制作符合格式的通讯录文件,并按操作系统(苹果、安卓或鸿蒙)进行导入。整个过程只需1分钟,简便快捷。
|
2月前
|
前端开发 JavaScript Android开发
手机APP开发|基于安卓APP实现掌上党支部——党员app
手机APP开发|基于安卓APP实现掌上党支部——党员app
|
3月前
|
安全 Android开发 iOS开发
探索安卓与iOS手机操作系统的发展趋势与差异
在移动互联网时代,安卓和iOS手机操作系统一直处于激烈的竞争之中。本文将从技术角度出发,探讨两大操作系统的发展趋势、特点以及差异,并分析其对用户体验和开发者生态的影响,旨在为读者提供对移动操作系统发展方向的深入了解。