android 名册源代码,Android编程中黑名单的实现方法
本文实例讲述了Android编程中黑名单的实现方法。分享给大家供大家参考,具体如下:
说明:由于挂断电话android api不是对外开放的,所以需要使用反射的方法得到拨打电话的服务。
1.将android源代码中的"aidl"文件拷贝到项目中
这样项目中会生成两个包:android.telephony;此包中文件为:NeighboringCellInfo.aidl
com.android.internal.telephony;此包中文件为:ITelephony.aidl
2.通过反射挂断电话;代码如下:
/**
* 挂断电话
*/
public void endCall() {
try {
Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null, new Object[]{TELEPHONY_SERVICE});
ITelephony telephony = ITelephony.Stub.asInterface(binder);
telephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
}
3.删除通话记录中的记录
/**
* 删除呼叫记录
*/
public void deleteCallLog(String incomingNumber) {
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, null,"number=?", new String[]{incomingNumber}, null);
if(cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndex("_id"));
resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[]{id});
}
}
4.直接这样调用是不能删除电话记录的,因为生成电话记录的过程是一个异步的过程,在挂断电话之后不能立即删除电话记录,所以这里要使用ContentObserver(内容观察者)
private class MyObserver extends ContentObserver{
private String incomingNumber;
public MyObserver(Handler handler,String incomingNumber) {
super(handler);
this.incomingNumber = incomingNumber;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
deleteCallLog(incomingNumber);
getContentResolver().unregisterContentObserver(this);
}
}
6.最后把整个service代码贴到下面
public class AddressService extends Service{
private static final String TAG = "AddressService";
private TelephonyManager manager;
private MyPhoneListener listener;
private WindowManager wManager;
private View view;
private SharedPreferences sp;
long startTime = 0;
long endTime = 0;
private BlackNumberDao dao;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
/**
* 服务第一次被创建的时候调用的方法
* 服务被初始化时调用的方法
*/
@Override
public void onCreate() {
super.onCreate();
listener = new MyPhoneListener();
manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
wManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
sp = getSharedPreferences("config", MODE_PRIVATE);
dao = new BlackNumberDao(this);
// if(3000>(endTime - startTime)){
// String ns = Context.NOTIFICATION_SERVICE;
// NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
// //定义通知栏展现的内容信息
// int icon = R.drawable.icon5;
// CharSequence tickerText = "我的通知栏标题";
// long when = System.currentTimeMillis();
// Notification notification = new Notification(icon, tickerText, when);
// //定义下拉通知栏时要展现的内容信息
// Context context = getApplicationContext();
// CharSequence contentTitle = "我的通知栏标展开标题";
// CharSequence contentText = "我的通知栏展开详细内容";
// Intent notificationIntent = new Intent(AddressService.this,BootStartDemo.class);
// PendingIntent contentIntent = PendingIntent.getActivity(AddressService.this, 0,notificationIntent, 0);
// notification.setLatestEventInfo(context, contentTitle, contentText,contentIntent);
// //用mNotificationManager的notify方法通知用户生成标题栏消息通知
// mNotificationManager.notify(1, notification);
// }
}
/**
* 服务停止的时候调用
*/
@Override
public void onDestroy() {
super.onDestroy();
manager.listen(listener, PhoneStateListener.LISTEN_NONE);
listener = null;
}
private class MyPhoneListener extends PhoneStateListener{
/**
* 电话状态发生改变的时候调用的方法
*/
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
if(null != view){
wManager.removeView(view);
view = null;
}
endTime = System.currentTimeMillis();
break;
case TelephonyManager.CALL_STATE_RINGING: // 零响状态
//判断number是否在黑名单中
if(dao.find(incomingNumber)){
//挂断电话
endCall();
//删除呼叫记录
// deleteCallLog(incomingNumber);
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(CallLog.Calls.CONTENT_URI, true, new MyObserver(new Handler(),incomingNumber));
}
Log.i(TAG,"来电号码为"+ incomingNumber);
String address = NumberAddressService.getAddress(incomingNumber);
Log.i(TAG,"归属地为"+ address);
showLocation(address);
//获取当前系统的时间
startTime = System.currentTimeMillis();
break;
case TelephonyManager.CALL_STATE_OFFHOOK: //接通电话状态
break;
}
}
}
/**
* 在窗体上显示出来位置信息
* @param address
*/
public void showLocation(String address) {
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
params.setTitle("Toast");
params.gravity = Gravity.LEFT | Gravity.TOP;
int x = sp.getInt("lastx", 0);
int y = sp.getInt("lasty", 0);
params.x = x;
params.y = y;
view = View.inflate(getApplicationContext(), R.layout.show_location, null);
LinearLayout ll_location = (LinearLayout) view.findViewById(R.id.ll_location);
TextView tv_location = (TextView) view.findViewById(R.id.tv_location);
int background = sp.getInt("background", 0);
if(0 == background){
ll_location.setBackgroundResource(R.drawable.call_locate_gray);
}else if(1 == background){
ll_location.setBackgroundResource(R.drawable.call_locate_orange);
}else {
ll_location.setBackgroundResource(R.drawable.call_locate_green);
}
tv_location.setText(address);
tv_location.setTextSize(24);
wManager.addView(view, params);
}
/**
* 删除呼叫记录
*/
public void deleteCallLog(String incomingNumber) {
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, null,"number=?", new String[]{incomingNumber}, null);
if(cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndex("_id"));
resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[]{id});
}
}
/**
* 挂断电话
*/
public void endCall() {
try {
Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null, new Object[]{TELEPHONY_SERVICE});
ITelephony telephony = ITelephony.Stub.asInterface(binder);
telephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
}
private class MyObserver extends ContentObserver{
private String incomingNumber;
public MyObserver(Handler handler,String incomingNumber) {
super(handler);
this.incomingNumber = incomingNumber;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
deleteCallLog(incomingNumber);
getContentResolver().unregisterContentObserver(this);
}
}
}
希望本文所述对大家Android程序设计有所帮助。
android 名册源代码,Android编程中黑名单的实现方法相关推荐
- python程序调用写好的代码_扣丁学堂浅谈Python编程中NotImplementedError的使用方法...
扣丁学堂浅谈Python编程中NotImplementedError的使用方法 2018-07-04 14:08:02 2559浏览 本篇文章扣丁学堂 Python编程中raise可以实现报出错误的功 ...
- python面向对象编程中方法和属性_Python面向对象编程中关于类和方法的学习笔记...
Python面向对象编程中关于类和方法的学习笔记 类与类方法是面向对象的编程语言中必不可少的特性,本文总结了Python面向对象编程中关于类和方法的学习笔记,需要的朋友可以参考下 类和实例 pytho ...
- python面向对象编程中_Python面向对象编程中关于类和方法
类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句"物以类聚". 没错就是类, 归类 物以类聚 类 ...
- java中调用js_java编程中实现调用js方法分析
本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEng ...
- android五子棋源代码,Android五子棋游戏源码详解
最近看了鸿洋大牛的五子棋教程,受益匪浅,讲的非常好,关于五子棋的游戏原理非常清楚,并且学到了不少知识,在这里感谢鸿洋大神的分享.我觉得我的源码注释写的非常清楚了,希望能给你带来不少的收获. 布局< ...
- JNI编程中数据类型转换的方法
1 致谢 感谢Jinhill网友博客提供的帮助 链接:http://blog.csdn.net/jinhill/article/details/6918821 2 问题描述 又要进行我的JNI编程之旅 ...
- 学习android 画板源代码,Android实现画画板案例
郑州app开发画画板案例.布局代码是三个button和一个imagesview下面是图片. 布局代码就不展示了.下面是java代码. package cn.xhhkj.image; import an ...
- android 录像 源代码,android安卓视频录制摄像拍摄源码(测试可用)
[实例简介] [实例截图] [核心代码] package com.cn.mvideo; import java.io.File; import java.io.IOException; import ...
- Android TextVeiw 在java代码中添加空格的方法
可以使用uniconde 的编码设置空格,有三种方法的 \u00A0,\u0020,\u3000 代码设置下 textView.setText("北\u00A0京"); textV ...
最新文章
- 常用memcached命令详解
- unix中的grep家族
- (Redis设计与实现-6) 频道的订阅与退订
- 用uliweb 创建项目
- 请推荐好的工作流产品
- 理解node.js(Understanding node.js)
- 斯坦福 CS228 概率图模型中文讲义 一、引言
- java原生的ajax怎么写,用原生js实现 ajax方法
- BZOJ 1193: [HNOI2006]马步距离【贪心+搜索】
- 盘点 | 2017 年关于 Python 的 12 件大事
- 提交文件到svn,提示is not under version control
- php 生成vbs文件路径,vbs下一些取特殊路径的方法总结
- xpath中normalize-space的实际应用
- IE10、IE11 ASP.Net 网站无法写入Cookie 问题
- python 实现QQ邮箱发送邮件
- 2019/第十届蓝桥杯国赛/Java-B
- windows2008R2 TSL1.0升级成1.2的解决方案
- html省市插件,省市区三级联动:非常好用的纯js插件
- 【粉丝福利】第二波 | 当当购书狂欢,满 400 减 230!下单充电速来!
- 佳文分享:我个人比较受用的一些习惯
热门文章
- 【Windows】远程桌面出现CredSSP加密数据修正问题解决方案
- 2022年全球市场合成石墨阳极粉总体规模、主要生产商、主要地区、产品和应用细分研究报告
- SQL基础教程MICK版 	···第六章总结
- 键盘输入简单数值和符号求运算结果
- HBase - MapReduce - HBase 作为输出源的示例 | 那伊抹微笑
- Primo Ramdisk – 瞬间提高电脑速度(内存虚拟硬盘)
- 云计算导论课后习题第二章
- spring-boot-starter-data-redis介绍
- 在linux下怎么下载虎牙m3u8视频
- 树莓派——opencv打开树莓派摄像头调试记录