Android实例-手机安全卫士(三十四)-优化归属地查询

一、目标

  1、处理110、10086、座机等非手机号码的归属地;

  2、在号码文本框中当输入规定的长度时开始自动查询

二、代码实现

  1、判断输入框中的文本是否符合手机号码的格式(1开头,第二位是345678,后面9位均为0-9的整数),根据手机号码的特点确定其正则表达式为“1[345678]\d{9}”,在代码中正则表达式以“^”开头,以“$”结束,同时里面的“\”需要转义,所以判断条件为“^1[345678]\\d{9}$”。上述正则表达式说明:[345678]表示“[]”里面的数任取一个,\d表示0-9的数任取一个,{9}表示前面的\d正好匹配9次。

  2、在号码归属地查询工具类(NumberAddQueryUtils)的查询号码queryNumber(String number)方法中,在查询数据库之前将传入的号码(number)通过其matches(String regularExpression)方法

判断一下是否匹配手机号码的正则表达式,如匹配则查询数据库,如不匹配则查询另外的数据库(如110、10086、座机等);

手机号码的正则表达式:

1 number.matches("^1[345678]\\d{9}$")
View Code

 

  3、通过传入的号码(number)的startsWith(String prefix)方法判断号码是否以“0”开头,若成立则截取号码前4位查询data2中的area获取归属地,再将归属地的后两位(电信、联通、移动)去除便可得到城市名,最后返回该值即可,另外需要处理010、021等3位数区号的特殊例子;

处理座机的代码:

 1 //处理座机
 2                 if(number.startsWith("010")){
 3                     location = "北京";
 4                 }else if (number.startsWith("021")) {
 5                     location = "上海";
 6                 }else if(number.startsWith("0")){
 7                     Cursor cursor = database.rawQuery(
 8                             "select location from data2 where area =  ?",
 9                             new String[] { number.substring(1, 4) });                     
10                     while (cursor.moveToNext()) {
11                         location = cursor.getString(0).substring(0, cursor.getString(0).length()-2);
12                     }
13                     cursor.close();
14                 }
View Code

   4、根据文本框内容自动开始查询

    (1)在号码归属地查询页面(NumberAddQueryActivity)中实例化号码输入框(number_query_phone)后,通过EditText对象的addTextChangedListener(TextWatcher watcher)方法为其增加文本改变的监听器,参数TextWatcher watcher为接口,因此通过new 实例化后还要实现其未实现的方法;

    (2)在实现TextWatcher对象中未实现的方法中,beforeTextChanged()文本变化之前回调的方法,onTextChanged()表示文本变化时回调的方法,afterTextChanged()表示文本变化之后回调的方法。因此,在文本变化时onTextChanged(CharSequence s, int start, int before,int count)方法中,根据文本(CharSequence s)的内容(不为空)和长度(大于2)执行数据库查询操作,并将返回值放入显示框;

onTextChanged()方法代码如下:

1 public void onTextChanged(CharSequence s, int start, int before,
2                     int count) {
3                 if(!TextUtils.isEmpty(s)&&s.length()>2){
4                     String location = NumberAddQueryUtils.queryNumber(s.toString());
5                     show_number_add.setText(location);
6                 }
7             }
View Code
posted @ 2015-04-16 11:34  红烧大白鲨  阅读(261)  评论(0编辑  收藏  举报