通话挂断后如何提示用户通话时长

InCallUI中,通话时会提示用户当前通话的时长。现有个客户需求:通话中,被测终端A能实时动态显示当前通话时间。挂断后,能显示该通话持续时间。

第一反应,在 src/com/android/incallui/InCallPresenter.java 的onDisconnect(Call) 方法中实现。

final long callStart = call.getConnectRealTime();
final long duration = SystemClock.elapsedRealtime() - callStart;
long callTime = callStart == 0 ? callStart : (duration / 1000);
Log.d(this, "onDisconnect: callTime = " + callTime);

Toast.makeText(mContext, mContext.getString(R.string.call_time_cost, DateUtils.formatElapsedTime(callTime)), Toast.LEN    GTH_SHORT).show();

测试,单通电话没有问题;挂断,toast弹出时长。

客户拿过去测试,两天后反馈:挂断电话会议,会有多次toast弹出。的确,这个onDisconnect(Call)在每个connection挂断的时候,都会调用一次,每掉用一次都会弹出当前call的时长。

问题来了,怎么判断当前call处于电话会议状态?InCallUI中的Call是com.android.services.telephony.common.Call对象,有状态State.CONFERENCED;但是当onDisconnect(Call)调用时其已经变成DISCONNECTING/DISCONNECTED了。还有就是此时CallList已经被clear了,没有Call的任何对象了。

最后只能想个笨办法,保存电话会议中的Call,并在CallList清空所有Call之前完成显示工作。

1. src/com/android/incallui/CallList.java

// 添加一个mConfCallMap来持有State.CONFERENCED状态的电话,并向外提供可以查询的接口。

+    /* hunter.ding add for tylt @{ */
+    private final HashMap<Integer, Call> mConfCallMap = Maps.newHashMap();
+    /* @}*/

mCallMap.put(id, call);
             updated = true;
+            /* SPRD: hunter.ding add for tlyt @{ */
+            if (call.getState() == Call.State.CONFERENCED) {
+                mConfCallMap.put(id, call);
+            }
+            /* @}*/
2. src/com/android/incallui/CallHandlerService.java

// 在调用onDisconnect()进行Call的清理工作之前完成显示。

case ON_DISCONNECT_CALL:
                 Log.i(TAG, "ON_DISCONNECT_CALL: " + msg.obj);
+                /* SPRD: hunter.ding add for tylt @{ */
+                if (mInCallPresenter != null) {
+                    mInCallPresenter.showCallTimeToast((Call) msg.obj);
+                }
+                /* @} */
                 mCallList.onDisconnect((Call) msg.obj); // 这里会去remove(callId)
                 break;

3. src/com/android/incallui/InCallPresenter.java

// 判断通话时长(主要针对电话会议),并调用UI显示
+    /* hunter.ding add for tylt @{ */
+    public void showCallTimeToast(Call call) {
+        final long callStart = call.getConnectRealTime();
+        long callTime = 0L;
+
+        if (CallList.getInstance().getConfCallsId().contains(call.getCallId())) { // maybe it is a conference
+            long duration = SystemClock.elapsedRealtime() - callStart;
+            long temp = callStart == 0 ? callStart : (duration / 1000);
+            if (temp > callTime) {
+                callTime = temp;
+            }
+            Log.d(this, "onDisconnect: callTime = " + callTime);
+            if (1 == CallList.getInstance().getConfCallsId().size()) {
+                mInCallActivity.toastCallTimeToUser(callTime);
+            }
+        } else {
+                final long duration = SystemClock.elapsedRealtime() - callStart;
+                callTime = callStart == 0 ? callStart : (duration / 1000);
+                Log.d(this, "onDisconnect: callTime = " + callTime);
+                mInCallActivity.toastCallTimeToUser(callTime);
+        }
+    }
+    /* @} */

4. src/com/android/incallui/InCallActivity.java

// 直接显示Toast了

+    /* hunter.ding add for tylt @{ */
+    public void toastCallTimeToUser(long callTime) {
+        Toast.makeText(this, getResources().getString(R.string.call_time_cost, DateUtils.formatElapsedTime(callTime)), Toast.LENGT
+    }
+    /* @} */

初步试了一下,ok的

时间: 2024-10-26 02:04:08

通话挂断后如何提示用户通话时长的相关文章

scala实战之spark用户在线时长和登录次数统计实例

接触spark后就开始学习scala语言了,因为有一点python和java的基础学习起来还行,今天在这里把我工作中应用scala编程统计分析用户行为日志的实例和大家分析一下,我这里主要讲一下用户的在线时长统计和登录次数统计算法实现过程. 第一步 编程环境:首先你得有spark安装包 你可以先不用本地安装spark,但是可以通过import spark-assembly-1.6.2-hadoop2.6.0.jar包来完成程序调试 另外需要scala的运行环境,我用的版本:scala-sdk-2.

js用img代替ajax js心跳 向服务器定时传送参数 主要计算用户在线时长

html: <!doctype html><html><head><meta charset="utf-8"><title>记录用户的在线时长</title></head> <body></body></html><script type="text/javascript"> var Statistics_Website_logo ={

【Python数据分析】用户通话行为分析

主要工作: 1.对从网上营业厅拿到的用户数据.xls文件,通过Python的xlrd进行解析,计算用户的主叫被叫次数,通话时间,通话时段. 2.使用matplotlib画图包,将分析的结果直观的绘制出来. 具体步骤: 1.分析须要的内容 excel文件中包含很多信息,我们分析的时候须要用到的包括,通话起始时间.通话时长.呼叫类型,号码. 使用xlrd模块,读取excel中的数据,用列表的形式保存下来. 1 #coding=utf-8 2 import xlrd 3 4 def readData(

Python Show-Me-the-Code 第 0020题 统计通话时长

第 0020 题: 登陆中国联通网上营业厅 后选择「自助服务」 –> 「详单查询」,然后选择你要查询的时间段,点击「查询」按钮,查询结果页面的最下方,点击「导出」,就会生成类似于 2014年10月01日-2014年10月31日通话详单.xls 文件.写代码,对每月通话时间做个统计. 思路: 我的手机号是移动的,所以我选的是导出移动手机号某月的详单.打开表格文件发现每行的格式是: 序号 通话地 通话类型 对方号码 开始时间 通话时长 移动话费 长途话费 它的通话类型是包括套餐,主叫,被叫,上网流量

jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示

1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实现 初次使用$.ajax() ,我没有去区分过ajax的异步请求和同步请求的不同,刚开始使用同步请求,以至后来出现许多问题,特别在体验度方面.异步和同步:同步意味着执行完一段程序才能执行下一段,它属于阻塞模式,其表现在网页上的现象是——浏览器会锁定页面(即所谓的页面假死状态),用户不能操作其它的,必

自定义提示用户授权使用地理定位功能时的提示语

以前程序的地理定位功能若查询GPS授权情况,返回的是CLAuthorizationStatus.NotDetermined,意思是授权状态未定. 需要在使用CoreLocation前调用方法 requestWhenInUseAuthorization() 或者 requestAlwaysAuthorization() 并在Info.plist中加入两个缺省没有的字段 NSLocationAlwaysUsageDescription NSLocationWhenInUseUsageDescript

当页面关闭或刷新时提示用户

需求: 1.当页面关闭或刷新时提示用户是否已保存: 2.页面中的某些ajax操作成功后,如果需要刷新(window.location.reload())页面,但不需要提示用户是否已保存. 解决方法: 1)在页面加载后注册onbeforeunload事件,页面关闭前和刷新前都会触发onbeforeunload事件: //注册页面刷新和关闭提醒事件 window.onbeforeunload = function () { return "请确认信息是否已保存!"; }; 2)在相应的aj

微信小程序发布新版本时自动提示用户更新

如图,当小程序发布新的版本后,用户如果之前访问过该小程序,通过已打开的小程序进入(未手动删除),则会弹出这个提示,提醒用户更新新的版本.用户点击确定就可以自动重启更新,点击取消则关闭弹窗,不再更新. 官方给的示例代码: const updateManager = wx.getUpdateManager() updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 console.log(res.hasUpdate) }) upd

Chronometer android计时器组件Chronometer的使用,android通话时长计时控件

在安卓开发过程中经常需要计数器的使用,我们可以用handler实现间隔性的操作. 例如按两次返回back退出,隔几秒重复换页面等. 但是也经常有一类需求类是打电话时候记录时长的操作. 这就用到了android中 android.widget包下的Chronometer 这个组件. 转载请注明:谢谢 Chronometer介绍 Class that implements a simple timer. * <p> * You can give it a start time in the {@l