2016-07-22 12:55:59 qq_34057100 阅读数 384
  • C++ 编写WebService服务实战

          在目前的开发过程以Webserice形式提供了很多类型的接口,例如获取网络时间、获取天气、获取手机归属地等等,可见webservice应用已经非常广泛,特别是在网络发展飞速的今天,它是一个跨平台的、可扩展的RPC应用,所以学习它非常实用,当你就需要将服务其功能转为webservice接口对接其他系统或平台,这时你就会用到这方面的技术,本课程主要包括 Webserice介绍,开发流程介绍,GSoap工具的使用,服务端实现、客户端实现,以WDSL方式实现天气查询实例讲解等。

    23 人正在学习 去看看 代轩
来电归宿地查询有两种查询方式:
1、网络平台查询;
2、数据库查询;

这是使用数据库查询的方式,实现步骤如下:
1、 在Eclispase的android工程中把要发布的数据库放在assets目录下面;
2、在展示应用的引导页面(也就是展示广告或者公司logo的页面)把数据库拷贝到”data/data/应用名称/files/数据库名称”路径下,在实现数据库拷贝的代码中有判断数据库是否存在的逻辑(当用户第一次安装应用时数据库就拷贝了,当用户又一次打开应用时无需再拷贝,这样可以节省应用的性能)。拷贝数据库的工具类如下:
<textarea readonly="readonly" name="code" class="java"> 
package gif.phone.zzy.com.comphonesafe.com.mobliesafe.activity.databaseutils;

import android.content.Context;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import gif.phone.zzy.com.comphonesafe.R;
import gif.phone.zzy.com.comphonesafe.com.mobliesafe.activity.util.ToastUtils;

/**
 * 拷贝assets文件夹下的数据库到  data/data/应用包名/files文件夹
 */
public class DatabaseUtils {
    public static void copyDataBase(Context context,String dataBaseName){
        File desFile=new File(context.getFilesDir(),dataBaseName);

        //判断数据库是否存在,如果存在就不在往desFile中拷贝数据库
        if (desFile.exists()){
            return;
        }

        FileOutputStream fos=null;
        InputStream inputStream=null;
       //context.getResources().openRawResource(R.raw.address);
        try {
             inputStream = context.getAssets().open(dataBaseName);
             fos=new FileOutputStream(desFile);
            byte[] bytes=new byte[1024];
            int lenth=0;
            while ((lenth=inputStream.read(bytes))!=-1){
                fos.write(bytes,0,bytes.length);
                fos.flush();
            }

        } catch (IOException e) {
            ToastUtils.showToast(context,"assets目录下的数据库不存在");
        }finally {
            if (inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if (fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
</textarea>
<div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.71429; font-size: 14px;"><span style="font-family: 'Helvetica Neue'; color: rgb(51, 51, 51);"> 3、实现归属地查询的工具类 </span></div> <pre name="code" class="java">  <textarea readonly="readonly" name="code" class="java> 
package gif.phone.zzy.com.comphonesafe.com.mobliesafe.activity.databaseutils;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;

import java.io.File;

import gif.phone.zzy.com.comphonesafe.com.mobliesafe.activity.util.LogUtils;

/**
 * 查询归属地工具类
 */
public class AddressQuery  {
    private static  String dataBaseNameFilepath;
    public static String getAdress(Context context,String number){
        String address="未知号码";
        dataBaseNameFilepath= context.getFilesDir()+ File.separator+"address.db";
        //获取数据库
        SQLiteDatabase database=SQLiteDatabase.openDatabase(dataBaseNameFilepath,null,SQLiteDatabase.OPEN_READONLY);
        //开始查询

        //正则表达式匹配电话号码
        if (number.matches("^1[3-8]\\d{9}$")){//匹配电话号码
            Cursor cursor = database.rawQuery("select location from data2 where id  =(select outkey from data1 where id=?)",
                    new String[]{number.substring(0, 7)});//查电话号码只需要前七位即可
            if (cursor!=null){
                if (cursor.moveToNext()){
                    address=cursor.getString(0);
                }
            }
            cursor.close();
        }else if (number.matches("^\\d+$")){//匹配数字
            switch (number.length()){
                case 3:
                    if (number.equals("110")){
                        address="报警电话";
                    }else if (number.equals("120")){
                        address="急救电话";
                    }
                    break;
                case 4:
                    address="android模拟器电话";
                    break;
                case 5:
                    address="客服电话";
                    break;
                case 7:
                case 8:
                    address="本地电话";
                    break;
                default:
                if (number.startsWith("0") && number.length()>10){//判断长途或者本地座机
                    LogUtils.showLog("判断长途或者本地座机");
                    Cursor cursor = database.rawQuery("select location from data2 where area=?",
                            new String[]{number.substring(1, 4)});//截取区号的后三位   如贵阳区号0851
                    if (cursor.moveToNext()){
                        address = cursor.getString(0);
                    }else {
                        cursor.close();
                        cursor = database.rawQuery("select location from data2 where area=?",
                                new String[]{number.substring(1, 3)});//截取区号的后两位,如北京区号010
                        if (cursor.moveToNext()){
                            address=cursor.getString(0);
                            cursor.close();
                        }
                    }
                }
                    break;
            }
        }

        database.close();
        return address;
    }
}
</textarea>




2016-03-10 13:51:22 xwdoor 阅读数 1587
  • C++ 编写WebService服务实战

          在目前的开发过程以Webserice形式提供了很多类型的接口,例如获取网络时间、获取天气、获取手机归属地等等,可见webservice应用已经非常广泛,特别是在网络发展飞速的今天,它是一个跨平台的、可扩展的RPC应用,所以学习它非常实用,当你就需要将服务其功能转为webservice接口对接其他系统或平台,这时你就会用到这方面的技术,本课程主要包括 Webserice介绍,开发流程介绍,GSoap工具的使用,服务端实现、客户端实现,以WDSL方式实现天气查询实例讲解等。

    23 人正在学习 去看看 代轩

Android项目:手机安全卫士(9)—— 电话号码归属地查询

1 综述

手机防盗功能已经开发完了,接下来开发一个高级工具功能,就是手机归属地查询,严格来讲,是查询手机号码的归属地。不过,由于用的号码数据库不是最新的,好多新号码段都没有,所以不能查,如果有必要,可以换成最新的数据库,某宝上有,你懂的。数据库文件保存在项目的 assets 文件夹中。

关于项目相关文章,请访问:

项目源码地址(实时更新):https://github.com/xwdoor/MobileSafe

2 创建 Activity

每个功能需求都会在应用中提供进入接口,我们的项目的进入接口是:主界面->高级工具->电话归属地查询。所以需要创建两个 Activity,一个是高级工具界面:ToolsActivity,另一个是电话归属地查询界面:AddressQueryActivity。两个 Activity 的界面很简单,这里就不放代码了,给出效果图就行了,具体实现可以下载项目源码。

高级工具界面:ToolsActivity 效果图:

高级工具界面:ToolsActivity 效果图

归属地查询界面:AddressQueryActivity 效果图:

归属地查询界面:AddressQueryActivity 效果图

3 拷贝数据库

由于 SQLiteDatabase 直接收 /data/data 目录下的数据库文件,所以我们要将项目中 assets 目录的数据库文件 address.db 文件复制到 data 目录下,代码如下:


    /**
     * 拷贝数据库
     * @param dbName 数据库文件名
     */
    private void copyDb(String dbName) {
        AssetManager assets = getAssets();
        File filesDir = getFilesDir();//获取项目路径(/data/data/net.xwdoor.mobilesafe/files)
        File desFile = new File(filesDir, dbName);

        if(desFile.exists()){
            showLog("","数据库已存在");
            return;
        }
        InputStream in = null;
        FileOutputStream out = null;
        try {
            //另一种获取数据库文件方式
            //in=context.getClass().getClassLoader().getResourceAsStream("assets/"+names[i]);
            in = assets.open(dbName);// 打开assets目录的文件
            out = new FileOutputStream(desFile);
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
                out.flush();
            }
        } catch (IOException e) {
            showLog("copyDb error",e.getMessage());
        } finally {
            try {
                in.close();
                out.close();
            } catch (IOException e) {
                showLog("copyDb io error",e.getMessage());
            }
        }
    }

拷贝数据库的操作我们放到闪屏界面去完成,这也是闪屏界面的最大作用之一了。

4 号码归属地查询

先说一下我们的查询策略:

  • 若是手机号,则根据手机号前 7 位,查到对应的区域
  • 若号码长度长于 8 位,优先考虑 4 位区号,则去掉前面的零,然后根据区号查询对应的区域
  • 若根据 4 位区号没有查询结果,则作为 3 位区号进行查询,同样去掉前面的零
  • 若号码长度为 3位 或 4 位,则同一显示为报警号码
  • 若以上都不是,则显示未知号码

根据以上的查询策略,可以写出我们的查询代码了:


    /**
     * 电话归属地查询
     *
     * @param context
     * @param number 电话号码
     */
    public static String getAddress(Context context, String number) {
        String address = "未知号码";
        String path = new File(context.getFilesDir(), DB_NAME).getAbsolutePath();
        SQLiteDatabase database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);

        // 判断是否是手机号码
        // 1[3-8]+9数字
        // 正则表达式
        // ^1[3-8]\d{9}$
        if (number.matches("^1[3-8]\\d{9}$")) {// 匹配是否是手机号码
            Cursor cursor = database.rawQuery("select location from data2 where id=(select outkey from data1 where id=?)",
                    new String[]{number.substring(0, 7)});

            if (cursor.moveToFirst()) {
                address = cursor.getString(0);
            }

            cursor.close();
        }else {
            switch (number.length()){
                case 3:
                    address = "报警电话";
                    break;
                case 4:
                    address = "模拟器";
                    break;
                case 5:
                    address = "客服电话";
                    break;
                case 7:
                case 8:
                    // 8888 8888
                    address = "本地电话";
                    break;
                default:
                    // 010 8888 888
                    // 0910 8888 8888
                    if (number.startsWith("0") && number.length() >= 10
                            && number.length() <= 12) {
                        // 有可能是长途电话
                        // 区号是4位的情况
                        Cursor cursor = database.rawQuery(
                                "select location from data2 where area=?",
                                new String[] { number.substring(1, 4) });
                        if (cursor.moveToFirst()) {// 查到4位区号
                            address = cursor.getString(0);
                        }

                        cursor.close();

                        // 区号是3位的情况
                        if ("未知号码".equals(address)) {// 4位区号没有查到,开始查3位
                            cursor = database.rawQuery(
                                    "select location from data2 where area=?",
                                    new String[] { number.substring(1, 3) });
                            if (cursor.moveToFirst()) {// 查到3位区号
                                address = cursor.getString(0);
                            }

                            cursor.close();
                        }
                    }
                    break;
            }
        }
        return address;
    }

匹配手机号的时候用到了正则表达式,能简单的使用就可以了,^1[3-8]\d{9}$ 的意思是:以数字 1 开始,第二位是 3 到 8 之间的数字(包含 3 和 8),然后是 9 位数字。SQLiteDatabase 对象有两个方法,分别是 rawQuery() 和 query(),他们的区别是,前者是根据自定义 SQL 语句进行查询,后者提供参数,自动构建 SQL 语句。

查询结果如下:

号码归属地查询结果

5 总结

原来,如果有现成的数据库文件,直接使用 SQLiteDatabase.openDatabase() 方法就能够操作,前提是 SQLite 数据库。

关于项目相关文章,请访问:

项目源码地址(实时更新):https://github.com/xwdoor/MobileSafe

2017-02-09 19:17:41 qq_26309061 阅读数 151
  • C++ 编写WebService服务实战

          在目前的开发过程以Webserice形式提供了很多类型的接口,例如获取网络时间、获取天气、获取手机归属地等等,可见webservice应用已经非常广泛,特别是在网络发展飞速的今天,它是一个跨平台的、可扩展的RPC应用,所以学习它非常实用,当你就需要将服务其功能转为webservice接口对接其他系统或平台,这时你就会用到这方面的技术,本课程主要包括 Webserice介绍,开发流程介绍,GSoap工具的使用,服务端实现、客户端实现,以WDSL方式实现天气查询实例讲解等。

    23 人正在学习 去看看 代轩

最近做了一个关于电话归宿地和IP归属地查询的小应用,记录分享一下主要的过程。

1、简介

数据来源是使用的聚合数据的免费api接口。

2、整体外层结构

由上可知整体功能为IP查询和电话归宿地查询,外层结构由底部的导航栏,主体部分是利用Viewpager来装载了两个Fragment。然后整体使用了模仿沉浸式效果   

1)MainActivity

沉浸式设置代码:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT>=21){            //只有5.0及以上系统才支持,因此这里先进行了一层if判断
            View decorView=getWindow().getDecorView();
            int option= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE //注意两个Flag必须要结合在一起使用,表示会让应用的主体内容占用系统状态栏的空间
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;//表示会让应用的主体内容占用系统导航栏的空间
            decorView.setSystemUiVisibility(option);//设置
            getWindow().setStatusBarColor(Color.TRANSPARENT);//设置状态栏透明

            fragmentAdapter=new FragmentAdapter(getSupportFragmentManager());
            bindView();
        }

    }
底部导航栏是用一个RadioGroup装载两个RadioButton:
@Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId){
            case R.id.rb_phone:
                mViewPager.setCurrentItem(PAGE_ONE);
                break;
            case R.id.rb_ip:
                mViewPager.setCurrentItem(PAGE_TWO);
                break;
        }
    }
然后为Viewpager设置当前页面:
    private ViewPager mViewPager;
    //几个代表页面的静态常量
    public static final int PAGE_ONE=0;
    public static final int PAGE_TWO=1;
    private FragmentAdapter fragmentAdapter;
@Override
    public void onPageScrollStateChanged(int state) {
        //state的状态有三个,0表示什么都没做,1正在滑动,2滑动完毕
        if (state==2){
            switch (mViewPager.getCurrentItem()){
                case PAGE_ONE:
                    rb_phone.setChecked(true);
                    break;
                case PAGE_TWO:
                    rb_ip.setChecked(true);
                    break;
            }
        }
    }

2)FragmentAdapter

public class FragmentAdapter extends FragmentPagerAdapter {
    private  FragmentPhone fgPhone;
    private FragmentIp fgIp;

    //定义页面的静态常量

    private  static  final  int  PAGE_ONE=0;
    private  static  final  int  PAGE_TWO=1;

    private final  static  int FragmentCount=2;

    public FragmentAdapter(FragmentManager fm) {
        super(fm);
        fgPhone=new FragmentPhone();
        fgIp=new FragmentIp();
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment=null;
        switch (position){
            case PAGE_ONE:
                fragment=fgPhone;
                break;
            case PAGE_TWO:
                fragment=fgIp;
                break;
        }
        return fragment;
    }

    @Override
    public int getCount() {
        return FragmentCount;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        System.out.println("position Destory" + position);
        super.destroyItem(container, position, object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        return super.instantiateItem(container, position);
    }
}

3、具体查询Fragment代码

因为两个查询的相差不大,这里就选取查询电话归属地。
网络数据请求我这里引用了xUtils框架,为了学习新知识又用了okhttp来实现。之后还想用retrofit来实现一下。
这里主要分析使用okhttp时候遇到的代码和问题。
注意使用okhttp的I/O操作是基于Okio的,还有就是在使用网路请求操作时不能在主线程做耗时操作,okhttp提供了异步请求方法,但是在使用了该方法的时候如果需要做UI更新操作一定要切换到主线程中进行。这里贴出主要的请求方法:

private  void  QueryP(String phone) throws  Exception{
        String url="http://apis.juhe.cn/mobile/get?phone="+phone+"&key=ea4ad65571faff477a1a7c66b9a58f42";
        Request request=new Request.Builder()
                .url(url)
                .build();

         client.newCall(request).enqueue(new Callback() {
             @Override
             public void onFailure(Call call, IOException e) {
                 e.printStackTrace();
             }

             @Override
             public void onResponse(Call call, Response response) throws IOException {
                 if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
                 /*
                  * 填坑=.=    我们在调试的时候喜欢Log一下看看数据正不正常,我在使用HttpURLConnection
                  * 或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析,
                  * 没有出现这样的问题;但是在使用OKhttp时就不正常了,因为调用了一次response.body().string(),那么这个流就已经被关闭了*/
                 String responseInfo=response.body().string();
                 Log.i(TAG, "onResponse:Okhttp return result= "+responseInfo);
                 try {
                     JSONObject all=new JSONObject(responseInfo);
                     Log.i(TAG, "onResponse: all="+all);
                     final String message=all.getString("reason");
                     getActivity().runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
                             Toast.makeText(getActivity(), message,
                                     Toast.LENGTH_LONG).show();
                         }
                     });
                     String result=all.getString("result");
                     Log.i(TAG, "onSuccess: Phoneresult="+result);
                     JSONObject jsonObject=new JSONObject(result);
                     final String province=jsonObject.optString("province");
                     final String city=jsonObject.optString("city");
                     final String areacode=jsonObject.optString("areacode");
                     final String zip=jsonObject.optString("zip");
                     final String company=jsonObject.optString("company");
                     final String card=jsonObject.optString("card");
                     //使用okhttp异步请求方法更改UI时必须切换到主线程
                     getActivity().runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
                             text_province.setText(province);
                             text_city.setText(city);
                             text_areacode.setText(areacode);
                             text_zip.setText(zip);
                             text_company.setText(company);
                             text_card.setText(card);
                             text_phone.setText(edit_Search_Phone.getText());
                         }
                     });

                 } catch (JSONException e) {
                     e.printStackTrace();
                 }
             }
         });
    }
布局和其他代码如果有想看的,可以移步这里,欢迎提出我的不足一起学习。

2016-07-19 15:49:22 w77996 阅读数 2010
  • C++ 编写WebService服务实战

          在目前的开发过程以Webserice形式提供了很多类型的接口,例如获取网络时间、获取天气、获取手机归属地等等,可见webservice应用已经非常广泛,特别是在网络发展飞速的今天,它是一个跨平台的、可扩展的RPC应用,所以学习它非常实用,当你就需要将服务其功能转为webservice接口对接其他系统或平台,这时你就会用到这方面的技术,本课程主要包括 Webserice介绍,开发流程介绍,GSoap工具的使用,服务端实现、客户端实现,以WDSL方式实现天气查询实例讲解等。

    23 人正在学习 去看看 代轩

安卓的基础知识学了一个多月后一直觉得遇到了瓶颈,想写几个APP来证明一下自己,不过后面还是发现自己太年轻了,毕竟技术的路还是很长的,看到这篇博客的朋友希望能从中学到一些东西,这样这篇博客就没有白费。

除了号码归属地,苹果序列号,身份证号码查询,邮编,快递查询都可以借鉴。不过有些API申请是需要费用的。但是刚开始申请会免费赠送你几次查询。

工具:

Android studio

建议使用Android studio

准备工作:

去聚合数据申请一个号码归属地查询的API,网址:https://www.juhe.cn/(申请过程百度上都有)


具体实现:

这是个典型的客户端请求服务器数据,服务器返回json数据给客户端,然后再经由客户端对json格式的数据进行解析的例子。

JSON返回示例:

{
"resultcode":"200",
"reason":"Return Successd!",
"result":{
    "province":"浙江",
    "city":"杭州",
    "areacode":"0571",
    "zip":"310000",
    "company":"中国移动",
    "card":"移动动感地带卡"
}
}
这个json比较简单,直接用JSONobject进行解析获取数据即可。
界面代码如下:
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.administrator.num_find.MainActivity">

    <EditText
        android:layout_marginTop="20dp"
        android:id="@+id/editText"
        android:text="请输入号码"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/button"
        android:text="查询"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_below="@id/editText"
        />
    <LinearLayout
        android:id="@+id/line"
        android:layout_below="@id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="移动号码归属地支持号段:\n
134 135 136 137 138 139 150 151 152 157 158 159 182 183 187 188 147\n
联通号码归属地支持号段:\n
130 131 132 155 156 186 145\n
电信号码归属地支持号段:\n
133 153 189 180\n
移动运营商:\n
170\n"
            />
    </LinearLayout>

<RelativeLayout
    android:id="@+id/lineR"
    android:layout_below="@id/line"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="50dp">
        <TextView
        android:id="@+id/provinceCity"
            android:layout_marginLeft="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
        <RelativeLayout
            android:layout_below="@id/lineR"

            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/relativeLayout"></RelativeLayout>

    <TextView
        android:id="@+id/zip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_alignTop="@+id/lineR"
        android:layout_toRightOf="@+id/button"
        android:layout_toEndOf="@+id/button" />

    <TextView
        android:id="@+id/citycode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_alignTop="@+id/lineR"
        android:layout_toLeftOf="@+id/button"
        android:layout_toStartOf="@+id/button" />

    <TextView
        android:id="@+id/card"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/relativeLayout"
        android:layout_alignLeft="@+id/zip"
        android:layout_alignStart="@+id/zip" />

    <TextView
        android:id="@+id/company"

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/relativeLayout"
        android:layout_toRightOf="@+id/lineR"
        android:layout_toEndOf="@+id/lineR" />
</RelativeLayout>
本人UI不大好,界面有点丑,可以后期优化

在点击查询按钮后向服务器发出请求,此处开了个线程。有安卓基础的你懂的,因为要将数据显示到UI上。
接收数据后对得到的json进行解析,然后显示到界面上,这个程序就完成了。
代码:
package com.example.administrator.num_find;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends Activity {
    private Button button;
    private EditText editText;
    private String NumString;

    private String address = null;
    private String response = null;

    private TextView provinceCity;
    private TextView cityCode;
    private TextView zip1;
    private TextView card1;
    private  TextView company1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        editText = (EditText) findViewById(R.id.editText);
        provinceCity = (TextView)findViewById(R.id.provinceCity) ;
        cityCode = (TextView)findViewById(R.id.citycode);
        zip1 = (TextView)findViewById(R.id.zip);
        card1 = (TextView)findViewById(R.id.card);
        company1= (TextView)findViewById(R.id.company);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        HttpURLConnection connection = null;
                        NumString = editText.getText().toString();
                        if (NumString == null) {

                            return;
                        }
                        address = "http://apis.juhe.cn/mobile/get?phone=" + NumString + "&key=你申请的api key";
                        System.out.println("NUM" + NumString);
                        System.out.println("addr" + address);
                        InputStream inputStream = null;
                        try {
                            URL url = new URL(address);
                            connection = (HttpURLConnection) url.openConnection();
                            connection.setRequestMethod("GET");
                            connection.setReadTimeout(8000);
                            connection.setConnectTimeout(8000);
                            inputStream = connection.getInputStream();
                            if (inputStream == null)
                                System.out.println("in null");
                            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                            StringBuilder builder = new StringBuilder();
                            String line;
                            while ((line = reader.readLine()) != null) {
                                builder.append(line);
                            }
                            if (builder!=null){
                                response = builder.toString();
                            }
                            System.out.println(builder);
                            Json(response);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }
        });
    }
    private void Json(final String response) {

        try {

            runOnUiThread(new Runnable() {
                JSONObject jsonobject = new JSONObject(response);
                JSONObject result = jsonobject.getJSONObject("result");
               // System.out.println("result"+result);
                String prvoince = result.getString("province");
               // System.out.println("result"+prvoince);
                String city = result.getString("city");
                String areacode = result.getString("areacode");
                String zip = result.getString("zip");
                String company = result.getString("company");
                String card = result.getString("card");
                @Override
                public void run() {
                    provinceCity.setText(prvoince);
                    cityCode.setText(areacode);
                    zip1.setText(zip);
                    company1.setText(company);
                    card1.setText(card);
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

}

bug还有很多,例如没有对号码进行判断,可用正则表达式对后期进行优化。

2018-02-27 17:11:32 manREDoo 阅读数 571
  • C++ 编写WebService服务实战

          在目前的开发过程以Webserice形式提供了很多类型的接口,例如获取网络时间、获取天气、获取手机归属地等等,可见webservice应用已经非常广泛,特别是在网络发展飞速的今天,它是一个跨平台的、可扩展的RPC应用,所以学习它非常实用,当你就需要将服务其功能转为webservice接口对接其他系统或平台,这时你就会用到这方面的技术,本课程主要包括 Webserice介绍,开发流程介绍,GSoap工具的使用,服务端实现、客户端实现,以WDSL方式实现天气查询实例讲解等。

    23 人正在学习 去看看 代轩

需要查询手机号的API:https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=18888888888

导入okhttp.jar和okio.jar用于网络查询。

新建一个电话的model: 

package zhku.edu.searchphone.model;

/**
 * Created by manRED on 2018/2/21.
 */

public class Phone {
    private String telString;
    private String province;
    private String catName;
    private String carrier;

    public String getTelString() {
        return telString;
    }

    public void setTelString(String telString) {
        this.telString = telString;
    }

    public String getProvince() {
        return province;
    }

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

    public String getCatName() {
        return catName;
    }

    public void setCatName(String catName) {
        this.catName = catName;
    }

    public String getCarrier() {
        return carrier;
    }

    public void setCarrier(String carrier) {
        this.carrier = carrier;
    }
}

创建一个查询号码的类:

package zhku.edu.searchphone;
import org.json.JSONException;
import java.util.concurrent.Callable;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import zhku.edu.searchphone.model.Phone;

/**
 * Created by manRED on 2018/2/27.
 */

public class HandePhone implements Callable<Phone> {
    private Phone phone;
    private String url;
    public HandePhone(String url){
        this.url=url;
    }
    @Override
    public Phone call() throws Exception {
        System.out.println(url);
        OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
        Request request = new Request.Builder()
                .url(url)//请求接口。如果需要传参拼接到接口后面。
                .build();//创建Request 对象
        Response response = null;
        response = client.newCall(request).execute();//得到Response 对象
        if (response.isSuccessful()) {
            String json=response.body().string();
            System.out.println(json);
            phone=parseModelWithOrgJson(json);
        }
        return phone;
    }
    private Phone parseModelWithOrgJson(String json){
        int index=json.indexOf("{");
        json=json.substring(index,json.length());
        Phone phone=new Phone();
        try {
            org.json.JSONObject jsonObject=new org.json.JSONObject(json);
            String value=jsonObject.getString("telString");
            phone.setTelString(value);

            value=jsonObject.getString("province");
            phone.setProvince(value);

            value=jsonObject.getString("catName");
            phone.setCatName(value);

            value=jsonObject.getString("carrier");
            phone.setCarrier(value);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return phone;
    }
}

主程序中调用:使用java的线程池获取返回的数据。

        HandePhone handePhone=new HandePhone(url);
        ExecutorService service= Executors.newFixedThreadPool(1);
        Future<Phone> future=service.submit(handePhone);
        Phone phone= null;
        try {
            phone = future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }


电话号码归属查询

阅读数 921

没有更多推荐了,返回首页