Android Notification如何实现动态显示通话时间
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,Android Notification如何实现动态显示通话时间,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。基于android N
千家信息网最后更新 2025年11月10日Android Notification如何实现动态显示通话时间
Android Notification如何实现动态显示通话时间,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
基于android N MTK释放的源码,供大家参考,具体内容如下
主要思路
1、我们需要知道通话建立时的时间,即call 的状态从 INCOMING或者DIALING 转变成ACTIVE的时候
2、时间每秒钟都会发生变化,所以我们就需要不停的更新notification的界面,我们这里是不停的创建和notify同一个notification,已到达更新时间的效果
3、我们需要CallTimer线程不停的帮我们计算时间,并控制界面的更新
代码实现
这里是在源码incallUI目录下的StatusBarNotifier.java中修改
....省略部分代码 //震动时长,这里为不振动 private static final long[] IN_CALL_VIBRATE_PATTERN_NULL = new long[] {0, 0, 0}; //线程隔多久执行一次已ms为单位,这里为1S private static final long CALL_TIME_UPDATE_INTERVAL_MS = 1000; //我们需要获取一些全局的变量,已到达不停的创建notification并更新同一个notification的UI private CallTimer mCallTimer; private Notification.Builder mCopyBuilder; private int mCopyCallState; private ContactCacheEntry mCopyContactInfo; private int mCopyNotificationType; //当前notification的ID,通过这个ID我们可以一直更新同一个notification并且只会弹出一次 private Bitmap mCopyLargeIcon; public StatusBarNotifier(Context context, ContactInfoCache contactInfoCache) { .......省略部分代码 //StatusBarNotifier初始化的时候就创建CallTimer对象,用来计算时间和更新UI mCallTimer = new CallTimer(new Runnable() { @Override public void run() { updateCallTime(); //更新UI的函数 } }); } @Override public void onStateChange(InCallState oldState, InCallState newState, CallList callList) { if (callList.getActiveCall() == null || callList.getActiveCall().getState() != Call.State.ACTIVE){ //当通话结束时需要取消计算时间的线程 mCallTimer.cancel(); } } //系统构建notification的方法 private void buildAndSendNotification(Call originalCall, ContactCacheEntry contactInfo) { ....省略部分代码 else if (callState == Call.State.ACTIVE && !mIsCallUiShown) { //保存一个公共的变量到全部变量里面,方便后面构造新的notification并刷新 copyInfoFromHeadsUpView(builder, callState, contactInfo, notificationType, largeIcon); //下面是计算显示的时间 final long callStart = call.getConnectTimeMillis(); final long duration = System.currentTimeMillis() - callStart; //创建一个HeadsUpView显示在notification上面 RemoteViews inCall = createInCallHeadsUpView(duration / 1000, largeIcon); builder.setContent(inCall); builder.setCustomHeadsUpContentView(inCall); //系统原生的方法最后notify通知 fireNotification(builder, callState, contactInfo, notificationType); //开始我们的计时线程 mCallTimer.start(CALL_TIME_UPDATE_INTERVAL_MS); } .....省略部分代码 } private RemoteViews createInCallHeadsUpView(Long callDuration, Bitmap contactAvatar) { RemoteViews headsUpView = new RemoteViews(mContext.getPackageName(), R.layout.in_call_headsup); if (null != contactAvatar) { headsUpView.setImageViewBitmap(R.id.in_call_hu_avatar, contactAvatar); } //格式化时间 String callTimeElapsed = DateUtils.formatElapsedTime(callDuration); headsUpView.setTextViewText(R.id.in_call_hu_elapsedTime, callTimeElapsed); return headsUpView; } /*according the mCallTimer to update time data*/ public void updateCallTime() { Call call = CallList.getInstance().getActiveCall(); final long callStart = call.getConnectTimeMillis(); final long duration = System.currentTimeMillis() - callStart; RemoteViews inCall = createInCallHeadsUpView(duration / 1000, mCopyLargeIcon); mCopyBuilder.setContent(inCall); mCopyBuilder.setCustomHeadsUpContentView(inCall); Notification notification = mCopyBuilder.build(); notification.vibrate = IN_CALL_VIBRATE_PATTERN_NULL; mNotificationManager.notify(mCopyNotificationType, notification); } /*Change local variables to global variables*/ private void copyInfoFromHeadsUpView(Notification.Builder builder, int callState, ContactCacheEntry contactInfo, int notificationType, Bitmap largeIcon){ mCopyBuilder = builder; mCopyCallState = callState; mCopyContactInfo = contactInfo; mCopyNotificationType = notificationType; mCopyLargeIcon = largeIcon; }........省略部分代码CallTimer源码如下
package com.android.incallui;import com.google.common.base.Preconditions;import android.os.Handler;import android.os.SystemClock;/** * Helper class used to keep track of events requiring regular intervals. */public class CallTimer extends Handler { private Runnable mInternalCallback; private Runnable mCallback; private long mLastReportedTime; private long mInterval; private boolean mRunning; public CallTimer(Runnable callback) { Preconditions.checkNotNull(callback); mInterval = 0; mLastReportedTime = 0; mRunning = false; mCallback = callback; mInternalCallback = new CallTimerCallback(); } public boolean start(long interval) { if (interval <= 0) { return false; } // cancel any previous timer cancel(); mInterval = interval; mLastReportedTime = SystemClock.uptimeMillis(); mRunning = true; periodicUpdateTimer(); return true; } public void cancel() { removeCallbacks(mInternalCallback); mRunning = false; } private void periodicUpdateTimer() { if (!mRunning) { return; } final long now = SystemClock.uptimeMillis(); long nextReport = mLastReportedTime + mInterval; while (now >= nextReport) { nextReport += mInterval; } postAtTime(mInternalCallback, nextReport); mLastReportedTime = nextReport; // Run the callback mCallback.run(); } private class CallTimerCallback implements Runnable { @Override public void run() { periodicUpdateTimer(); } }}关于Android Notification如何实现动态显示通话时间问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
时间
更新
代码
部分
线程
变量
方法
源码
问题
动态
内容
时候
更多
界面
系统
帮助
解答
易行
简单易行
全局
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云服务器清空硬盘数据
压实网络安全工作责任制
云端服务器与移动客户端进行通讯
网络技术ftp搭建过程
网络技术与云计算前沿技术
数据库创建表含有name
惠普服务器工作站可以重装系统吗
数据库配置文件一般叫什么
网络技术通信实例
数据库技术及应用实训四
数据库设计表要定义哪些内容
电脑服务器地址怎么切换
福田区光纤网络技术开发展示
悉点科技软件开发工程师
对行业软件开发的认识
吃鸡无法连接服务器是为什么
管理数据库的工具
无线网络安全性选什么区别
数据库是存id还是存姓名
指导会员加强网络安全
关于调整网络安全领导小组的通知
网络安全绘画软件测试
网络安全与防范开题报告
浙江直销软件开发工程
网络安全宣传周小游戏
腾讯云服务器 镜像选择
金山区节能软件开发不二之选
数据库应用技术作业形考
excel好用的服务器
手机端读取本地数据库