【问题标题】:How can I add notification timer like whatsapp call notification?如何添加通知计时器,例如 whatsapp 呼叫通知?
【发布时间】:2017-11-13 07:17:15
【问题描述】:

我有一个通知生成器。我想添加通知计时器,例如 whatsapp 呼叫通知。所以如果我调用 updateNotifTime 函数,是行不通的。

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, callChannelId)
                .setSmallIcon(R.drawable.call_icon)
                .setContentIntent(pendingIntent)
                .setOngoing(true)
                .setShowWhen(true)
                .setWhen(System.currentTimeMillis())
                .setPriority(NotificationCompat.PRIORITY_HIGH);

public void updateNotifTime() {
    this.callingElapsedRunnable = new Runnable() {
                @Override
                public void run() {

                    elapsedTime += 1000;

                    String timer = DateUtils.calculateTime(elapsedTime);

                    builder.setWhen(elapsedTime);

                    callingElapsedHandler.postDelayed(this, 1000);
                }
            };

callingElapsedHandler.postDelayed(callingElapsedRunnable, 1000);
    }

【问题讨论】:

  • 尝试使用:.setUsesChronometer(true) 提示developer.android.com/reference/android/app/…
  • 我试过了但还是不行:(
  • 哦,可以试试并行使用吗:setChronometerCountDown(boolean)
  • setChronometerCountDown(boolean) 未定义
  • .setChronometerCountDown(true)

标签: android timer notifications call


【解决方案1】:

我为

public void startChronometer(String elapsedTime) {

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && builder != null) {
            RemoteViews mContentView = new RemoteViews(context.getPackageName(), R.layout.call_notification);
            //timerTxt
            TextView timerTxt = new TextView(context);
            timerTxt.setId(R.id.timerTxt);

            //callTypeTxt
            TextView callTypeTxt = new TextView(context);
            callTypeTxt.setId(R.id.callType);

            //calleeNameTxt
            TextView calleeNameTxt = new TextView(context);
            calleeNameTxt.setId(R.id.calleeName);

            mContentView.setTextViewText(timerTxt.getId(), elapsedTime);
            mContentView.setTextViewText(callTypeTxt.getId(), context.getString(R.string.call_in_progress));

            builder.setCustomBigContentView(mContentView);
            notificationManager.notify(CALL_NOTIFICATION_ID, builder.build());
        }
    }

其他版本

builder.setUsesChronometer(true);

@Kishore Jethava 问题:

Intent intent = new Intent(mContext, YourActivity.class);
intent.putExtra("tappedTime", System.currentTimeMillis());

PendingIntent pendingIntent = PendingIntent.getActivity(mContext, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT);

【讨论】:

  • 我已经使用了这段代码,但我仍然收到bad notification posted
  • 你想要通知计时器吗?
  • 是的,和whats app call一样。
  • 谢谢,现在可以使用了。当用户点击该通知时,我可以得到那个时间吗?
  • 是的,您可以收听点击的通知。
【解决方案2】:
private void sendNotification(String from, String messageText) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(from)
            .setContentText(messageText)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0, notificationBuilder.build());
}

【讨论】:

    【解决方案3】:

    我用一个非常简单的方法解决了这个问题。 我的初始通知

    notification = new NotificationCompat.Builder(this, CALL_CHANNEL_ID)
                .setContentText("Incoming Voice Call")
                .setContentTitle(getDoctor().name)
                .setSmallIcon(R.drawable.ic_baseline_call_received_24)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setCategory(NotificationCompat.CATEGORY_CALL)
                .setShowWhen(true)
                .setUsesChronometer(true)
                .setFullScreenIntent(voicePendingIntent, true);
        startForeground(1, notification.build());
    

    存储服务启动时的时间戳

        public void startTimer() {
        if (!isTimerRunning) {
            startTime = System.currentTimeMillis();
            isTimerRunning = true;
        } else {
            Log.e(TAG, "startTimer request for an already running timer");
        }
    }
    

    每次调用 elapsedTime(),(通常在 Activity 中获取时间),通知都会更新。

        public long elapsedTime() {
        if (isTimerRunning()) {
            durationMillis = System.currentTimeMillis() - startTime;
            notification.setWhen(startTime);
            notification.setOnlyAlertOnce(true);
            notificationManager.notify(1, notification.build());
            return (durationMillis);
        } else {
            return 0;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多