0

在我的 Android 应用程序中,我正在下载Foreground Service. 在开始下载之前,我会显示一个进度为 0 的通知,然后更新进度NotificationBuilder。我面临的问题是通知小图标在更新进度时不断闪烁,NotificationBuilder即使我正在重复使用相同的NotificationBuilder。我也设置setOngoing=true了,但这不起作用,也尝试设置setOnlyAlertOnce=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
                }

            })
    }
}

有人可以帮我解决这个问题吗?任何帮助将不胜感激。

谢谢

4

1 回答 1

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

请参阅文档

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

于 2022-02-25T07:04:04.127 回答