如何在没有通知图标闪烁的情况下更新通知进度 (update in progress)

在我的 Android 应用程序中,我正在下载Foreground Service中的文件。在开始下载之前,我正在显示进度为 0 的通知,然后在NotificationBuilder中更新进度。我面临的问题是通知小图标在NotificationBuilder中更新时保持闪烁,即使我正在重复使用相同的NotificationBuilder。我也设置了setOngoing=true

在我的 Android 应用程序中,我正在下载Foreground Service中的文件。在开始下载之前,我正在显示进度为 0 的通知,然后在NotificationBuilder中更新进度。我面临的问题是通知小图标在NotificationBuilder中更新时保持闪烁,即使我正在重复使用相同的NotificationBuilder。我也设置了setOngoing=true

下面是我的代码

import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import androidx.annotation.Nullable
import androidx.core.app.NotificationCompat
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import java.util.*
class ForegroundService() : Service() {
    val testPathDir = "/storage/emulated/0/MyAppFolder”
    val testVideoLink =
        "https://scontent.fisb6-2.fna.fbcdn.net/v/t66.36240-6/121382477_483887163110055_1614404568115456703_n.mp4?_nc_cat=104&ccb=1-5&_nc_sid=985c63&efg=eyJ2ZW5jb2RlX3RhZyI6Im9lcF9zZCJ9&_nc_ohc=hxnnGTvs10gAX_4BaOw&_nc_ht=scontent.fisb6-2.fna&oh=00_AT9SCG-m8bEJsfsyFNKQEZZFcG7JdiNcL05cZjoPekq1Eg&oe=621C0873"
    private val notificationManager =
        MyApplication.applicationContext()
            .getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    private var totalProgress = 0L
    private var maxProgress = 100
    override fun onCreate() {
        super.onCreate()
    }
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        val notificationId: Int = intent.getIntExtra("notificationId", 0)
        val channelId =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                createNotificationChannel(
                    "my_service123", "My Background Service124",
                    NotificationManager.IMPORTANCE_HIGH,
                    MyApplication.applicationContext()
                )
            } else {
                "my_service123"
            }
        val notificationBuilder = NotificationCompat.Builder(
            MyApplication.applicationContext(),
            channelId
        )
        notificationBuilder
            .setContentTitle("Downloading")
            .setTicker("Downloader")
            .setSmallIcon(R.drawable.ic_icon_1_copy_2)
            .setOngoing(true)
            .setProgress(100, 0, false)
            .build()
        startForeground(notificationId, notificationBuilder.build());
        notificationManager.notify(notificationId, notificationBuilder.build())
        //do heavy work on a background thread
        downlaodVideo(notificationId, notificationBuilder)
        return START_NOT_STICKY
    }
    override fun onDestroy() {
        super.onDestroy()
    }
    @Nullable
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }
    
    private fun updateNotification(
        notificationId: Int,
        currentProgress: Int,
        notificationBuilder: NotificationCompat.Builder
    ) {
        notificationBuilder.setProgress(maxProgress, currentProgress, false)
        notificationManager.notify(notificationId, notificationBuilder.build())
    }
    private fun downlaodVideo(
        notificationId: Int,
        notificationBuilder: NotificationCompat.Builder
    ) {
        val testFileName = Random(System.currentTimeMillis()).nextInt(1000).toString() + ".mp4"
        PRDownloader.download(testVideoLink, testPathDir, testFileName.toString())
            .build()
            .setOnStartOrResumeListener {
                Thread.sleep(150)
            }
            .setOnPauseListener { }
            .setOnCancelListener { }
            .setOnProgressListener {
                totalProgress = it.totalBytes
                val currentProgress = (it.currentBytes * 100 / totalProgress).toInt()
                updateNotification(notificationId, currentProgress, notificationBuilder)
            }
            .start(object : OnDownloadListener {
                override fun onDownloadComplete() {
                    val doneNotifId = Random(System.currentTimeMillis()).nextInt(1000)
                    showNotification(
                        MyApplication.applicationContext(),
                        doneNotifId,
                        "test",
                        "mp4",
                        testVideoLink
                    )
                    stopForeground(true)
                }
                override fun onError(error: com.downloader.Error?) {
                    val errMsg = error?.serverErrorMessage
                }
            })
    }
}

有人可以帮我吗?任何帮助将不胜感激。

非常感谢。

0

尝试将.setOnlyAlertOnce(true)添加到通知生成器

notificationBuilder
        .setContentTitle("Downloading")
        .setTicker("Downloader")
        .setSmallIcon(R.drawable.ic_icon_1_copy_2)
        .setOngoing(true)
        .setOnlyAlertOnce(true)
        .setProgress(100, 0, false)
        .build()
See thedocumentation

您可以选择调用 setOnlyAlertOnce(),以便您的通知仅在通知首次出现时中断用户(声音,振动或视觉线索),而不是以后的更新。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(676)
从表中的“最后”N行获取平均值
上一篇
在颤振中单击 TextFormField后关闭键盘
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(34条)