Android端来电拦截的模块实现
安卓手机来电拦截模块
电话拦截这项功能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端来电拦截的模块实现相关推荐
- Android N来电拦截
骚扰号码存放的URI BlockedNumberContract.BlockedNumbers.CONTENT_URI 存放号码的列 BlockedNumberContract.BlockedNumb ...
- [android开发]来电拦截 ITelephony
别试了用不了了(. 本来以为终于在这里找到了解决方案,然而 telephony.endCall() 需要系统权限 MODIFY_PHONE_STATE permission required. 同时, ...
- Android端 同 单片机 利用蓝牙模块的通信实现
这次期末的课程设计做了一个智能灯光控制系统,系统整体的功能不在此赘述,系统主要是要实现下位机同上位机的通信,上位机选用的是Android手机端,下位机是52单片机,通过蓝牙模块实现通信.虽然系统很简单 ...
- Android 来电拦截的开发实现
前段时间在开发一款应用,里面涉及到一个来电拦截的功能,于是乎就开始了对于来电如何拦截进行了探索,最后总结出了实现来电拦截的两种方法,并且经过实际的真机验证,在对比两种可以实现的方法,我们找出了其中较优 ...
- 基于Android RIL层实现来电拦截的技术原理(一)
引入 目前市面上,Android上的防骚扰类应用非常多,比如腾讯手机管家.360手机卫士.金山手机卫士等.由于受Android OS设计框架,他们的来电拦截实现,都是通过接受com.android.p ...
- android 来电拦截
电话是 在TelephonyManager中有一个私有方法getITelephony(),能获得ITelephony接口实例,该接口中有endCall()方法,该方法能拦截电话. 1. 在服务中设置电 ...
- Android端推送消息之极光推送
推送方式 轮询 --实现方式: 周期性主动获取网络中的数据; --缺点: 费电, 费流量; SMS --实现方式: 服务器端向手机端发送短信, 手机监听短信广播, 将拦截的短信信息进行显示; --优点 ...
- Android端消息推送总结:实现原理、心跳保活、遇到的问题等
前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解. 为什 ...
- 58同城Android端-最小插件化框架实战和原理分析
目录 背景 插件化需要了解的知识 2.1 类加载过程和类加载器 2.2 ClassLoader 的 findClass.findLibrary.findResource 2.3 DexClassLoa ...
最新文章
- Java 时间日期整理
- wkWebView 的一些问题
- Mybatis之占位符与拼接符
- matlab feval 函数说明,Matlab feval函数
- Ubuntu系统中使用搜狗输入法
- linux 编程头文件搜索规则
- 我有十万块,想自己创业,是做电商还是做实体店?
- ResNest网络系列
- 使用windows 命令行创建一个空的文本文件
- 6.Linux 运行级别
- TurboFan的故事
- centos7查看mysql日志_centos 7 mysql启动失败–学会看错误日志
- MCE | 外泌体的检测提取机制
- Android CameraX 仿一甜相机(录像、拍照、可调节尺寸、聚焦、照明、网格线),最全的CameraX教程
- 身份证真伪辨别python版
- Djano3.0使用-CBV使用实例
- Liunx树莓派(ARM)开发篇—第十四章、树莓派Linux内核编译步骤(超详细、图文结合)
- android平台的一款mud工具,全平台 MUD 客户端 TinTin++ 之安卓篇
- 检查凭证录入模板的核算项目研发项目是否录入
- Win11删除EFI分区
热门文章
- 【仿牛客网笔记】项目进阶,构建安全高效的企业服务——热帖排行
- 国内共享软件的十大杀手
- Python built-in module time 内建时间库常用函数
- Ignoring ffi-1.12.2 because its extensions are not built. Try: gem pristine ffi --version 1.12.2
- C++中的delete和delete[ ]的区别
- java学习笔记-类与对象示例
- [激光器原理与应用-6]:Q开关元件与Q驱动电路板
- JAVA计算机毕业设计融呗智慧金融微资讯移动平台小程序端(附源码、数据库)
- 抽屉远离在计算机的应用,抽屉原理及电脑算命
- 通信维修专用电源_通信电源维护