黑名单来电管理属于手机里比较常用的功能,今天就来简单介绍下Android上对于黑名单来电比较常见的一些处理方式。首先我们知道Android挂断电话的API是不对外开放的,对于普通的三方应用,要想进行挂断电话操作,需要使用反射来获取通话相关服务TELEPHONY_SERVICE ,然后通过AIDL与telephony建立通信。建立通信之后我们需要通过为TelephonyManager添加PhoneStateListener监听器来监听通话状态。由于TelephonyManager只提供了CALL_STATE_IDLE(闲置),CALL_STATE_RINGING(响铃),CALL_STATE_OFFHOOK(已接通)这三种通话状态,因此我们只能在监听到响铃状态时去调用ITelephony对象的endCall方法,这样就会出现来电先响铃再挂断的现象,因此这种处理方式虽然简单但也会带来不好的用户体验。

    对于系统通话应用,我们可以不用考虑上述问题,接下来就说说在系统通话和联系人应用里的对于黑名单来电的管理。通常在通话记录列表或者通话记录详情界面会提供添加黑名单入口。为了方便管理,我们需要创建一个数据库用于来电黑名单管理。我们建立一个数据库辅助类用于管理数据库,数据库名称为blocklist.db,创建一个blocklist表,用于管理黑名单,创建一个call_log表,用于管理黑名单通话记录。
public class BlocklistDbHelper extends SQLiteOpenHelper {    private final static String TAG = "BlocklistDbHelper";public static final String DATABASE_NAME = "blocklist.db";public static final int DATABASE_VERSION = 1;public BlocklistDbHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }    @Override
    public void onCreate(SQLiteDatabase db) {    createBlocklistNumberTables(db);
        createBlocklistCallLogTables(db);
        ......}
    private void createBlocklistNumberTables(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS blocklist (_id INTEGER PRIMARY KEY, number TEXT)");}
    在成功建立了数据库之后,我们还需要一个内容提供者ContentProvider,为外界对数据库进行增删改查操作提供相关API。
    public final static String AUTHORITY = "com.android.blocklist";    private static final UriMatcher PMATCHER = new UriMatcher(UriMatcher.NO_MATCH);    static {PMATCHER.addURI(AUTHORITY, "number", URI_BLOCKLIST);
    在AndroidManafiest里添加相关声明。
    <provider
    android:name="com.android.contacts.blocklist.data.BlocklistProvider"
    android:authorities="com.amigo.blocklist"
    android:exported="true" />
提供insert方法
@Override
public Uri insert(Uri uri, ContentValues values) {Cursor c = null;long pid = 0;SQLiteDatabase db = mDbHelper.getWritableDatabase();switch (PMATCHER.match(uri)) {case URI_BLOCKLIST:c = db.query("blocklist", null, number + " = ?",new String[] {String.valueOf(values.get("number"))}, null, null, null);try {if (c != null && c.getCount() == 0) {pid = db.insert(blocklist, null, values);}} catch (Exception e) {} finally {if ((null != c) && !(c.isClosed())) {c.close();}}return ContentUris.withAppendedId(uri, pid);
    好了,下面我们就可以往数据库里添加黑名单了,方式也很简单  
    Uri uri = Uri.parse("content://" + BlocklistProvider.AUTHORITY + "/number");ContentValues insertValues = new ContentValues(1);insertValues.put("number", number);context.getContentResolver().insert(uri, insertValues);
    现在我们已经成功往数据库里添加了黑名单,接下来如果黑名单数据库里的号码在来电我们就要对它进行拦截。
    上面提到了在响铃时对通话进行拦截效果不好,那么该在什么地方拦截它呢。要知道在哪里那么就必须对Android来电流程有一定了解。Android的整个来电流程比较复杂,对于应用层来说,最早接收到framework分发的call消息的在Telecomn的CallsManager处理,在这里会对所注册的一系列通话状态进行处理,来电所对应的回调方法是onSuccessfulIncomingCall,那么在这里处理是最为及时的。
@Override
public void onSuccessfulIncomingCall(Call incomingCall) {Log.d(this, "onSuccessfulIncomingCall");setCallState(incomingCall, CallState.RINGING, "successful incoming call");
    final String phoneNumber = getLogNumber(incomingCall);
    //判断来电号码是否是黑名单boolean isBlockNumber = mBlockListUtils.shouldBlockNumber(phoneNumber);
    if (isBlockNumber) {
        //在这里拦截它
        incomingCall.reject(false, null);mCallLogManager.logCall(incomingCall, Calls.INCOMING_TYPE); 
        //同时往黑名单数据库里新增一条包含号码和来电时间的记录mBlockListUtils.addRejectCallLog(phoneNumber, incomingCall.getCreationTimeMillis());
    } 
    ......
}
public void addRejectCallLog(String number, long date) {
  这样我们就成功完成了对黑名单来电的拦截,同时也把该条通话记录成功加入到了黑名单数据库的通话记录列表。接下来当用户查看通话记录时,我们需要显示那些是被成功拦截的通话记录,这里我们可以根据通话记录的时间与黑名单数据库里通话记录表里的时间去进行匹配,如果匹配成功则为拦截的通话记录。
  至此对于黑名单的来电处理就介绍完毕了,实际开发中会对上面的功能进行扩展,原理大同小异,博主还要看会欧洲杯,因此就不在这里一一叙述了

    Uri uri = Uri.parse("content://" + AUTHORITY + "/call-log");ContentValues insertValues = new ContentValues(2);insertValues.put(“number”, number);insertValues.put("date", date);context.getContentResolver().insert(uri, insertValues);
}
       PMATCHER.addURI(AUTHORITY, "call-log", URI_BLOCKLIST_CALL_LOG);
        ......    }
public class BlocklistProvider extends ContentProvider {private final static String TAG = "BlocklistProvider";private BlocklistDbHelper mDbHelper;private final static int URI_BLOCKLIST = 1;   
    ......    
    private final static int URI_BLOCKLIST_CALL_LOG = 2;
    private void createBlocklistCallLogTables(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS call_log (_ID INTEGER PRIMARY KEY,date INTEGER, number TEXT)");}

Android黑名单来电管理相关推荐

  1. Android系统如何管理自己内存的?

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 机缘巧合写下这篇博客,作为个人工作经验的总结,不足之处,随后补上. 安卓是基于Linux2.6内核的 ...

  2. 巧妙设置Android来方便管理Linux和Windows

    前几天晚上睡觉前没事,想了想如何实现用Android手机来管理Linux和Windows,比如连接到Linux的SSH(Secured Shell)和连接到Windows的cmd(直接访问PowerS ...

  3. Android之内存管理-内存监测-内存优化

    推荐文章:Android进程与内存及内存泄漏 Android之内存管理 1.1 Dalvik Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础.其指令集基于寄存 ...

  4. Android关掉多个activity,Android应用开发之Android Activity栈管理 制定关闭某一个Activity,关闭所有Activit...

    本文将带你了解Android应用开发之Android Activity栈管理  制定关闭某一个Activity,关闭所有Activit,希望本文对大家学Android有所帮助. 系统Api :打开新的 ...

  5. android media_rw sdcard_rw,大约Android 了解权限管理

    如Android应用程序开发人员.为android权限机制一直觉得很奇怪.为什么要这个东西权限?为什么要AndroidManifest里面写的uses-permission 这样的事情?我一直搞不清楚 ...

  6. Android 核心分析之十二Android GEWS窗口管理之基本架构原理

    Android GWES之窗口管理之基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Window的To ...

  7. 布局管理器android,Android课程---布局管理器之相对布局(一)

    下面示例的是在父容器里如何设置按钮的位置,难度:***,重点是找到一个主按钮,设置它的id,然后根据它来设置其他按钮在父容器的位置. 代码示例: android:layout_width=" ...

  8. 深入浅出 - Android系统移植与平台开发(十三)- Android的对象管理

    第六章.Android的对象管理 在Java中,不再使用的对象会通过gc机制来自己主动回收.而Android系统执行时库层代码是由C++编写的,在C++中创建的对象通常使用指针来操作,一旦使用不当.轻 ...

  9. Android 号码, 来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇

    1.效果图 左边的是应用程序界面,只是做个测试.右边的是应用程序信息,你会发现数据这块很小,只有420KB,要知道里面有近280,000记录. 2.尝试使用sqlite数据库, 用db格式文件. 随便 ...

最新文章

  1. Java23种设计模式学习笔记【目录总贴】
  2. python毕业设计开题报告-基于Python的教学互动系统的设计与实现开题报告
  3. android .so文件详解以及兼容性
  4. 期货与期权(part2)--远期合约
  5. -moz火狐 (firefox)CSS
  6. Meta宣布将关闭面部识别系统 删除超10亿用户面部扫描数据
  7. HTML5 Canvas 绘制英国国旗
  8. itext生成pdf间距_java将html转为pdf
  9. 【Linux】一个小故事让你秒懂shell外壳程序
  10. linux定时对准时间,Linux校对时间
  11. Win11搜索框恢复成放大镜
  12. CentOS5u11 Oracle 10g 生产RMAN备份可用性恢复测试
  13. Ubuntu下ATI显卡风扇转速调节脚本
  14. Windows7正式版默认壁纸暗藏玄机!
  15. Causality matters in medical imaging 文献解读
  16. 如何批量给文件重命名?
  17. web漏洞-xss漏洞
  18. C语言循环语句进阶练习题
  19. linux如何批量安装字体,如何快速轻松地安装许多字体文件?
  20. android 飞机动画,Android实现纸飞机的简单操作

热门文章

  1. 长时间穿高跟鞋存在健康隐患
  2. python手动实现图像水平、垂直翻转
  3. java文档注释详解
  4. 【微信小程序】微信小程序跳转H5页面的实现思路与方案
  5. 方法——检查参数的有效性
  6. redis6安装教程
  7. 如何清除计算机的硬盘的内存,win7如何清理电脑内存垃圾清理方法
  8. 计算机网络 文件传输小程序代码,懒得打开电脑传文件?这四类小程序把这事解决了...
  9. 三星强势反弹,占据全球热销手机前十半数位置
  10. 学蓝桥Chapter2:板子上的锁存器与译码器