android 小项目------黑名单app
来源:互联网 发布:手机转换视频格式软件 编辑:程序博客网 时间:2024/06/10 01:51
周一的时候,同事在群里问到了黑名单功能,他说网上都没有找到一个完整的,记得谁说过一句,当都没有做过的时候,这就是机会。这几天公司事比较多,只能晚上抽时间写写,直到今天才完整的做出来。
具体效果的话大家可以运行demo看看。
首先我们分析下需求
1、UI部分,毕竟这也是一个小的app,
2、需要有一个数据库来保存黑名单的号码,
3、需要用到一个服务来具体执行黑名单的功能,毕竟如果我们的app退出了,黑名单功能就失效了,这就比较坑了,
未解决的问题,测试在L及以下版本都能够正常工作,但是在M版本PhoneStateListener会获取 不到来电号码,这个我暂时只想到了framework层的代码来修改。待我解决了会重新上传的。
它们前面的逻辑差不多一样,但是M版在最后调用binder的时候,获取到的号码时空的。
UI部分请看底部的源码,比较简单,相信大家一看就懂。
接下来我们来设计一下黑名单的数据库。
它首先应该包括一个id这个是设计数据库时都有的,第二个应该就是要拦截的电话号码了,最后我们在来个拦截的模式(这个可有可无,主要考虑,说不定短信也要拦截呢)。
public class BlackNumberOpenHelper extends SQLiteOpenHelper { public BlackNumberOpenHelper(Context context) { super(context, "blacknumber.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { //创建数据库中表的方法 db.execSQL("create table blacknumber " + "(_id integer primary key autoincrement , phone varchar(20), mode varchar(5));"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
一般有数据库后,都会提供一个操作数据库的工具类。这个大家请看底部给出的源码。
上面这些都是为我们的黑名单功能服务的,接下来看下黑名单功能的具体实现。
这里我们是用PhoneStateListener来获取电话的状态,如果是响铃状态时,通过反射来挂断电话。
来看下PhoneStateListener的使用流程。
1、获取TelephonyManager,
2、确定要监听的电话状态因为PhoneStateListener这个类不仅能监听电话的状态它还有非常多的其他状态监听。
3、重写PhoneStateListener的onCallStateChanged方法,当状态发生改变时来处理我们的流程。
public void onCreate() { mDao = BlackNumberDao.getInstance(getApplicationContext()); //拦截短信 /*IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); intentFilter.setPriority(1000); mInnerSmsReceiver = new InnerSmsReceiver(); registerReceiver(mInnerSmsReceiver, intentFilter);*/ //监听电话的状态 //1,电话管理者对象 mTM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //2,监听电话状态 mPhoneStateListener = new MyPhoneStateListener(); mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } class MyPhoneStateListener extends PhoneStateListener{ //3,手动重写,电话状态发生改变会触发的方法 @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE: break; case TelephonyManager.CALL_STATE_OFFHOOK: break; case TelephonyManager.CALL_STATE_RINGING: //挂断电话 aidl文件中去了// mTM.endCall(); endCall(incomingNumber); break; } super.onCallStateChanged(state, incomingNumber); } }
接下来看下挂断电话的逻辑。
android早期的版本可以通过API调用直接挂断电话,但是后期版本把它隐藏了,不过通过java的反射机制我们同样可以调用到这个方法。
try { //1,获取ServiceManager字节码文件 Class<?> clazz = Class.forName("android.os.ServiceManager"); //2,获取方法 Method method = clazz.getMethod("getService", String.class); //3,反射调用此方法 IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE); //4,调用获取aidl文件对象方法 ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder); //5,调用在aidl中隐藏的endCall方法 iTelephony.endCall(); } catch (Exception e) { e.printStackTrace(); }
上面代码主要是通过反射获取ServiceManager类里面的getService方法,然后调用这个方法获取iBinder对象,通过iBinder我们可以得到ITelephony,最后调用ITelephony.endCall来挂断电话。
走到这里我们的黑名单功能就基本实现了,但是当我们进到通话记录里面的时候会发现,刚才手机明明没响,怎么有未接电话呢。呵呵哒。
我们来处理下这个问题,这主要是因为挂断了电话但是系统的phone却是会把这个通话记录保存下来,只要把它删掉就可以了。
这里要注意下这个删除的时机,你想啊,我们挂断电话时就把通话记录删除了,但是系统要往通话记录里面插入数据也是需要时间的呀,有时还没插入你就删除了,这不就纠结了,怎么找也找不到哪儿出问题了,这里会用到系统提供的内容观察者,只有系统往通话记录数据库中插入了数据时我们才删除。
mContentObserver = new MyContentObserver(new Handler(),phone); getContentResolver().registerContentObserver( Uri.parse("content://call_log/calls"), true, mContentObserver); class MyContentObserver extends ContentObserver { private String phone; public MyContentObserver(Handler handler, String phone) { super(handler); this.phone = phone; } //数据库中指定calls表发生改变的时候会去调用方法 @Override public void onChange(boolean selfChange) { //插入一条数据后,再进行删除 getContentResolver().delete( Uri.parse("content://call_log/calls"), "number = ?", new String[]{phone}); super.onChange(selfChange); } }
github好卡,暂时只传CSDN了。
源码
- android 小项目------黑名单app
- Android练手小项目:仿看房app
- 练手小项目(4)安全卫士——黑名单拦截
- Android APP: BlackContact 显示黑名单联络人信息
- Android练手小项目---仿凤凰新闻app
- Android练手小项目--仿72g赚吧App
- android 黑名单的拦截
- android-实现黑名单拦截
- Android Xmpp 黑名单
- Android黑名单来电管理
- android 黑名单 短信拦截
- 黑名单拦截短信【Android】
- 练手小项目(4)安全卫士——黑名单拦截 利用内容提供者删除通话记录
- 匿名App项目小总结
- Android项目实战--手机卫士16--电话黑名单的增删改查
- Android项目实战--手机卫士17--拦截黑名单以及响一声电话的处理
- android项目 之 来电管家(3) ----- 添加与删除黑名单
- android中黑名单的实现
- 最小的k个数
- 栈的应用——行编辑程序
- FZU1064-教授的测试(卡特兰数)
- H5中video标签
- BZOJ3165
- android 小项目------黑名单app
- 医院设置
- CentOS 6.7安装Kafka 0.10.1
- JavaScript模板引擎原理
- spring cloud之简单注册中心
- 练习
- ubuntu编译单个caffe程序
- 第十四周项目1(4)-验证平衡二叉树相关算法
- 1201/2016下午晚上