Android极致专注模式:如何屏蔽来电通知(非DND方案)
解决方案:无需DND模式隐藏来电弹窗的实现思路
方案1:通过TelecomManager拦截来电(Android 10+)
- 利用系统官方的
CallScreeningService接口,无需依赖DND权限即可处理来电通知 - 实现步骤:
- 自定义
CallScreeningService子类,重写onScreenCall()方法 - 在方法内判断当前是否处于专注模式,若是则通过
CallResponse.Builder设置setSuppressCallNotifications(true)直接隐藏来电通知;也可选择setDisallowCall(true)拒绝来电 - 在Manifest中注册服务,添加
android.permission.READ_PHONE_STATE和android.permission.CALL_SCREENING权限,并声明android.intent.action.TELECOM_SCREENING_SERVICE的intent filter - 动态申请危险权限
READ_PHONE_STATE,确保权限获取成功后再启用功能
- 自定义
代码示例:
public class FocusCallScreeningService extends CallScreeningService { @Override public void onScreenCall(Call.Details callDetails) { if (FocusModeManager.isFocusModeActive()) { CallResponse response = new CallResponse.Builder() .setSuppressCallNotifications(true) .build(); respondToCall(callDetails, response); } } }
方案2:通过WindowManager覆盖来电界面(兼容性强)
- 原理是在专注模式开启时,创建全屏高优先级悬浮窗遮挡来电弹窗
- 实现要点:
- 申请
android.permission.SYSTEM_ALERT_WINDOW特殊权限,需引导用户到系统设置页手动开启 - Android 8.0+使用
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY作为Window类型,低版本用TYPE_SYSTEM_ALERT - 设置Window参数:
FLAG_FULLSCREEN | FLAG_LAYOUT_IN_SCREEN | FLAG_NOT_FOCUSABLE,仅做遮挡不拦截用户操作 - 专注模式关闭时立即移除该悬浮窗,避免影响正常使用
- 申请
方案3:静音+全屏锁定兜底方案
- 若前两种方案受厂商限制无法生效,可结合以下操作降低来电干扰:
- 开启专注模式时,调用
AudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT)设置静音 - 关闭来电振动:
AudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF) - 锁定应用为全屏状态,设置
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON),同时重写onBackPressed()禁用返回键,配合FLAG_DISMISS_KEYGUARD确保界面始终显示
- 开启专注模式时,调用
关键注意事项
- 所有系统权限操作需做好引导提示,避免用户因权限问题导致功能失效
- 针对不同Android版本做适配,比如
CallScreeningService仅支持Android 10及以上 - 测试主流厂商ROM兼容性(小米、华为、OPPO等),部分厂商会对系统API做定制限制
内容的提问来源于stack exchange,提问作者hemant borse
相关产品推荐
相关产品推荐

