您好,登录后才能下订单哦!
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如何实现动态显示通话时间问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。