Flutter: непрерывный звук уведомлений + вибрация работает на переднем плане, но не при закрытии приложения (с использоваAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Flutter: непрерывный звук уведомлений + вибрация работает на переднем плане, но не при закрытии приложения (с использова

Сообщение Anonymous »

Я пытаюсь реализовать непрерывный звуковой сигнал с вибрацией для определенного типа уведомления (заказ получен).
Требование
При получении заказа:
  • Воспроизводить непрерывный повторяющийся звук
  • Включить повторяющуюся вибрацию
  • Должно работать, даже если приложение полностью закрыто.
  • Останавливаться только при взаимодействии пользователя (принять/отклонить)
Текущая настройка
Я использую: Текущее поведение
✅ Работает, когда приложение находится на переднем плане

✅ Работает, когда приложение находится в фоновом режиме

❌ НЕ работает, когда приложение закрыто
Когда приложение закрыто:
  • Приходит уведомление
  • Код: Выделить всё

    onMessageReceived()
    срабатывает
  • Служба переднего плана запускается
  • Но непрерывный звук НЕ воспроизводится
Обработка FCM (Android)

Код: Выделить всё

class MyFirebaseMessagingService : FirebaseMessagingService() {

override fun onMessageReceived(remoteMessage: RemoteMessage) {

val data = remoteMessage.data
val sellerScreen = data["sellerScreen"]
val driverScreen = data["driverScreen"]
val orderId = data["orderId"]

val shouldPlaySound =
sellerScreen == "5" || driverScreen == "1"

if (shouldPlaySound) {
playNotificationSound(orderId)
}
}

private fun playNotificationSound(orderId: String?) {

val intent = Intent(this, OrderAlertForegroundService::class.java).apply {
action = OrderAlertForegroundService.ACTION_START
putExtra(OrderAlertForegroundService.EXTRA_ORDER_ID, orderId)
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
}
}
Служба переднего плана

Код: Выделить всё

class OrderAlertForegroundService : Service() {

private var mediaPlayer: MediaPlayer? = null
private var vibrator: Vibrator? = null

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

startForeground(9999, createNotification())
startContinuousSound("order")

return START_NOT_STICKY
}

private fun startContinuousSound(soundFileName: String) {

val resourceId = resources.getIdentifier(
soundFileName,
"raw",
packageName
)

mediaPlayer = MediaPlayer.create(this, resourceId)?.apply {
setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build()
)
isLooping = true
start()
}

vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

val pattern = longArrayOf(0, 1000, 500)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
vibrator?.vibrate(
VibrationEffect.createWaveform(pattern, 0)
)
} else {
vibrator?.vibrate(pattern, 0)
}
}

override fun onDestroy() {
mediaPlayer?.stop()
mediaPlayer?.release()
vibrator?.cancel()
super.onDestroy()
}
}
Вытачка (упрощенная)

Код: Выделить всё

FirebaseMessaging.onMessage.listen(_handleForeground);
FirebaseMessaging.onMessageOpenedApp.listen(_handleBackground);
FirebaseMessaging.instance.getInitialMessage().then(_handleInitial);
Фоновый обработчик (в настоящее время отключен):

Код: Выделить всё

Future  firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await OrderAlertChannel.startOrderAlert(
alertType: 'background_fcm',
orderId: message.data['orderId'] ?? 'unknown',
);
}
Важные примечания

Вопросы
  • Ограничивает ли Android воспроизведение звука при полном закрытии приложения?
  • Может ли служба переднего плана надежно запускаться из FirebaseMessagingService отключена состояние?
  • Существует ли более правильный подход к реализации непрерывных уведомлений в стиле будильника, например Swiggy/Zomato?
  • Следует ли это реализовать с использованием полноэкранного намерения + категории будильника вместо этого?
Цель
Я хочу, чтобы уведомление работало как настоящее оповещение о входящем заказе в стиле будильника, даже если:
  • Приложение закрыто
  • Экран выключен
  • Устройство заблокировано
Если кто-либо внедрил постоянные тревожные уведомления от FCM в Flutter (завершенное состояние), пожалуйста, помогите.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -but-not-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»