iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android Notification实现动态显示通话时间
  • 419
分享到

Android Notification实现动态显示通话时间

2024-04-02 19:04:59 419人浏览 安东尼
摘要

基于Android N MTK释放的源码,供大家参考,具体内容如下 本文主要讲解如何在 IncallUI 的notification 上面不停地更新显示当前已通话多长时间,从而达到和

基于Android N MTK释放的源码,供大家参考,具体内容如下

本文主要讲解如何在 IncallUI 的notification 上面不停地更新显示当前已通话多长时间,从而达到和incallUI通话界面上的通话时间一致。

主要思路

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;
    }

    
    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);

    }

    
    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;


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();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Android Notification实现动态显示通话时间

本文链接: https://www.lsjlt.com/news/136552.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android Notification实现动态显示通话时间
    基于android N MTK释放的源码,供大家参考,具体内容如下 本文主要讲解如何在 IncallUI 的notification 上面不停地更新显示当前已通话多长时间,从而达到和...
    99+
    2024-04-02
  • Java线程实现时间动态显示
    本文实例为大家分享了Java线程实现时间动态显示的具体代码,供大家参考,具体内容如下 代码如下: import javax.swing.*; import java.awt.*;...
    99+
    2024-04-02
  • Android Studio Notification(状态栏通知) 不显示通知 解决
    引言:在学习的过程中,我发现,无论怎么修改,甚至是直接复制了大佬的代码,我的程序都不能正确的弹出状态栏通知,在经过一晚上的纠缠后,终于找到了原因 通知不显示可能由多种原因引起: 通知权限:确保你的应用已经获得了正确的通知权限。在And...
    99+
    2023-09-29
    android studio android ide
  • html+js实现动态显示本地时间
    复制代码 代码如下: <span style="font-size:18px"><html> <span style="white-space:pre"...
    99+
    2022-11-15
    html 本地时间
  • Android实现显示系统实时时间
    Android显示系统实时时间的具体代码,供大家参考,具体内容如下 获取系统当前时间 System.currentTimeMillis(); 需要开启一个线程,我们通过Handler...
    99+
    2024-04-02
  • js如何实现动态显示时间效果
    这篇文章给大家分享的是有关js如何实现动态显示时间效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例代码如下:<!DOCTYPE HTML> ...
    99+
    2024-04-02
  • tkinter动态显示时间的两种实现方法
    目录问题描述方式一(使用组件的after方法)方式二(新建线程)总结问题描述 有些小伙伴在使用python做GUI界面的时候可能想添加这么一个小功能,就是在界面的某个角落动态的显示当...
    99+
    2023-01-28
    tkinter动态显示时间 tkinter显示时间 tkinter动态时间
  • 怎么在vue中动态实时显示时间
    这篇文章给大家介绍怎么在vue中动态实时显示时间,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。vue动态实时显示时间有两种方法可以用day.js,处理日期和时间的js库用法 npm install dayjs --sa...
    99+
    2023-06-15
  • javascript如何动态显示时间
    这篇文章主要为大家展示了“javascript如何动态显示时间”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript如何动态显示时间”这篇文章吧。 ...
    99+
    2024-04-02
  • vue如何动态实时的显示时间浅析
    vue动态实时显示时间有两种方法 1.可以用day.js,处理日期和时间的js库 用法 npm install dayjs --save 引入import dayjs from 'd...
    99+
    2024-04-02
  • android实现动态显示隐藏进度条
    本文实例为大家分享了android实现动态显示隐藏进度条的具体代码,供大家参考,具体内容如下 调用 ProgressUtil.startProgress(this, new P...
    99+
    2024-04-02
  • Android动态显示当前年月日时分秒系统时间(示例代码)
    在布局文件中放一个TextView用来显示时间,如下所示:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http...
    99+
    2023-05-31
    android 系统时间 年月日时分秒
  • Qt5 实现主窗口状态栏显示时间
    使用Qt Creator创建默认的窗体程序后,主窗口QMainWindow有statusBar状态栏,在此状态栏实时显示时间可以使用下面方法实现: mainwindow.h文件内容:...
    99+
    2024-04-02
  • Python-使用matplotlib.pyplot实现实时数据动态显示
    目录 一、引言 二、从一块代码开始 1、%matplotlib qt5 2、plt.icon 三、另一种在行内(Jupyter Notebook内)展示动态图形的方法 1、display和display.clear_output() 一...
    99+
    2023-09-01
    python 信息可视化 开发语言
  • Vue Echarts实现实时大屏动态数据显示
    目录前言一、vue配置二、适配方案三、Echarts四、实时更新前言 因为是国企线上应用的活动大屏,我就不附图了。代码仅供参考。 一、vue配置 1. 我是用vue-cli 搭建的,...
    99+
    2022-11-13
    Vue Echarts Vue Echarts动态数据 Vue Echarts大屏
  • Android实现日期时间选择对话框
    日期/时间选择对话框(DatePickerDialog和TimePickerDialog)的使用,供大家参考,具体内容如下 <LinearLayout xmlns:a...
    99+
    2024-04-02
  • android实现动态显隐进度条
    本文实例为大家分享了android实现动态显隐进度条的具体代码,供大家参考,具体内容如下 调用 ProgressUtil.startProgress(this, new Prog...
    99+
    2024-04-02
  • Qt5如何实现主窗口状态栏显示时间
    这篇文章给大家分享的是有关Qt5如何实现主窗口状态栏显示时间的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用Qt Creator创建默认的窗体程序后,主窗口QMainWindow有statusBar状态栏,在此...
    99+
    2023-06-14
  • 如何实现jsp中Response对象页面重定向、时间的动态显示
    这篇文章主要为大家展示了“如何实现jsp中Response对象页面重定向、时间的动态显示”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现jsp中Response对象页面重定向、时间的动态显...
    99+
    2023-06-20
  • 怎么在Java中利用线程动态显示时间
    怎么在Java中利用线程动态显示时间?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码如下:import javax.swing.*;import&n...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作