Android显示来去电归属地

本文介绍了如何在Android中实现来电和去电时显示归属地信息。通过继承PhoneStateListener并监听通话状态,结合权限管理,在通话窗口展示自定义的归属地View。详细讲述了服务初始化、权限设置、归属地信息的显示以及移动视图的处理,并提供了MainActivity启动服务的示例代码。
摘要由CSDN通过智能技术生成

前言

最近老是被什么基金原油的电话骚扰,但是手机没显示归属地,搞得我有时以为是快递电话之类的就接了..然后各种烦..所以打算做一个来去电显示归属地的小软件,碰到某些城市的陌生号码就直接挂掉,既然要做就顺便写篇博客把,显示来去电归属地这个功能商业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;
               
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值