android 小项目------黑名单app
周一的时候,同事在群里问到了黑名单功能,他说网上都没有找到一个完整的,记得谁说过一句,当都没有做过的时候,这就是机会。这几天公司事比较多,只能晚上抽时间写写,直到今天才完整的做出来。
具体效果的话大家可以运行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小项目之十一 应用程序的主界面
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android小项目练习之一 项目简介
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android小项目之十二 设置中心的界面
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android小项目之十 应用程序更新的签名问题
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android小项目之八 界面细节
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android小项目之五 splash动画效果
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- 【Android小项目】找不同,改编自"寻找房祖名"的一款开源小应用。
近期在微信朋友圈"寻找房祖名"和"万里寻刀"这类小游戏比較火.我试着写了一个android版本号的,里面全是一系列的形近字,实现原理非常easy:用一个Grid ...
- Android小项目之九 两种上下文的区别
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android小项目之七 应用程序的更新安装
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
随机推荐
- hdu1051 Wooden Sticks---贪心
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1051 题目大意:给你n根木棍的长度和重量.根据要求求出制作该木棍的最短时间.建立第一个木棍需要1分钟 ...
- 非黑即白--谷歌OCR光学字符识别
# coding=utf-8 #非黑即白--谷歌OCR光学字符识别 # 颜色的世界里,非黑即白.computer表示深信不疑. # 今天研究一下OCR光学识别庞大领域中的众多分支里的一个开源项目的一个 ...
- js中获取元素的样式兼容性的写法
1:设计元素的样式:el.style.color="red"||el.style["color"]="red" 获取元素的样式:el.st ...
- Selenium_java coding
1)public class HelloWorld { // class 是类的意思 // 类名指的是class后面这个词,这个词是我们起的名 public static void main(Stri ...
- PAT 1082. 射击比赛 (20)
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原点(0,0). 输入 ...
- c++简单线程池实现
线程池,简单来说就是有一堆已经创建好的线程(最大数目一定),初始时他们都处于空闲状态,当有新的任务进来,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他 ...
- [LeetCode] Replace Words 替换单词
In English, we have a concept called root, which can be followed by some other words to form another ...
- ●BZOJ 4566 [Haoi2016]找相同字符
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4566题解: 广义后缀自动机 对两个串同时建立一个广义后缀自动机. 同时统计出每个状态对两个串 ...
- bzoj 1217: [HNOI2003]消防局的设立
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...
- ubuntu14.0464位 Ros环境 安装halcon13.01
至于ROS的系统,之前就是安装好的,如果有疑问的可以参考官网的安装教程,按照指令一步一步的操作,http://wiki.ros.org/cn/indigo/Installation/Ubuntu (1 ...