安卓手机来电拦截模块

电话拦截这项功能google屏蔽了,所有得自己去找aidl文件来反射实现来电的拦截,下面是一个简单的来电拦截模块代码实现.

❶需要注意的是:所需要的权限

    <!-- 权限 -->
<span style="color:#cc0000;">    <uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.READ_CONTACTS" /><uses-permission android:name="android.permission.WRITE_CONTACTS" /><uses-permission android:name="android.permission.CALL_PHONE" /><uses-permission android:name="android.permission.READ_CALL_LOG" /><uses-permission android:name="android.permission.WRITE_CALL_LOG" /></span>

❷主函数的代码

import com.hui.server.PhoneServer;import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;public class MainActivity extends ActionBarActivity
{private EditText   mEd;private Button      mBn;private static boolean  BUTTON_STATE = true;private String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate (savedInstanceState);setContentView (R.layout.activity_main);mEd = (EditText) findViewById (R.id.main_ed);mBn = (Button) findViewById (R.id.main_bn);mBn.setOnClickListener (new OnClickListener () {@Overridepublic void onClick(View v){if (BUTTON_STATE) {BUTTON_STATE = false;mEd.setEnabled (false);mBn.setText ("解除拦截");startMyService();}else {BUTTON_STATE = true;mEd.setEnabled (true);mBn.setText ("确认拦截");stopMyService();}}});}public void startMyService(){String phoneNumber = mEd.getText ().toString ();// 数据保存到 缓存中Log.d (TAG, "界面输入的电话号码:" + phoneNumber);// 第一种:获取电话号码的方法,先把号码写入缓存,然后在service那边获取//PreferenceUtils.putString (getApplicationContext (), "number", phoneNumber);Intent intent = new Intent ();// 第二种:直接用 put 过去intent.putExtra ("number", phoneNumber); // 把电话传过去intent.setClass (MainActivity.this, PhoneServer.class);// 开启服务startService (intent);}public void stopMyService(){stopService (new Intent (MainActivity.this, PhoneServer.class));}
}

❸服务中的代码

import java.lang.reflect.Method;import com.android.internal.telephony.ITelephony;import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;public class PhoneServer extends Service
{private TelephonyManager           mTm;private String              TAG = "PhoneServer";private String               phoneNumber;@Overridepublic void onCreate(){Log.d (TAG, "服务开启");super.onCreate ();// 缓存的方法把号码弄过来// 也可以用数据库等形式把数据搞过来// phoneNumber = PreferenceUtils.getString (getApplicationContext (),// "number");Log.d (TAG, "缓存中的电话号码:" + phoneNumber);// // 搞一个电话管理者mTm = (TelephonyManager) getSystemService (Context.TELEPHONY_SERVICE);// 1.拦截电话监听mTm.listen (mListener, PhoneStateListener.LISTEN_CALL_STATE);}private PhoneStateListener mListener = new PhoneStateListener () {public void onCallStateChanged(int state , final String incomingNumber){//Log.d (TAG, "电话状态改变!!!");// state:电话的状态// * @see TelephonyManager#CALL_STATE_IDLE:闲置状态// * @see TelephonyManager#CALL_STATE_RINGING:响铃状态// * @see TelephonyManager#CALL_STATE_OFFHOOK:摘机--》接听状态// incomingNumber:拨入的电话号码 对比 你在界面上面输入的电话//Log.d (TAG, "incomingNumber-->" + phoneNumber);//Log.d (TAG, "setNumber-->" + phoneNumber);switch (state) {case TelephonyManager.CALL_STATE_IDLE:break;case TelephonyManager.CALL_STATE_RINGING:Log.d (TAG, "响铃状态!!!");// 响铃状态--> 判断是否是黑名单---》挂掉电话if (incomingNumber.equals (phoneNumber)) {// 需要拦截// 挂掉电话
<span style="white-space:pre">                      </span>// 这里执行反射操作try {Class<?> clazz = Class.forName ("android.os.ServiceManager");Method method = clazz.getDeclaredMethod ("getService",String.class);IBinder binder = (IBinder) method.invoke (null,Context.TELEPHONY_SERVICE);ITelephony telephony = ITelephony.Stub.asInterface (binder);telephony.endCall (); // 挂断电话阻止电话响Thread.sleep (200); // 稍微延时// 删除通话记录final ContentResolver cr = getContentResolver ();final Uri url = Uri.parse ("content://call_log/calls");cr.registerContentObserver (url, true,new ContentObserver (new Handler ()) {public void onChange(boolean selfChange){String where = "number=?";String[] selectionArgs = new String[] { incomingNumber };cr.delete (url, where, selectionArgs);};});Log.d (TAG, "成功拦截电话成功-----拦截的号码为----->:" + phoneNumber);} catch (Exception e) {Log.d (TAG, "拦截出错!!!");e.printStackTrace ();}}break;case TelephonyManager.CALL_STATE_OFFHOOK:break;default:break;}}};public void onDestroy(){Log.d (TAG, "解除服务");// 注销监听mTm.listen (mListener, PhoneStateListener.LISTEN_NONE);};// 在启动的时候把号码保存到内存@Overridepublic int onStartCommand(Intent intent , int flags , int startId){phoneNumber = intent.getStringExtra ("number");Log.d (TAG, "intent电话号码是:" + phoneNumber);return super.onStartCommand (intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent){return null;}}

❹源代码,自己下把

下载地址:http://download.csdn.net/detail/u010381752/9065395

Android端来电拦截的模块实现相关推荐

  1. Android N来电拦截

    骚扰号码存放的URI BlockedNumberContract.BlockedNumbers.CONTENT_URI 存放号码的列 BlockedNumberContract.BlockedNumb ...

  2. [android开发]来电拦截 ITelephony

    别试了用不了了(. 本来以为终于在这里找到了解决方案,然而 telephony.endCall() 需要系统权限 MODIFY_PHONE_STATE permission required. 同时, ...

  3. Android端 同 单片机 利用蓝牙模块的通信实现

    这次期末的课程设计做了一个智能灯光控制系统,系统整体的功能不在此赘述,系统主要是要实现下位机同上位机的通信,上位机选用的是Android手机端,下位机是52单片机,通过蓝牙模块实现通信.虽然系统很简单 ...

  4. Android 来电拦截的开发实现

    前段时间在开发一款应用,里面涉及到一个来电拦截的功能,于是乎就开始了对于来电如何拦截进行了探索,最后总结出了实现来电拦截的两种方法,并且经过实际的真机验证,在对比两种可以实现的方法,我们找出了其中较优 ...

  5. 基于Android RIL层实现来电拦截的技术原理(一)

    引入 目前市面上,Android上的防骚扰类应用非常多,比如腾讯手机管家.360手机卫士.金山手机卫士等.由于受Android OS设计框架,他们的来电拦截实现,都是通过接受com.android.p ...

  6. android 来电拦截

    电话是 在TelephonyManager中有一个私有方法getITelephony(),能获得ITelephony接口实例,该接口中有endCall()方法,该方法能拦截电话. 1. 在服务中设置电 ...

  7. Android端推送消息之极光推送

    推送方式 轮询 --实现方式: 周期性主动获取网络中的数据; --缺点: 费电, 费流量; SMS --实现方式: 服务器端向手机端发送短信, 手机监听短信广播, 将拦截的短信信息进行显示; --优点 ...

  8. Android端消息推送总结:实现原理、心跳保活、遇到的问题等

    前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解. 为什 ...

  9. 58同城Android端-最小插件化框架实战和原理分析

    目录 背景 插件化需要了解的知识 2.1 类加载过程和类加载器 2.2 ClassLoader 的 findClass.findLibrary.findResource 2.3 DexClassLoa ...

最新文章

  1. Java 时间日期整理
  2. wkWebView 的一些问题
  3. Mybatis之占位符与拼接符
  4. matlab feval 函数说明,Matlab feval函数
  5. Ubuntu系统中使用搜狗输入法
  6. linux 编程头文件搜索规则
  7. 我有十万块,想自己创业,是做电商还是做实体店?
  8. ResNest网络系列
  9. 使用windows 命令行创建一个空的文本文件
  10. 6.Linux 运行级别
  11. TurboFan的故事
  12. centos7查看mysql日志_centos 7 mysql启动失败–学会看错误日志
  13. MCE | 外泌体的检测提取机制
  14. Android CameraX 仿一甜相机(录像、拍照、可调节尺寸、聚焦、照明、网格线),最全的CameraX教程
  15. 身份证真伪辨别python版
  16. Djano3.0使用-CBV使用实例
  17. Liunx树莓派(ARM)开发篇—第十四章、树莓派Linux内核编译步骤(超详细、图文结合)
  18. android平台的一款mud工具,全平台 MUD 客户端 TinTin++ 之安卓篇
  19. 检查凭证录入模板的核算项目研发项目是否录入
  20. Win11删除EFI分区

热门文章

  1. 【仿牛客网笔记】项目进阶,构建安全高效的企业服务——热帖排行
  2. 国内共享软件的十大杀手
  3. Python built-in module time 内建时间库常用函数
  4. Ignoring ffi-1.12.2 because its extensions are not built. Try: gem pristine ffi --version 1.12.2
  5. C++中的delete和delete[ ]的区别
  6. java学习笔记-类与对象示例
  7. [激光器原理与应用-6]:Q开关元件与Q驱动电路板
  8. JAVA计算机毕业设计融呗智慧金融微资讯移动平台小程序端(附源码、数据库)
  9. 抽屉远离在计算机的应用,抽屉原理及电脑算命
  10. 通信维修专用电源_通信电源维护