利用第三方API服务实现归属地查询
来源:互联网 发布:网络打印机 编辑:程序博客网 时间:2024/06/06 01:41
许多平台诸如阿里、百度等都对外提供了一些付费的API服务,使用这些服务能够大量节省开发成本。在这里我将实现利用来电归属地API服务实现归属地查询。
首先新建一个Android项目,并创建一个Activity。
该Activity中包含一个搜索框(使用EditText),一个按钮(Button)和一个查询结果的文本框(TextView)。页面设计代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.amia.telquery.MainActivity"> <RelativeLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/telnum" android:textAlignment="center"<!--设置文字居中--> android:inputType="number"<!--输入类型设置为数字--> android:background="#ffffff"<!--背景颜色--> android:hint="要查询的电话号码"<!--提示文本--> android:layout_width="match_parent" android:layout_height="50dp" /> <Button android:id="@+id/submit" android:background="@drawable/searchbutton" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentRight="true" /> </RelativeLayout> <TextView android:id="@+id/result" android:textSize="15dp" android:paddingTop="20dp"<!--顶部的距离--> android:lineSpacingMultiplier="2.0"<!--设置行距倍数--> android:lineSpacingExtra="6dp"<!--设置行距大小--> android:textAlignment="center" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
实现的效果如下:
MainActivity中声明组件:
private EditText telnum;private Button submit;private TextView resultView;
MainActivity的onCreate方法中找到对应的组件:
telnum=(EditText)findViewById(R.id.telnum);submit=(Button)findViewById(R.id.submit);resultView=(TextView)findViewById(R.id.result);
定义归属地结果类:
public class TelType { private String prov;//省份 private String num;//号段 private String areaCode;//区号 private String name;//运营商名称 private String postCode;//邮编3 private String provCode;//此地区身份证开头几位 private int type;////1移动 2电信 3联通 private String city; public String getProv() { return prov; } public void setProv(String prov) { this.prov = prov; } public String getNum() { return num; } public void setNum(String num) { this.num = num; } public String getAreaCode() { return areaCode; } public void setAreaCode(String areaCode) { this.areaCode = areaCode; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPostCode() { return postCode; } public void setPostCode(String postCode) { this.postCode = postCode; } public String getProvCode() { return provCode; } public void setProvCode(String provCode) { this.provCode = provCode; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getCity() { return city; } public void setCity(String city) { this.city = city; }}
新建一个java类,命名为QueryTelAddress。定义自己申请的host、path、appcode:
private String host="***** ";private String path="***";private String method="GET ";private String appcode="*******";
headers和query的定义:
private Map<String,String> headers=new HashMap<>();private Map<String,String> querys=new HashMap<>();
单例模式获得该对象:
public static QueryTelAddress getQueryTelAddress() { return queryTelAddress;}private static QueryTelAddress queryTelAddress=new QueryTelAddress();构造方法私有:
private QueryTelAddress(){ headers.put("Authorization","APPCODE "+appcode);}生成链接,这个方法引用了https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java这里的代码(如有侵权请私信联系本人,感谢):
private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException { StringBuilder sbUrl = new StringBuilder(); sbUrl.append(host); if (!StringUtils.isBlank(path)) { sbUrl.append(path); } if (null != querys) { StringBuilder sbQuery = new StringBuilder(); for (Map.Entry<String, String> query : querys.entrySet()) { if (0 < sbQuery.length()) { sbQuery.append("&"); } if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { sbQuery.append(query.getValue()); } if (!StringUtils.isBlank(query.getKey())) { sbQuery.append(query.getKey()); if (!StringUtils.isBlank(query.getValue())) { sbQuery.append("="); sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); } } } if (0 < sbQuery.length()) { sbUrl.append("?").append(sbQuery); } } return sbUrl.toString();}
查询:
public TelType query(String num){ HttpClient httpClient=new DefaultHttpClient(); TelType telType=null; String result=""; HttpGet httpRequest=null; HttpResponse httpResponse; querys.put("num",num); try{ String target =buildUrl(host,path,querys);//创建连接 httpRequest=new HttpGet(target); httpRequest.setHeader("Authorization",headers.get("Authorization")); httpResponse=httpClient.execute(httpRequest); if(httpResponse.getStatusLine().getStatusCode()== HttpStatus.SC_OK){ result= EntityUtils.toString(httpResponse.getEntity());//获取放回的字符串 Log.e("result",result); telType=resolveJSON(result);//将返回的JSON数据解析 } } catch(ClientProtocolException e){ e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } return telType;}解析JSON数据并生成java bean对象:
private TelType resolveJSON(String result){ TelType telType=null; try { JSONObject jsonObject = new JSONObject(result); int res_code=jsonObject.getInt("showapi_res_code");//获取结果状态代码,参数请查询申请API的KEY if(res_code==0){ telType=new TelType(); JSONObject telQueryResult=jsonObject.getJSONObject("showapi_res_body");//获得JSON对象,参数请查询你申请的API的KEY HashMap<String,Object> res=changeToHash(telQueryResult);//将JSON对象中的字段转存到哈希表中 telType=changtoTelType(res);//转换为javabean对象 } } catch (JSONException e){ e.printStackTrace(); } return telType;}
将JSON对象的数据转存到哈希表中,参考了@战国剑 的Android解析——json解析为javabean(http://blog.csdn.net/yangzhaomuma/article/details/50995094,如有侵权请私信本人,感谢):
private HashMap<String,Object> changeToHash(JSONObject jsonObject){ HashMap<String,Object> result=new HashMap<>(); Iterator it=jsonObject.keys(); try { while (it.hasNext()) { String key = String.valueOf(it.next()); Object values = jsonObject.get(key); result.put(key,values); } } catch (JSONException e){ e.printStackTrace(); } return result;}
转换为java bean对象:
private TelType changtoTelType(HashMap<String,Object> res){ /* 参数请查询你申请的API的KEY */ TelType telType=new TelType(); telType.setProv(res.get("prov").toString()); telType.setNum(res.get("num").toString()); telType.setAreaCode(res.get("areaCode").toString()); telType.setName(res.get("name").toString()); telType.setPostCode(res.get("postCode").toString()); telType.setProvCode(res.get("provCode").toString()); telType.setType(Integer.parseInt(res.get("type").toString())); telType.setCity(res.get("city").toString()); return telType;}
在MainActivity的onCreate()方法中为submit按钮添加监听事件:
submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { resultView.setText(""); new Thread(new Runnable() { @Override public void run() { String tel=telnum.getText().toString(); result=query.query(tel); Message m=handler.obtainMessage(); handler.sendMessage(m); } }).start(); }});创建Handle对象:
private Handler handler=new Handler(){ public void handleMessage(Message msg){ if(result!=null){ resultView.setText(String.valueOf("省份:"+result.getProv()+"\n" +"所在城市:"+result.getCity()+"\n"+"运营商:"+result.getName()+"\n" +"邮政编码:"+result.getPostCode())); } else{ //错误提示对话框 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); builder.setTitle("查询失败!"); builder.setMessage("未能查询到该号码信息,请检查号码是否正确或者网络连接是否正常!"); builder.setPositiveButton("确定",null); builder.show(); } super.handleMessage(msg); }};
最终实现结果:
阅读全文
0 0
- 利用第三方API服务实现归属地查询
- 调用第三方API ,实现手机号码归属地及运营商查询
- 利用百度API查询手机号归属地
- 手机号码归属地查询api
- 查询手机归属地API
- 用PHP实现手机归属地查询api接口
- 用PHP实现手机归属地查询api接口
- PHP实现手机归属地查询API接口
- Java WebService服务+WSDL 实现手机号码归属地查询
- 利用PHP实现手机号码归属地查询程序
- 调用第三方webservice服务,获取电话号码归属地简单例子
- 利用新浪api获取ip归属地
- 手机号码归属地查询api接口
- android 手机号码归属地查询api接口
- 手机号码归属地查询api接口
- 手机号码归属地查询api接口
- 手机号码归属地查询api接口
- PHP手机号码归属地查询API接口
- libtest.a: could not read symbols: Archive has no index; run ranlib to add one的原因和解决方案
- 如何在SpringBoot下读取自定义properties配置文件
- Maximum Sequence
- JDE正式表数据迁移到中间表
- JavaEE开发第二篇Spring-Aop
- 利用第三方API服务实现归属地查询
- 设计模式-12-策略模式
- Struts2 Action
- vue-cli脚手架 webpack中引入jquery
- 机器学习之感知机与SVM详细推导
- UVA11799 Horror Dash【求极值+水题】
- solr学习(6.1)solrcloud集群的搭建
- 开发技能-shell面试整理
- 【剑指offer】面试题34:二叉树中和为某一值的路径