I\'m working on an app where using two switch buttons the user can turn on/off notifications and notification sound. I created the notifications that pop up on the status bar an
You should define a flag to toggle the sound on/off. This could be a boolean value controlled by the second switch. Then check the status of that flag when creating the notification and decide to set or not the sound.
And maybe split the Notification
from the NotificationBuilder
to control the sound.
1- Create the flag being a Class attribute
Switch simpleswitch1;
Switch simpleswitch2;
private Notification notification;
NotificationManager manager;
Notification myNotication;
// Sound disabled by default
boolean enableSound = false;
2- Control the flag with the second switch
simpleswitch2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
enableSound = isChecked;
}
});
3- Use the NotificationBuilder
to control the sound. Replace this piece of code from first switch
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Settings.this, CHANNEL_ID);
notificationBuilder.setSmallIcon(R.drawable.notification);
notificationBuilder.setContentTitle("NOTIFICATION TITLE");
notificationBuilder.setContentText("You have a new notification");
notificationBuilder.setChannelId(CHANNEL_ID);
if (enableSound){
notificationBuilder.setSound(android.provider.Settings.System.DEFAULT_NOTIFICATION_URI);
notificationBuilder.setVibrate(new long[]{1000,100});
}
Notification notification = notificationBuilder.build();
I hope it helps!
I think I know why it's not playing a sound. I've just created a new Android Studio Project and copy-paste your code and the notifications is fired, the sound plays and I can not turn the sound off (just the oppostite). And I'm guessing your problem is related to the notification channel. Then I modify my App and it worked!
First, let me correct myself. The PRIORITY
has been deprecated since api level 26 (which you are using according to @TargetApi(Build.VERSION_CODES.O)
) and what you should use instead is the IMPORTANCE
in the NotificationChannel
. The problem with a notification channel is that you can not edit it once created (unless you uninstall your app). So if at first you where using a low importance channel and then change it to a high one it won't take any effect.
So what you really need is two notifications channel: one with sound and one silent, and then select the appropiate channel with the help of the previously created flag.
So now, the code for the first switch would be: Notice I re-arrange it so I first create the NotificationChannel (for better readability)
if (isChecked){
int notifyID = 1;
String CHANNEL_SOUND_ID = "channel SOUND";// The id of the channel.
CharSequence NAME_SOUND = "channel 1";// The user-visible name of the channel.
String CHANNEL_SILENT_ID = "channel SILENT";// The id of the channel.
CharSequence NAME_SILENT = "channel 2";// The user-visible name of the channel.
int importance_sound = NotificationManager.IMPORTANCE_HIGH;
int importance_silent = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel_sound = new NotificationChannel(CHANNEL_SOUND_ID, NAME_SOUND, importance_sound);
NotificationChannel mChannel_silent = new NotificationChannel(CHANNEL_SILENT_ID, NAME_SILENT, importance_silent);
// Crete both notification channels
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.createNotificationChannel(mChannel_sound);
mNotificationManager.createNotificationChannel(mChannel_silent);
Intent intent = new Intent(Settings.this, Visitor.class);
intent.putExtra("yourpackage.notifyId", notifyID);
PendingIntent pIntent = PendingIntent.getActivity(Settings.this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
// Select the correct notification channel
String selectedChannelId;
if (enableSound){
selectedChannelId = CHANNEL_SOUND_ID;
}else{
selectedChannelId = CHANNEL_SILENT_ID;
}
// Create a notification and set the notification channel.
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Settings.this, selectedChannelId);
notificationBuilder.setSmallIcon(R.drawable.notification);
notificationBuilder.setContentTitle("Title");
notificationBuilder.setContentText("Notification Text");
notificationBuilder.setContentIntent(pIntent);
notificationBuilder.setChannelId(selectedChannelId);
Notification notification = notificationBuilder.build();
// Issue the notification.
mNotificationManager.notify(notifyID , notification);
}