Android手机号码归属地的查询

一个简单的Demo,从聚合数据申请手机号码归属地数据接口;

在EditText中输入待查询号码,获取号码后在子线程中使用HttpUrlconnection获取JSON数据,之后进行解析;

数据获取完成后,在主线程中更新UI,显示获取的号码归属地信息。

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >   

  <EditText
    android:id="@+id/et_querylocation"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:textColor="#000000"
    android:hint="输入号码"/>  

  <Button
    android:onClick="query"
    android:textSize="24sp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="查询"/> 

  <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tv_phonelocation"
    android:textSize="20sp"
    android:textColor="#000000"/> 

</LinearLayout> 

java代码

package com.example.phonehome; 

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map; 

import org.json.JSONObject; 

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; 

public class MainActivity extends Activity { 

  private EditText et_phone;
  private TextView tv_phone;
  private final static int START = 0;
  private final static int FINISH = 1;
  private String phone;//待查询号码
  //号码信息
  private static String province;
  private static String city;
  private static String company;
  private static String card; 

   public static final String DEF_CHATSET = "UTF-8";
   public static final int DEF_CONN_TIMEOUT = 30000;
   public static final int DEF_READ_TIMEOUT = 30000; 

   public static final String APPKEY ="申请的APP KEY"; 

   //子线程中查询数据开始、完成时发送消息,完成相应操作
   Handler handler = new Handler(){
     public void handleMessage(android.os.Message msg) {
       switch (msg.what) {
      case START:
        Toast.makeText(MainActivity.this, "正在查询,请稍候", Toast.LENGTH_SHORT).show();
        break; 

      case FINISH:
        //在Textview中显示查得的号码信息(子线程中不能更新UI)
        tv_phone.setText(province +" "+ city + " " + company + " " + card);
        break;
      default:
        break;
      }
     };
   }; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initView();
  } 

  //Button的店家事件,获取待查询号码后在子线程中进行查询
  public void query(View v){
    phone = et_phone.getText().toString().trim();
    if (!TextUtils.isEmpty(phone)) {
      new Thread(){
        public void run() {
          //开始查询
          handler.obtainMessage(START).sendToTarget();
          getRequest(phone);
          //查得结果
          handler.obtainMessage(FINISH).sendToTarget();
        };
      }.start();
    }else {
      Toast.makeText(MainActivity.this, "输入号码不能为空", Toast.LENGTH_SHORT).show();
    } 

  } 

  //手机归属地查询
  public static void getRequest(String phone){
    String result =null;
    String url ="http://apis.juhe.cn/mobile/get";//请求接口地址
    Map params = new HashMap();//请求参数
      params.put("phone",phone);//需要查询的手机号码或手机号码前7位
      params.put("key",APPKEY);//应用APPKEY(应用详细页查询)
      params.put("dtype","");//返回数据的格式,xml或json,默认json 

    try {
      //得到JSON数据,并进行解析
      result =net(url, params, "GET");
      JSONObject object = new JSONObject(result);
      JSONObject ob = new JSONObject(object.get("result").toString()+"");
      province = ob.getString("province");
      city = ob.getString("city");
      company = ob.getString("company");
      card = ob.getString("card");
    } catch (Exception e) {
      e.printStackTrace();
    }
  } 

  /**
  *
  * @param strUrl 请求地址
  * @param params 请求参数
  * @param method 请求方法
  * @return 网络请求字符串
  * @throws Exception
  */
  public static String net(String strUrl, Map params,String method) throws Exception {
    HttpURLConnection conn = null;
    BufferedReader reader = null;
    String rs = null;
    try {
      StringBuffer sb = new StringBuffer();
      if(method==null || method.equals("GET")){
        strUrl = strUrl+"?"+urlencode(params);
      }
      URL url = new URL(strUrl);
      conn = (HttpURLConnection) url.openConnection();
      if(method==null || method.equals("GET")){
        conn.setRequestMethod("GET");
      }else{
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
      }
      //conn.setRequestProperty("User-agent", userAgent);
      conn.setUseCaches(false);
      conn.setConnectTimeout(DEF_CONN_TIMEOUT);
      conn.setReadTimeout(DEF_READ_TIMEOUT);
      conn.setInstanceFollowRedirects(false);
      conn.connect();
      if (params!= null && method.equals("POST")) {
        try {
          DataOutputStream out = new DataOutputStream(conn.getOutputStream());
          out.writeBytes(urlencode(params));
        } catch (Exception e) {
          // TODO: handle exception
          e.printStackTrace();
        } 

      }
      InputStream is = conn.getInputStream();
      reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
      String strRead = null;
      while ((strRead = reader.readLine()) != null) {
        sb.append(strRead);
      }
      rs = sb.toString();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (reader != null) {
        reader.close();
      }
      if (conn != null) {
        conn.disconnect();
      }
    }
    return rs;
  } 

  //将map型转为请求参数型
  public static String urlencode(Map<String,String> data) {
    StringBuilder sb = new StringBuilder();
    for (Map.Entry i : data.entrySet()) {
      try {
        sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
    }
    return sb.toString();
  } 

  private void initView() {
    setContentView(R.layout.activity_main);
    et_phone = (EditText) findViewById(R.id.et_querylocation);
    tv_phone = (TextView) findViewById(R.id.tv_phonelocation);
  } 

} 

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • Android组件WebView编写有道词典小案例分享

    最近学习了WebView组件,写了一个有道词典的小案例,分享给大家,供大家参考,具体内容如下 效果图: 源码下载:https://coding.net/u/gxs1225/p/YouDaoDictionary/git 代码如下: 布局 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schema

  • Android实现上传文件功能的方法

    本文所述为一个Android上传文件的源代码,每一步实现过程都备有详尽的注释,思路比较清楚,学习了本例所述上传文件代码之后,你可以应对其它格式文件的上传.实例中主要实现上传文件至Server的方法,允许Input.Output,不使用Cache,使Androiod上传文件变得轻松. 主要功能代码如下: package com.test; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.

  • Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)

    由于考虑到数据库的安全性,不被轻易SQL注入,执行查询语句时,一般不使用直接拼接的语句,而是使用参数传递的方法.然后在使用参数传递的方法中时,发现当使用like方式查询数据时,很容易出现一个问题. 错误案例: 复制代码 代码如下: String myname = "abc";String sql = "select * from mytable where name like '?%'";Cursor cursor = db.rawQuery(sql, new St

  • Android编程操作联系人的方法(查询,获取,添加等)

    本文实例讲述了Android编程操作联系人的方法.分享给大家供大家参考,具体如下: Android系统中的联系人也是通过ContentProvider来对外提供数据的,我们这里实现获取所有联系人.通过电话号码获取联系人.添加联系人.使用事务添加联系人. 获取所有联系人 1. Android系统中的联系人也是通过ContentProvider来对外提供数据的 2. 数据库路径为:/data/data/com.android.providers.contacts/database/contacts2

  • 浅析Android手机卫士之号码归属地查询

    使用小米号码归属地数据库,有两张表data1和data2 先查询data1表,把手机号码截取前7位 select outkey from data1 where id="前七位手机号" 再查询data2表, select location from data2 where id="上面查出的outkey" 可以使用子查询 select location from data2 where id=(select outkey from data1 where id=&q

  • Android实现有道辞典查询功能实例详解

    本文实例讲述了Android实现有道辞典查询功能的方法.分享给大家供大家参考,具体如下: 这是我做的一个简单的有道Android的DEMO,只是简单的雏形.界面设计也有点丑陋呵呵~ 看看下面的效果图: 第一步:思路解析 从界面看一共用了三个控件EditText,Button,WebView.其实是四个,是当我们查询内容为空的时候用来提示的Toast控件. 我们在EditText输入查询内容,这里包括中文,英文.然后通过参数的形式,从http://dict.youdao.com/m取出数据把结果

  • Android优化查询加载大数量的本地相册图片

    一.概述 讲解优化查询相册图片之前,我们先来看下PM提出的需求,PM的需求很简单,就是要做一个类似微信的本地相册图片查询控件,主要包含两个两部分: 进入图片选择页面就要显示出手机中所有的照片,包括系统相册图片和其他目录下的所有图片,并按照时间倒叙排列 切换相册功能,切换相册页面列出手机中所有的图片目录列表,并且显示出每个目录下所有的图片个数以及封面图片 这两个需求看似简单,实则隐藏着一系列的性能优化问题.在做优化之前,我们调研了一些其他比较出名的app在加载大数量图片的性能表现(gif录制的不够

  • Android 有道词典的简单实现方法介绍

    首先看程序界面如下! 1.布局文件: 复制代码 代码如下: <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

  • android实现倒计时功能代码

    效果图,每隔1秒,变换一下时间  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="mat

  • Android 软件自动更新功能实现的方法

    相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能 首先看一下程序目录结构    步骤: 1.新建一个类UpdateManger,用于显示提示更新 复制代码 代码如下: public class UpdateManger { // 应用程序Context private Context mContext; // 提示消息 private String updateMsg = "有最新的软件包,请下载!"; // 下载安装包的网络路径 private String apkUrl

  • Android编程实现号码归属地查询的方法

    本文实例讲述了Android编程实现号码归属地查询的方法.分享给大家供大家参考,具体如下: 我们通过发送XML访问 WebService就可以实现号码的归属地查询,我们可以使用代理服务器提供的XML的格式进行设置,然后请求提交给服务器,服务器根据请求就会返回给一个XML,XML中就封装了我们想要获取的数据. 发送XML 1.通过URL封装路径打开一个HttpURLConnection 2.设置请求方式,Content-Type和Content-Length XML文件的Content-Type为

随机推荐