清除未接来电及通知

2024-08-29 07:58
文章标签 通知 清除 来电 未接

本文主要是介绍清除未接来电及通知,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

应用中有时候会需要获取未接来电,但是当你看完这些未接来电你可能想清除未接来电的通知,及把未接来电变成已读,这时候你需要对数据库操作。


有两种方法可以达到上述需求(其实原理都一样):

一、 直接更改数据库

我们可以参考源码来进行操作,找到MissedCallNotifierImpl.java类,路径是:
packages\services\Telecomm\src\com\android\server\telecom\ui\MissedCallNotifierImpl.java
其中清除未接来电通知的及将未接来电改成已读的代码是:

    /** Clears missed call notification and marks the call log's missed calls as read. */@Overridepublic void clearMissedCalls() {AsyncTask.execute(new Runnable() {@Overridepublic void run() {// Clear the list of new missed calls from the call log.ContentValues values = new ContentValues();values.put(Calls.NEW, 0);values.put(Calls.IS_READ, 1);StringBuilder where = new StringBuilder();where.append(Calls.NEW);where.append(" = 1 AND ");where.append(Calls.TYPE);where.append(" = ?");try {mContext.getContentResolver().update(Calls.CONTENT_URI, values,where.toString(), new String[]{ Integer.toString(Calls.MISSED_TYPE) });} catch (IllegalArgumentException e) {Log.w(this, "ContactsProvider update command failed", e);}}});cancelMissedCallNotification();}

由上面的代码可知这是通过Calls.CONTENT_URI这个URI()来对数据进行操作,将所有的未接的Calls.NEW更新为0,并且将Calls.IS_READ更新为1,这样数据里面的未接来接来电就全部更新为已接了。但进行这些,还不完美,我们还没有清除未接来电的通知,这不,最后cancelMissedCallNotification()就是用来清除通知的。照例,我们也来看看cancelMissedCallNotification()的实现方式:

    /** Cancels the "missed call" notification. */private void cancelMissedCallNotification() {// Reset the number of missed calls to 0.mMissedCallCount = 0;long token = Binder.clearCallingIdentity();try {mNotificationManager.cancelAsUser(null, MISSED_CALL_NOTIFICATION_ID,UserHandle.CURRENT);} finally {Binder.restoreCallingIdentity(token);}}

这代码任务也很简单,就是清除通知,但是问题来了,我们怎么才能清除另一个应用发出的通知的呢?比如dailer发出未接来电通知,无疑是不能直接清除清除的,只能采取迂回的方法,比如反射调用cancelMissedCallNotification()这个方法,我没有试过,但是应该是可行的!看到你是不是想说,坑爹的Android,不会这么麻烦的吧,清除未接来电都要费这么大的功夫!别着急,接下来揭秘第二种方法,之所以放在后面是因为第二种方法太简单了,以至于你要是先看第二种就不会看第一种方法了。


二、使用系统广播

Android当然不会让你费这么大劲的,早就有广播供开发者使用了,在
packages\services\Telecomm\src\com\android\server\telecom\TelecomBroadcastIntentProcessor.java中可以看到ACTION_CLEAR_MISSED_CALLS这个action,同时你还能看到其他功能的action。
比如:

    /** The action used to send SMS response for the missed call notification. */public static final String ACTION_SEND_SMS_FROM_NOTIFICATION ="com.android.server.telecom.ACTION_SEND_SMS_FROM_NOTIFICATION";/** The action used to call a handle back for the missed call notification. */public static final String ACTION_CALL_BACK_FROM_NOTIFICATION ="com.android.server.telecom.ACTION_CALL_BACK_FROM_NOTIFICATION";/** The action used to clear missed calls. */public static final String ACTION_CLEAR_MISSED_CALLS ="com.android.server.telecom.ACTION_CLEAR_MISSED_CALLS";public static final String ACTION_CALL_PULL ="org.codeaurora.ims.ACTION_CALL_PULL";
也就是说你只要在代码里面如下代码就行了:
  • 注:M版本可以这么用,N版本的话sendBroadcast时,除了传送intent过去,还要传一个UserHandler参数!
            Intent intent = new Intent();intent.setAction(ACTION_CLEAR_MISSED_CALLS);mContext.sendBroadcast(intent);callInfos.clear();mHandler.sendEmptyMessage(0x00);
    1. **用法是很简单,我们照例追踪一下源码,首先是BroadcastReceiver收到广播**

packages\services\Telecomm\src\com\android\server\telecom\components\TelecomBroadcastReceiver.java

public final class TelecomBroadcastReceiverextends BroadcastReceiver implements TelecomSystem.Component {/** {@inheritDoc} */@Overridepublic void onReceive(Context context, Intent intent) {synchronized (getTelecomSystem().getLock()) {getTelecomSystem().getTelecomBroadcastIntentProcessor().processIntent(intent);}}@Overridepublic TelecomSystem getTelecomSystem() {return TelecomSystem.getInstance();}}
    2. **接着处理广播**packages\services\Telecomm\src\com\android\server\telecom\TelecomBroadcastIntentProcessor.java
public void processIntent(Intent intent) {String action = intent.getAction();Log.v(this, "Action received: %s.", action);MissedCallNotifier missedCallNotifier = mCallsManager.getMissedCallNotifier();// Send an SMS from the missed call notification.if (ACTION_SEND_SMS_FROM_NOTIFICATION.equals(action)) {// Close the notification shade and the notification itself.closeSystemDialogs(mContext);missedCallNotifier.clearMissedCalls();Intent callIntent = new Intent(Intent.ACTION_SENDTO, intent.getData());callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivityAsUser(callIntent, UserHandle.CURRENT);// Call back recent caller from the missed call notification.} else if (ACTION_CALL_BACK_FROM_NOTIFICATION.equals(action)) {// Close the notification shade and the notification itself.closeSystemDialogs(mContext);missedCallNotifier.clearMissedCalls();Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, intent.getData());callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);mContext.startActivityAsUser(callIntent, UserHandle.CURRENT);// Clear the missed call notification and call log entries.} else if (ACTION_CLEAR_MISSED_CALLS.equals(action)) {missedCallNotifier.clearMissedCalls();} else if (ACTION_CALL_PULL.equals(action)) {// Close the notification shade and the notification itself.closeSystemDialogs(mContext);String dialogId =  intent.getStringExtra("org.codeaurora.ims.VICE_CLEAR");int callType =  intent.getIntExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, 0);Log.i(this,"ACTION_CALL_PULL: calltype = " + callType + ", dialogId = " + dialogId);Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, intent.getData());callIntent.putExtra(TelephonyProperties.EXTRA_IS_CALL_PULL, true);callIntent.putExtra(TelephonyProperties.EXTRA_SKIP_SCHEMA_PARSING, true);callIntent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, callType);callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);mContext.startActivityAsUser(callIntent, UserHandle.CURRENT);}}

这篇关于清除未接来电及通知的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117290

相关文章

如何让应用在清除内存时保持运行

最近在写聊天软件。一个聊天软件需要做到在清除内存时仍能保持其应有的状态。      首先,我尝试在应用的Service中的onDestroy()进行重启应用,经过测试,发现被强制清除内存的应用不会调用Service的onDestroy,只会调用activity的onDestroy(),于是我决定在触发activity的onDestroy( )处发送广播给应用的静态广播接收器,然后让广播

AIGC大模型智能抠图(清除背景):Sanster/IOPaint,python(2)

AIGC大模型智能抠图(清除背景):Sanster/IOPaint,python(2)   在文章(1)的基础上,尝试用大模型扣除图中的某些主要景物。 1、首先,安装插件: pip install rembg   2、第1步安装成功,启动webui,注意,这里要启用清除背景/抠图的插件 --enable-remove-bg : iopaint start --model=lama

AOP之执行前通知@Before

Spring AOP之执行前通知@Before 此文章说一下执行前通知,即注解@Before。 作用 多用于日志记录、权限校验、初始化资源等。 触发时间 目标函数执行触发。 定义 public class AopBeforeAspect {@Before("execution(public * com.example.demo.service.impl.AccountServiceI

CSS学习12--清除浮动的本质及处理办法

清除浮动 前言一、清除浮动的本质二、清除浮动的方法 前言 为什么要清除浮动? 浮动不占用原文档流的位置,可能会对后面的元素排版产生影响。因此需要在该元素中清除浮动,清除浮动后造成的影响。 一、清除浮动的本质 为了解决父级元素因为子级元素引起内部高度为0的问题。 <html><head><style>* {padding: 0;margin: 0;}.box1 {width:

文件内容的清除

想到两种方法 -1.用空格覆盖所有内容(有问题,内容全变成空格)    int  fd=open(filename,O_RDWR)    struct stat stBuf;    stat(filename,&stBuf);    len=stBuf.st_size;    char *szBuf=(char*)malloc(len);    bzero(s

leetcode:3174 清除数字

3174 清除数字 题目链接https://leetcode.cn/problems/clear-digits/ 题目描述 给你一个字符串 s 。 你的任务是重复以下操作删除 所有 数字字符: 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。 请你返回删除所有数字字符以后剩下的字符串。 示例 1: 输入:s = "abc"输出:"abc" 解释:字符串

SQL循环清除表数据

SQL循环执行清除表数据语句 最近项目经常需要清库测试 但是一个个 truncate 很慢 浪费时间 所以写了个 sql批量清除表数据 这样方便下次使用 灵活性也很高 语句不仅可以 用来清除数据 也可以 批量update delete等 逻辑: 根据 字符拆分 字符串 获取每次执行语句的 表名 根据 split 获取字符串内有多少个表 也就是循环的次数 每次循环 先获取本次 执行语

火狐浏览器重置密码后收藏的标签密码等数据被清除

火狐浏览器重置密码后收藏的标签密码等数据被清除 最早接触火狐是因为当时开发前端页面,firebug是当时最好用的前端调试工具。 用了很多年,最近因为一次重置密码,把我10几年的收藏数据全都清空了。还无法找回… 现在大部分web应用都要求使用chrome,比如在线文档、在线的office等,可是我还一直坚持使用火狐浏览器。 只是因为当初的先入为主,一直还坚持使用火狐浏览器,这次的遭遇让我丢失10年

周期性清除Spark Streaming流状态的方法

在Spark Streaming程序中,我们经常需要使用有状态的流来统计一些累积性的指标,比如各个商品的PV。简单的代码描述如下,使用mapWithState()算子: 现在的问题是,PV并不是一直累加的,而是每天归零,重新统计数据。要达到在凌晨0点清除状态的目的,有以下两种方法。 编写脚本重启Streaming程序 用crontab、Azkaban等在凌晨0点调度执行下面的Shell脚本