0

I just converted one of my apps to target Android API 9 (was targeting API 8); now when notifications are sent out, the volume of media is lowered and never comes back to full volume. The app uses WebView to play media files. This was not happening prior to targeting API 9. I had to convert the app into level 9 so that I could upload to the Google Play Store. I am running a Samsung S7 which was originally designed for API level 6 (with the OS upgraded to 8.0), not sure if that has something to do with the issue. Another detail is that I use Xamarin.Android for development, not sure if that matters either.

Additionally, I forced the notifications to play a blank sound (a very short[couple ms] blank mp3) in the same build that I converted the app to target API 9:

var channelSilent = new Android.App.NotificationChannel(CHANNEL_ID, name + " Silent", Android.App.NotificationImportance.High)
{
   Description = description
};

var alarmAttributes = new Android.Media.AudioAttributes.Builder()
                                    .SetContentType(Android.Media.AudioContentType.Sonification)
                                    .SetUsage(Android.Media.AudioUsageKind.Notification).Build()

//blank is blank mp3 file with nothing in it, a few ms in duration
 var uri = Android.Net.Uri.Parse("file:///Assets/blank.mp3")

channelSilent.SetSound(uri, alarmAttributes);

...so it could also be the blank sound that is causing the ducking to malfunction, not the API change. Is there something to do with notification sound ducking that could be causing the issue? Is there any other way to mute a notification with Xamarin.Android other than playing a blank sound? That is one route I think would be worth trying to fix this issue.

Here is the code I am using to generate notifications:

        private static List<CustomNotification> _sentNotificationList = new List<CustomNotification>();
        private static NotificationManagerCompat _notificationManager;

        public async void SendNotifications(List<CustomNotification> notificationList)
        {
            await Task.Run(() =>
            {
                try
                {
                    var _ctx = Android.App.Application.Context;

                    if (_notificationManager == null)
                    {
                        _notificationManager = Android.Support.V4.App.NotificationManagerCompat.From(_ctx);
                    }

                    if (notificationList.Count == 0)
                    {
                        return;
                    }
                    int notePos = 0;
                        foreach (var note in notificationList)
                        {
                            var resultIntent = new Intent(_ctx, typeof(MainActivity));
                            var valuesForActivity = new Bundle();
                            valuesForActivity.PutInt(MainActivity.COUNT_KEY, _count);
                            valuesForActivity.PutString("URL", note._noteLink);
                            resultIntent.PutExtras(valuesForActivity);
                            var resultPendingIntent = PendingIntent.GetActivity(_ctx, MainActivity.NOTIFICATION_ID, resultIntent, PendingIntentFlags.UpdateCurrent);
                            resultIntent.AddFlags(ActivityFlags.SingleTop);

                            var alarmAttributes = new Android.Media.AudioAttributes.Builder()
                                    .SetContentType(Android.Media.AudioContentType.Sonification)
                                    .SetUsage(Android.Media.AudioUsageKind.Notification).Build();

                            //I am playing this blank sound to prevent android from spamming sounds as the notifications get sent out
                            var uri = Android.Net.Uri.Parse("file:///Assets/blank.mp3");

                            //if the notification is the first in our batch then use this
                            //code block to send the notifications with sound
                            if (!_sentNotificationList.Contains(note) && notePos == 0)
                            {
                                var builder = new Android.Support.V4.App.NotificationCompat.Builder(_ctx, MainActivity.CHANNEL_ID + 1)
                                        .SetAutoCancel(true) 
                                        .SetContentIntent(resultPendingIntent) // Start up this activity when the user clicks the intent.
                                        .SetContentTitle(note._noteText) // Set the title
                                        .SetNumber(1) // Display the count in the Content Info
                                        .SetSmallIcon(Resource.Drawable.bitchute_notification2)
                                        .SetContentText(note._noteType)
                                        .SetPriority(NotificationCompat.PriorityMin);

                                MainActivity.NOTIFICATION_ID++;

                                _notificationManager.Notify(MainActivity.NOTIFICATION_ID, builder.Build());
                                _sentNotificationList.Add(note);
                                 notePos++;
                            }
                            //if the notification isn't the first in our batch, then use this
                            //code block to send the notifications without sound
                            else if (!_sentNotificationList.Contains(note))
                            {
                                var builder = new Android.Support.V4.App.NotificationCompat.Builder(_ctx, MainActivity.CHANNEL_ID)
                                    .SetAutoCancel(true) // Dismiss the notification from the notification area when the user clicks on it
                                    .SetContentIntent(resultPendingIntent) // Start up this activity when the user clicks the intent.
                                    .SetContentTitle(note._noteText) // Set the title
                                    .SetNumber(1) // Display the count in the Content Info
                                    .SetSmallIcon(Resource.Drawable.bitchute_notification2)
                                    .SetContentText(note._noteType)
                                    .SetPriority(NotificationCompat.PriorityHigh);

                                 MainActivity.NOTIFICATION_ID++;

                                 _notificationManager.Notify(MainActivity.NOTIFICATION_ID, builder.Build());
                                 _sentNotificationList.Add(note);
                                 notePos++;
                            }

                            ExtStickyService._notificationsHaveBeenSent = true;
                    }
                }
                catch
                {

                }
            });
        }

In my MainActivity I've created two different notification channels: one is silent; the other uses default notification setting for the device:


        void CreateNotificationChannel()
        {
            var alarmAttributes = new Android.Media.AudioAttributes.Builder()
                .SetContentType(Android.Media.AudioContentType.Sonification)
                    .SetUsage(Android.Media.AudioUsageKind.Notification).Build();

            var uri = Android.Net.Uri.Parse("file:///Assets/blank.mp3");

            if (Build.VERSION.SdkInt < BuildVersionCodes.O)
            {
                // Notification channels are new in API 26 (and not a part of the
                // support library). There is no need to create a notification
                // channel on older versions of Android.
                return;
            }

            var name = "BitChute";
            var description = "BitChute for Android";
            var channelSilent = new Android.App.NotificationChannel(CHANNEL_ID, name + " Silent", Android.App.NotificationImportance.High)
            {
                Description = description
            };

            var channel = new Android.App.NotificationChannel(CHANNEL_ID + 1, name, Android.App.NotificationImportance.High)
            {
                Description = description
            };

            channel.LockscreenVisibility = NotificationVisibility.Private;
            //here is where I set the sound for the silent channel... this could be the issue?
            var notificationManager = (Android.App.NotificationManager)GetSystemService(NotificationService);
            channelSilent.SetSound(uri, alarmAttributes);
            notificationManager.CreateNotificationChannel(channel);
            notificationManager.CreateNotificationChannel(channelSilent);
        }

Full source: https://github.com/hexag0d/BitChute_Mobile_Android_BottomNav/tree/APILevel9

EDIT: something really interesting is that if I pulldown the system ui bar, the volume goes back to normal. Very strange workaround but it might help diagnose the cause.

DOUBLE EDIT: I used .SetSound(null, null) instead of using the blank .mp3 and the ducking works fine now. See comments

hexagod
  • 449
  • 3
  • 15
  • I download your sample, but I don't see where did you send notification? I just see different fragment, and some fragments load video using ExtWebViewClient. – Cherry Bu - MSFT Nov 18 '19 at 07:27
  • @CherryBu-MSFT thanks for your help but I figured out how to fix the issue. Instead of playing a blank .mp3 I am now using `.SetSound(null, null)` and there is no ducking. However, that still doesn't answer the question of why the audio never came back. I am also curious why the sound ducking didn't work as designed. – hexagod Nov 19 '19 at 02:21

0 Answers0