本文实例讲述了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编程中黑名单的实现方法相关推荐

  1. python程序调用写好的代码_扣丁学堂浅谈Python编程中NotImplementedError的使用方法...

    扣丁学堂浅谈Python编程中NotImplementedError的使用方法 2018-07-04 14:08:02 2559浏览 本篇文章扣丁学堂 Python编程中raise可以实现报出错误的功 ...

  2. python面向对象编程中方法和属性_Python面向对象编程中关于类和方法的学习笔记...

    Python面向对象编程中关于类和方法的学习笔记 类与类方法是面向对象的编程语言中必不可少的特性,本文总结了Python面向对象编程中关于类和方法的学习笔记,需要的朋友可以参考下 类和实例 pytho ...

  3. python面向对象编程中_Python面向对象编程中关于类和方法

    类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句"物以类聚". 没错就是类, 归类 物以类聚 类 ...

  4. java中调用js_java编程中实现调用js方法分析

    本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEng ...

  5. android五子棋源代码,Android五子棋游戏源码详解

    最近看了鸿洋大牛的五子棋教程,受益匪浅,讲的非常好,关于五子棋的游戏原理非常清楚,并且学到了不少知识,在这里感谢鸿洋大神的分享.我觉得我的源码注释写的非常清楚了,希望能给你带来不少的收获. 布局< ...

  6. JNI编程中数据类型转换的方法

    1 致谢 感谢Jinhill网友博客提供的帮助 链接:http://blog.csdn.net/jinhill/article/details/6918821 2 问题描述 又要进行我的JNI编程之旅 ...

  7. 学习android 画板源代码,Android实现画画板案例

    郑州app开发画画板案例.布局代码是三个button和一个imagesview下面是图片. 布局代码就不展示了.下面是java代码. package cn.xhhkj.image; import an ...

  8. android 录像 源代码,android安卓视频录制摄像拍摄源码(测试可用)

    [实例简介] [实例截图] [核心代码] package com.cn.mvideo; import java.io.File; import java.io.IOException; import ...

  9. Android TextVeiw 在java代码中添加空格的方法

    可以使用uniconde 的编码设置空格,有三种方法的 \u00A0,\u0020,\u3000 代码设置下 textView.setText("北\u00A0京"); textV ...

最新文章

  1. 常用memcached命令详解
  2. unix中的grep家族
  3. (Redis设计与实现-6) 频道的订阅与退订
  4. 用uliweb 创建项目
  5. 请推荐好的工作流产品
  6. 理解node.js(Understanding node.js)
  7. 斯坦福 CS228 概率图模型中文讲义 一、引言
  8. java原生的ajax怎么写,用原生js实现 ajax方法
  9. BZOJ 1193: [HNOI2006]马步距离【贪心+搜索】
  10. 盘点 | 2017 年关于 Python 的 12 件大事
  11. 提交文件到svn,提示is not under version control
  12. php 生成vbs文件路径,vbs下一些取特殊路径的方法总结
  13. xpath中normalize-space的实际应用
  14. IE10、IE11 ASP.Net 网站无法写入Cookie 问题
  15. python 实现QQ邮箱发送邮件
  16. 2019/第十届蓝桥杯国赛/Java-B
  17. windows2008R2 TSL1.0升级成1.2的解决方案
  18. html省市插件,省市区三级联动:非常好用的纯js插件
  19. 【粉丝福利】第二波 | 当当购书狂欢,满 400 减 230!下单充电速来!
  20. 佳文分享:我个人比较受用的一些习惯

热门文章

  1. 【Windows】远程桌面出现CredSSP加密数据修正问题解决方案
  2. 2022年全球市场合成石墨阳极粉总体规模、主要生产商、主要地区、产品和应用细分研究报告
  3. SQL基础教程MICK版 ···第六章总结
  4. 键盘输入简单数值和符号求运算结果
  5. HBase - MapReduce - HBase 作为输出源的示例 | 那伊抹微笑
  6. Primo Ramdisk – 瞬间提高电脑速度(内存虚拟硬盘)
  7. 云计算导论课后习题第二章
  8. spring-boot-starter-data-redis介绍
  9. 在linux下怎么下载虎牙m3u8视频
  10. 树莓派——opencv打开树莓派摄像头调试记录