I am building a mobile app using flutter and I a struggling with grouping the notifications on android. I have it working fine on ios but not on android. Here is the code I am working with below for groupchats:
flutterLocalNotificationsPlugin.show(
notificationId++,
response.message.text == '' ? 'Message from ${response.message.user?.name} in liveroom'
: '${response.message.user?.name} in liveroom',
response.message.text,
NotificationDetails(
android: AndroidNotificationDetails(
cid,
cid,
groupKey: cid,
channelDescription: cid,
),
iOS: IOSNotificationDetails(
threadIdentifier: cid
)
),
);
And here is the code i am working with for one on one messaging:
flutterLocalNotificationsPlugin.show(
notificationId++,
response.message.text == '' ? 'Message from ${response.message.user?.name}'
: '${response.message.user?.name}',
response.message.text,
NotificationDetails(
android: AndroidNotificationDetails(
cid,
cid,
groupKey: cid,
channelDescription: cid,
setAsGroupSummary: true
),
iOS: IOSNotificationDetails(
threadIdentifier: response.message.user?.name
)
),
);
The cid is the channel id and it unique for each group chat. It is also unique for each message thread between two people. I am trying to collapse the notifications from one person into one group. And also collapse the notifications from one group chat into one group (this is the behvaiour on ios based on the code above and i would like to replicate for android).
Related
I have a flutter app that uses local notifications https://pub.dev/packages/flutter_local_notifications.
I have a notification that is set to a certain date :
await flutterLocalNotificationsPlugin.initialize(initializationSettings,
onDidReceiveNotificationResponse: (NotificationResponse response) async {
print("FOREGORUND");
},
onDidReceiveBackgroundNotificationResponse: notificationTapBackground,
);
await flutterLocalNotificationsPlugin.zonedSchedule(
uid.hashCode,
title,
desc,
timez.TZDateTime.from(datex, timez.local),
NotificationDetails(
android: AndroidNotificationDetails(
'your channel id', 'your channel name',
channelDescription: 'your channel description',
actions: <AndroidNotificationAction>[
AndroidNotificationAction(
"CompleteID",
"Complete",
icon: DrawableResourceAndroidBitmap('complete_img'),
showsUserInterface: false,
cancelNotification: true,
),
],)
),
payload: uid,
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime);
When I click on the complete action from the notification, the app calls "notificationTapBackground" even if the app is in foreground, so from notificationTapBackground isolate thread i can' t call setstate inside my app.
I would like to be able to click on the complete action from the notification and have :
the app calls notificationTapBackground, if the app is in the background
the app calls onDidReceiveNotificationRespons, if the app is in the foreground
all with the parameter showsUserInterface: false, inside notification actions.
So I have this app in flutter, in which there are two textfeilds.
One is 'Reminder title' and another is the description/message.
Now what I want is that to push a notification with the information from the textfeilds.
And I want the notification to be there until I mark it as done from the app.
Now I have been using flutter_local_notifications. But I have been getting errors by following their documentations. Actually no notification came after pressing the button.
I need help with some code to achieve the following purpose.
We can use awesome_notifications for this purpose, in case firebase and flutter_local_notification becomes problematic.
Basically you have to initialize a channel:
import 'package:awesome_notifications/awesome_notifications.dart';
AwesomeNotifications().initialize(
// set the icon to null if you want to use the default app icon
'resource://drawable/res_app_icon',
[
NotificationChannel(
channelGroupKey: 'basic_channel_group',
channelKey: 'basic_channel',
channelName: 'Basic notifications',
channelDescription: 'Notification channel for basic tests',
defaultColor: Color(0xFF9D50DD),
ledColor: Colors.white)
],
// Channel groups are only visual and are not required
channelGroups: [
NotificationChannelGroup(
channelGroupkey: 'basic_channel_group',
channelGroupName: 'Basic group')
],
debug: true
);
and then create desired notification by =>
AwesomeNotifications().createNotification(
content: NotificationContent(
id: 10,
channelKey: 'basic_channel',
title: 'Simple Notification',
body: 'Simple body'
)
);
Read their documentation for more information.
And here is their video tutorial.
On Android, I want to be able to show a persistent notification with two buttons even when the app is in the background or when the phone is locked. Basically, like a WhatsApp incoming call notification.
I know how to do it in Java but I don't know how to do it in Flutter. I've read similar questions on SO but none have provided a good answer.
FYI, I know how to send and receive FCM notifications. I know how to display a normal notification when a FCM message is sent while the app is in the background.
After wasting an entire week, here is the solution I found.
Keep your app running in the background and make sure it is not closed by the user. This tutorial explains how to do it: https://github.com/ppicas/flutter-android-background
If the solution above is too complicated, use the flutter_background to do more or less the same thing (the first solution is better because it also prevents the user from closing the app).
Make sure the flutter activity can be displayed over the lock screen by adding this to your activity's declaration in your manifest:
android:showWhenLocked="true"
Last thing is to use a wakelock in flutter when your app receives a notification, and you want to display a full screen "call received" widget.
You can use firebase_messaging and awesome_notifications
add this in your firebase background subscription handler
await AwesomeNotifications().createNotification(
content: NotificationContent(
id: createuniqueId(),
channelKey: 'basic_channel',
title: message.data['title'],
body: message.data['body'],
wakeUpScreen: true,
fullScreenIntent: true,
autoDismissible: false,
category: NotificationCategory.Call,
locked: true,
displayOnForeground: true,
),
actionButtons: [
NotificationActionButton(
key: 'accept',
label: 'Accept',
),
NotificationActionButton(
isDangerousOption: true,
key: 'reject',
label: 'Reject',
),
],
);
add this is your main()
AwesomeNotifications().initialize(
'resource://drawable/ic_icon',
[
NotificationChannel(
channelKey: 'basic_channel',
channelName: 'Basic Notification',
channelDescription: 'Hello world',
importance: NotificationImportance.High,
channelShowBadge: true,
vibrationPattern: highVibrationPattern
),
]
);
I am new to flutter. Recently I am doing an app whose main function is add reminders to the Calendar. I am now using the "device_calendar" package to add events into the Calendar app, the problem is that I can create an event but I just can't create a reminder to the event. For example, I created an event at 4:30 p.m., I can only see it in the Calendar App, it won't remind me when it actually comes to 4:30 p.m., which causes a lot of inconvenience.
Can someone tell me how to add reminders using "device_calendar" package, or just tell me some methods about adding events and reminders into the Calendar App with flutter.
Thanks in advance!
I think you can handle with flutter_local_notification
Schedule localnotification:
var scheduledNotificationDateTime =
new DateTime.now().add(new Duration(seconds: 5));
var androidPlatformChannelSpecifics =
new AndroidNotificationDetails('your other channel id',
'your other channel name', 'your other channel description');
var iOSPlatformChannelSpecifics =
new IOSNotificationDetails();
NotificationDetails platformChannelSpecifics = new NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.schedule(
0,
'scheduled title',
'scheduled body',
scheduledNotificationDateTime,
platformChannelSpecifics);
I'm using flutter_local_notifications, and to create a notfication (let's focus on android ) you do the following:
var androidPlatformChannelSpecifics =
new AndroidNotificationDetails(
'your other channel id',
'your other channel name',
'your other channel description');
var iOSPlatformChannelSpecifics =
new IOSNotificationDetails();
NotificationDetails platformChannelSpecifics = new NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
As you can see in the android case you provide 3 parameters related to a channel
So my quesiton is what this channel is used for and why in android we need to provide an id, a name and a description to it ?
notification channels give us the ability to group notifications and let user interact with those channels.
Let's assume you are building a chat application, you can group messages coming from Alice under channel channel-alice, and you can only mute channel-alice or do different actions to it.
Channels are required after API level 26.