前言
最近老是被什么基金原油的电话骚扰,但是手机没显示归属地,搞得我有时以为是快递电话之类的就接了..然后各种烦..所以打算做一个来去电显示归属地的小软件,碰到某些城市的陌生号码就直接挂掉,既然要做就顺便写篇博客把,显示来去电归属地这个功能商业app用得不多,但是权当学习了。
实现原理
网上找一个有号码段的归属地数据库,然后开启个服务监听系统去电广播和来电,然后获取来去电号码,跟数据库的号码字段进行比对,然后显示在手机界面上。
实现步骤
下面一步步来完成这个功能:
主界面布局:
<?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">
<Button
android:id="@+id/btn_show_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示来去电归属地"
android:textSize="19sp" />
<Button
android:id="@+id/btn_noshow_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不显示来去电归属地"
android:textSize="19sp" />
</LinearLayout>
这个布局是自己为了自己设置是否显示归属地的。
在main下面新建一个assets文件夹,并把网上找到的数据库拷贝到该文件夹下面
接下来分析数据库表:
我下的数据库里面有两个表,表结构如下:
data1:
data2:
其中data1的id就是电话号码,前七位就可以确定归属地了,然后根据id对应的outkey去匹配data2的id就可以得到归属地信息了。知道了两个表之间的联系之后就可以开始我们的查询工作了。
新建一个CallAddressDao类,这个类是用来访问数据库的
public class CallAddressDao {
//数据库路径
private static final String PATH = "data/data/com.sjr.calladdress/files/address.db";
/**
* 从数据库中获取手机归属地
* @param number
* @return 手机归属地
*/
public static String getCallAddress(String number){
String callAddress = "未知号码";
//获取数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null,
SQLiteDatabase.OPEN_READONLY);
//正则表达式匹配
if (number.matches("^1[3-8]\\d{9}$")) {//匹配器11位手机号
Cursor cursor = database.rawQuery("select location from data2 where id=(select outkey from data1 where id=?)",
new String[]{number.substring(0, 7)});//截取前七个
if (cursor.moveToNext())
callAddress = cursor.getString(0);
cursor.close();
}else if (number.matches("^\\d+$")){//匹配数字
switch (number.length()){
case 3:
callAddress = "报警电话";//三位数就是报警电话
break;
case 4:
callAddress = "模拟器";
break;
case 5:
callAddress = "客服电话";
break;
case 7:
case 8:
callAddress = "本地电话";
break;