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

1 综述

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

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

  • Android 项目:手机安全卫士(4)—— 自定义(组合)控件、属性
  • Android 项目:手机安全卫士(5)—— 自定义弹窗
  • Android 项目:手机安全卫士(6)—— 手机防盗设置向导
  • Android 项目:手机安全卫士(6)—— 手机防盗设置向导(二)
  • Android 项目:手机安全卫士(7)—— 手机防盗功能
  • Android 项目:手机安全卫士(8)—— 管理员权限

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

2 创建 Activity

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

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

归属地查询界面: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 8888address = "本地电话";break;default:// 010 8888 888// 0910 8888 8888if (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 数据库。

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

  • Android 项目:手机安全卫士(4)—— 自定义(组合)控件、属性
  • Android 项目:手机安全卫士(5)—— 自定义弹窗
  • Android 项目:手机安全卫士(6)—— 手机防盗设置向导
  • Android 项目:手机安全卫士(6)—— 手机防盗设置向导(二)
  • Android 项目:手机安全卫士(7)—— 手机防盗功能
  • Android 项目:手机安全卫士(8)—— 管理员权限

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

Android项目:手机安全卫士(9)—— 手机号码归属地查询相关推荐

  1. Android 简单几步实现手机号码归属地查询,可监听文本框的变化自动查询

    2019独角兽企业重金招聘Python工程师标准>>> 手机号码归属地查询需要用到一个数据库文件,我们可以用小米公司的数据库文件 第一步:数据库文件存储在 data/data/包名/ ...

  2. Android:实现简单的手机号码归属地查询功能

    最近学习Android访问网络资源的相关知识,然后实现了一个简单的手机号码归属地功能,特此记录一下. 一.主界面Activity实现 主界面的编写很简单,只是添加了一个EditText用于输入电话号码 ...

  3. 14.4 手机号码归属地查询

    手机号码归属地查询 MobileAddressQuery Android通过调用Webservice实现手机号码归属地查询 注:http://webservice.webxml.com.cn/WebS ...

  4. 基于Android的手机安全卫士的开发

    基于Android的手机安全卫士的开发 开发环境 处理器:Intel® Core™ i5-5200U CPU 2.20GHz 内存:4GB 硬盘:500GB 操作系统:Windows 7中文版,64位 ...

  5. 基于android平台的手机安全卫士的设计与实现 开题报告,开题报告-基于android的手机安全卫士的设计与开发.doc...

    毕业设计开题报告 题 目: 基于Android的手机安全卫士的设计与开发 专 业 计算机科学与技术 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 电气信息工程学院 专 业 负 责 人 ...

  6. Android中手机号码归属地查询实现

    这部分是昨天学习的,但是因为眼睛超负荷所以拖到现在,以后要合理规划时间. 目前手机里面的号码归属地查询主要是通过两种方式:1.联网查询,2.匹配本机归属地数据库. 我认为两种结合方式最好,在本地数据库 ...

  7. python手机版代码-Python手机号码归属地查询代码

    简单的一个例子,是以前用Dephi写的,前不久刚实现了一个在Python中使用Delphi控件来编写界面程序,于是趁热写一个类似的的查询方案. 本实例是通过www.ip138.com这个网站来查询的, ...

  8. Android 调用webservice(ksoap-2-Android)手机号码归属地查询

    之前做过一次但是隔了一个月再做就有点忘了,果然好记性不如烂笔头!还是打算记一下. 现在网络上的一些有关这方面的文章都比较久远了虽然方法没错但是之前的网址都变了所以需要进行一些修改. 记录时间2016/ ...

  9. php mysql 手机归属地_PHP手机号码归属地查询代码(API接口/mysql)_PHP教程

    文章来介绍一下关于手机号码归属地实现方法,我们可以利用api接口与mysql+php来实例有需要的同学看看. 首先我们介绍使用自己的数据库查询多个手机号码,那还是建议你拥有一个自己的的手机号码数据库. ...

  10. php mysql 手机归属地_PHP手机号码归属地查询代码(API接口/mysql)

    首先我们介绍使用自己的数据库查询多个手机号码,那还是建议你拥有一个自己的的手机号码数据库.正常情况下,只是满足一般查询的话,你不需要去购买专业版的手机号码数据库,增加无谓成本.我免费为你提供一个ACC ...

最新文章

  1. PyCharm安装mysqlclient一直提示MS Visual C++ 14 required
  2. python处理数据的优势-Python语言的七大优势
  3. 使用windbg排查一个内存溢出的问题
  4. live555 源码分析:基础设施
  5. 《誓鸟》是什么小说?
  6. mysql 开发基础系列22 SQL Model(带迁移事项)
  7. ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式
  8. 鸭子类型duck typing(动态)
  9. Python3安装cx_Oracle连接oracle数据库实操总结
  10. 接口测试-接口定义功能-前端-实现动态增删表单
  11. 2021华硕秋季新品发布会:每一幕,都精彩
  12. SATA学习笔记 14 ---SATA PM
  13. linux使用磁盘配额,linux磁盘配额使用
  14. U盘插入后只显示安全删除硬件问题
  15. 《Matrix Nets:A New Deep Architecture for Object Detection》论文笔记
  16. VR全景为家装赋能,沉浸式体验家装设计效果
  17. 使用fasttext实现文本处理及文本预测
  18. 计算机考研数学复试时间,数学专业考研准备多久
  19. java课程设计拼图_java拼图游戏课程设计报告
  20. 4级网络工程师真题第4套知识点

热门文章

  1. Java核心技术--数组拷贝
  2. SIP协议-05 SDP协议
  3. STC32G12K128内部集成的I2C总线实现oled12864显示
  4. python去噪函数_Python小波变换去噪
  5. 电信2月国内市场份额52.22% 环比上月下降0.61%
  6. [work] Softmax 函数的特点和作用
  7. 龙芯1b(LS1B200)使用LVGL7.0.1组件的滑杆控件控制三色RGB灯的亮度
  8. 0511 backlog
  9. AD21 铺铜间距规则
  10. 经验分享!移动端设计开发流程(附神器推荐)