转载请注明出处:https://blog.csdn.net/u012932409/article/details/83001243

一、屏蔽系统短信功能

1、屏蔽所有短信

android 4.2 短信发送流程分析可参考这篇 戳这

源码位置 vendor\mediatek\proprietary\packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java

private void handleSmsReceived(Intent intent, int error) {//2018-10-09 cczheng  add for intercept mms notifications  startif (true) {Log.i("SmsReceived", "handleSmsReceived");return;}//2018-10-09 cczheng add for intercept mms notifications  endSmsMessage[] msgs = Intents.getMessagesFromIntent(intent);/// M:Code analyze 022, check null @{if (msgs == null) {MmsLog.e(MmsApp.TXN_TAG, "getMessagesFromIntent return null.");return;}MmsLog.d(MmsApp.TXN_TAG, "handleSmsReceived SmsReceiverService");/// ......
}

在handleSmsReceived()方法中直接return即可,不去解析和分发短信消息,同时这样操作 短信将不会记录到短信数据库中,插入短信消息到数据库的方法见下文insertMessage()方法。

2、屏蔽特定的短信(特定的短信号码或者短信内容)

源码位置同上

  • SmsMessage.getOriginatingAddress() 获取短信号码
  • SmsMessage.getMessageBody() 获取短信内容
private void handleSmsReceived(Intent intent, int error) {SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);...../// M:Code analyze 024, print log @{SmsMessage tmpsms = msgs[0];MmsLog.d(MmsApp.TXN_TAG, "handleSmsReceived" + (tmpsms.isReplace() ? "(replace)" : "")+ " messageUri: " + messageUri+ ", address: " + tmpsms.getOriginatingAddress()+ ", body: " + tmpsms.getMessageBody());/// @//2018-10-09 cczheng add for intercept mms notifications  startif ("10010".equals(tmpsms.getOriginatingAddress()) || "话费".contains(tmpsms.getMessageBody())) {Log.i("SmsReceived", "handleSmsReceived");return;}//2018-10-09 cczheng  add for intercept mms notifications  end....
}

是否插入短信消息到数据库,insertMessage()方法在handleSmsReceived()中调用

private Uri insertMessage(Context context, SmsMessage[] msgs, int error, String format) {// Build the helper classes to parse the messages.if (msgs == null) {MmsLog.e(MmsApp.TXN_TAG, "insertMessage:getMessagesFromIntent return null.");return null;}/// @}SmsMessage sms = msgs[0];if (sms.getMessageClass() == SmsMessage.MessageClass.CLASS_0) {MmsLog.d(MmsApp.TXN_TAG, "insertMessage: display class 0 message!");displayClassZeroMessage(context, msgs, format);return null;} else if (sms.isReplace()) {MmsLog.d(MmsApp.TXN_TAG, "insertMessage: is replace message!");return replaceMessage(context, msgs, error);} else {MmsLog.d(MmsApp.TXN_TAG, "insertMessage: stored directly!");return storeMessage(context, msgs, error);}}

3、应用层拦截短信(不用修改android源码,原理就是用你的app去替代系统默认的短信app,过程略繁琐)

需要添加SmsReceiver,MmsReceiver,ComposeSmsActivity,HeadlessSmsSendService这几个类,并在AndroidManifest中进行相应配置,具体流程可参考这篇 戳这

二、屏蔽系统来电响铃和通知提示

屏蔽系统来电可分为三个步骤

1.来电静音,不响铃

2.来电挂断,不出现IncallActivity

3、拦截未接来电通知,不显示在状态栏StatusBar中

ps:此种修改方式的弊端在于来电时网络数据会离线2s左右

好,现在我们开始按这三个步骤来修改源码

1.来电静音,不响铃

源码位置 packages/services/Telecomm/src/com/android/server/telecom/Ringer.java

private void updateRinging(Call call) {if (mRingingCalls.isEmpty()) {stopRinging(call, "No more ringing calls found");stopCallWaiting(call);} else {//2018-10-10 cczheng add  anotation function startRingingOrCallWaiting() for silent call startLog.d("callRinging", "silent call, will not play ringtone");// startRingingOrCallWaiting(call);//2018-10-10 cczheng add  anotation function startRingingOrCallWaiting() for silent call end}}

是的,注释掉startRingingOrCallWaiting(call);方法就ok啦

2.来电挂断,不出现IncallActivity

思路:监听PhoneState,当监听到响铃时,直接通过反射调用endcall方法挂断电话。监听PhoneStateListener可以写到广播中,当收到开机广播时,开始监听phoneState,这样和系统保持同步。以下是参考代码

public class PhoneStartReceiver extends BroadcastReceiver {private static final String TAG = "PhoneStartReceiver";private PhoneCallListener mPhoneCallListener;private TelephonyManager mTelephonyManager;@Overridepublic void onReceive(final Context context, final Intent intent) {String action = intent.getAction();if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {// endCall when CALL_STATE_RINGINGinitPhoneCallListener(context);} }private void initPhoneCallListener(Context context){mPhoneCallListener = new PhoneCallListener();mTelephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);mTelephonyManager.listen(mPhoneCallListener, PhoneCallListener.LISTEN_CALL_STATE);}public class PhoneCallListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {Log.v(TAG, "onCallStateChanged-state: " + state);Log.v(TAG, "onCallStateChanged-incomingNumber: " + incomingNumber);switch (state)  {case TelephonyManager.CALL_STATE_RINGING:endCall();break;default:break;}super.onCallStateChanged(state, incomingNumber);}}private void endCall() {try {Method m1 = mTelephonyManager.getClass().getDeclaredMethod("getITelephony");if (m1 != null) {m1.setAccessible(true);Object iTelephony = m1.invoke(mTelephonyManager);if (iTelephony != null) {Method m2 = iTelephony.getClass().getDeclaredMethod("silenceRinger");if (m2 != null) {m2.invoke(iTelephony);Log.v(TAG, "silenceRinger......");}Method m3 = iTelephony.getClass().getDeclaredMethod("endCall");if (m3 != null) {m3.invoke(iTelephony);Log.v(TAG, "endCall......");}}}} catch (Exception e) {e.printStackTrace();Log.e(TAG, "endCallError", e);}}}

3.拦截未接来电通知,不显示在状态栏StatusBar中

源码位置 packages/apps/InCallUI/src/com/android/incallui/StatusBarNotifier.java

private void updateInCallNotification(final InCallState state, CallList callList) {...final Call call = getCallToShow(callList);//2018-10-10 cczheng add intercept incoming notification startif (true) {if (call != null) {Log.v("InCallNotification", "phoneNumber = " + call.getNumber());}return;}//2018-10-10 cczheng add  intercept incoming notification endif (call != null) {showNotification(call);} else {cancelNotification();}...}

其实核心方法就是showNotification(call),发送通知当statusBar收到通知就处理并显示在状态栏。

当你发现这样处理完后,重新mm,然后push替换Dialer.apk重启后,你会坑爹的发现状态栏那个未接来电图标依旧显示,无fa可说,继续跟踪日志揪出罪魁祸首,最终发现另一处奇葩的地方。

源码位置 packages/services/Telecomm/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java

诺,就是这了,看注释就明白了吧 Create a system notification for the missed call

/**
* Create a system notification for the missed call.
*
* @param call The missed call.
*/
@Override
public void showMissedCallNotification(Call call) {2018-10-10 cczheng hide missed call notification [S]if (true) {android.util.Log.i("misscall", "showMissedCallNotification......");return;}///2018-10-10 cczheng hide missed call notification [E]mMissedCallCount++;final int titleResId;final String expandedText;  // The text in the notification's line 1 and 2.
....
}

ok,这样我们就搞定了来电功能。

三、隐藏短信应用和电话应用在launcher中显示(去除AndroidManifest中的category)

 <category android:name="android.intent.category.LAUNCHER" />

四、总结

Android源码修改没有大家想象的那么难,毕竟Google工程师都已经给我们标注了详细的注释说明,只是框架和封装的思路难以理解,这就考验我们的耐心了,Log是个好东西,多加日志,多分析,这样很容易上手。


Android6.0 源码修改之屏蔽系统短信功能和来电功能相关推荐

  1. Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar...

    场景分析, 为了完全实现沉浸式效果,在进入特定的app后可以将导航栏移除,当退出app后再次将导航栏恢复.(下面将采用发送广播的方式来移除和恢复导航栏) ps:不修改源码的情况下,简单的沉浸式效果实现 ...

  2. Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮...

    Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮 前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP) ...

  3. Android6.0 源码修改之Settings音量调节界面增加通话音量调节

    Android6.0 源码修改之Settings音量调节界面增加通话音量调节 前言 今天客户提了个需求,因为我们的设备在正常情况下无法调节通话音量,只有在打电话过程中,按物理音量加减键才能出现调节通话 ...

  4. java屏蔽虚拟按键代码_Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar...

    场景分析, 为了完全实现沉浸式效果,在进入特定的app后可以将导航栏移除,当退出app后再次将导航栏恢复.(下面将采用发送广播的方式来移除和恢复导航栏) ps:不修改源码的情况下,简单的沉浸式效果实现 ...

  5. 在Ubuntu Server14.04上编译Android6.0源码

    此前编译过Android4.4的源码,但是现在Android都到了7.0的版本,不禁让我感叹Google的步伐真心难跟上,趁这周周末时间比较充裕,于是在过去的24小时里,毅然花了9个小时编译了一把An ...

  6. Android源码定制(1)——Android6.0源码编译

    一.前言 最近在研究Xposed框架定制,恰好又看到看雪上两个大佬关于源码定制和Xposed源码定制的帖子,所以尝试基于Android6.0版本,详细记录一下从源码下载到Xposed框架定制的全过程. ...

  7. android6.0源码分析之AMS服务源码分析

    activitymanagerservice服务源码分析 1.ActivityManagerService概述 ActivityManagerService(以下简称AMS)作为Android中最核心 ...

  8. android6.0源码分析之Zygote进程分析

    在android6.0源码分析之Runtime的初始化一文中,对Zygote进程的初期的Runtime初始化过程进行了分析,在Runtime启动结束后,会对Zygote进程进行初始化,其它Java进程 ...

  9. android6.0源码分析之Runtime的初始化

    Android运行时作为android架构的一部分,起着非常重要的作用,它和核心库(Core Libraries)组成了Android运行时库层.本文将依据android源码对AndroidRunti ...

  10. Android6.0源码解读之ViewGroup点击事件分发机制

    本篇博文是Android点击事件分发机制系列博文的第三篇,主要是从解读ViewGroup类的源码入手,根据源码理清ViewGroup点击事件分发原理,明白ViewGroup和View点击事件分发的关系 ...

最新文章

  1. golang打包HTML为Android,使用Go开发Web服务,并打包html/js/css等静态资源文件
  2. python画柱状图代码-python绘制双柱形图代码实例
  3. 算法每日学打卡:java语言基础题目打卡(01-10)
  4. Windows Server 2012 R2 或 2016 无法安装 .NET Framework 3.5.1
  5. C#对Microsoft.VisualBasic My对象兰台妙选
  6. ARM开发板上iconv调用失败的解决方法
  7. Maven笔记——maven下载与配置
  8. 由一次磁盘告警引发的“血案”——你知道 du 和 ls 区别吗?
  9. 充分释放数据价值:安全、可信6到飞起
  10. 在Rayeager px2上搭建web服务器anmpp
  11. 视觉slam第一讲——
  12. http协议服务器错误代码稍后再试,Http协议常见错误码说明解析
  13. PHP如何获取当前域名
  14. Kalman滤波器参数分析
  15. 3D刷脸支付推动新零售行业发展
  16. 顺序表——基本概念、顺序表类实现、基本操作
  17. 常用文本编辑器(NotePad++,UtraEdit)
  18. Auto CAD:CAD绘图设计以项目为导向,实战案例布局作图运用技巧经验总结之详细攻略
  19. Weex 在双11会场的大规模应用
  20. Process finished with exit code 132 (interrupted by signal 4: SIGILL)

热门文章

  1. 写DM9000网卡芯片驱动的预备知识
  2. C语言实现:素数的判断的多种方法
  3. 手写字体研究-matlab
  4. 【多传感器融合理论】01自动驾驶中常用传感器硬件介绍
  5. python 单例模式基本原则、使用场景、应用示例
  6. mpa和pis_压力单位MPa/psi/bar之间的换算?
  7. 全国省市县乡镇四级sql数据
  8. 【Mac 系统下载 解压 ImageNet-1k(ILSVRC2012、IN1K)数据集】
  9. 浅谈文字编码和Unicode(中)[转]
  10. Adobe Photoshop 2021 22.4.3 中英文+Neural Filters 含神经滤镜 下载