Как воспроизвести собственный звук в Xamarin.Forms на Android с помощью Local Notifications / Notification.Builder - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь воспроизвести собственный звук на платформе Android, когда отображается локальное уведомление, приведенный ниже код основан на Xamarin Документация по локальным уведомлениям , но некоторые поля, на которые я нахожусь, являютсяустарел / устарел.

В частности, SetSound ?

Однако я пытался использовать SetSound в надежде, что он все еще может работать, даже если устарел.Но я не уверен, как ссылаться на файлы mp3 в папке Android / Xamarin 'Asset' или на копию, находящуюся в папке Android / Xamarin 'Resources / raw'.

/ Содержимое актива имеет действие сборки AndroidAsset

/ Ресурсы / сырое содержимое имеет действие сборки AndroidResource

Эта строка вызывает у меня головную боль ...

.SetSound (Android.Net.Uri.Parse ("android.resource: //MyAssemblyName.Droid/Assets/filename"));

также пробовал

.SetSound (Android.Net.Uri.Parse ("android.resource: //MyAssemblyName.Resources/raw/filename"));

Q1) Что мне нужно сделать, чтобы правильно воспроизвести пользовательский звук уведомлений, используя либо ресурсы, либоПапка ресурсов?

Q2) Поскольку SetSound устарел, что мне делать вместо этого?

Я обманул, частично успешно, у меня есть плагин Xamarin, который воспроизводит звуки, который ссылается на те же файлы в переносимой библиотеке классов (PCL), и этот механизм работает (без комментариев), но только еслиприложение находится на переднем плане.

Кажется, что мои запланированные локальные уведомления не срабатывают, если я проведу пальцем, чтобы «убить» приложение, даже если приложение не умрет, потому что у меня есть постоянное уведомление, которое предотвращает закрытие приложения (до определенного времени вбудущее, которое выпускает постоянное уведомление, которое может быть через несколько минут).

Q3) Почему запланированные локальные уведомления не срабатывают, когда пользователь выполняет перелистывание приложения, даже если постоянное системное уведомление поддерживает его работу?Вот как настроено это постоянное уведомление.Если бы не эта проблема, я мог бы, вероятно, обойтись с хаком, описанным выше, для воспроизведения звука с PCL.

        var activity = new Intent(Android.App.Application.Context, typeof(MainActivity));
        var pIntent = PendingIntent.GetActivity(this, 0, activity, 0);

        var notification = new Notification.Builder(this)
            .SetContentTitle("Persistent Notification Test")
            .SetContentText("This is always running to ensure that you are safe.")
            .SetSmallIcon(Resource.Drawable.icon)
            .SetOngoing(true)
            .SetDefaults(0) // no sounds
            .SetContentIntent(pIntent)
            .Build();

        // Enlist this instance of the service as a foreground service
        StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notification);

Для тех, кому интересно, закомментированная строка

// PlatformDifferences.PlaySound(soundFilename, Logger);

вызывает этот метод, который использует плагин SimpleAudioPlayer

    public virtual void PlaySound(string soundFilenameExcludingPath, Logger logger) {
        var assembly = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;

        Stream audioStream = assembly.GetManifestResourceStream("<my-pcl-assembly-name>.Sounds." + soundFilenameExcludingPath);
            if (audioStream != null)
            {
                logger.Log(this, "playing sound:" + soundFilenameExcludingPath);
                var player = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
                player.Load(audioStream);
                player.Play();
            }
            else
            {
                logger.Log(this, "failed - playing sound:" + soundFilenameExcludingPath);
            }
    }

Вот скриншот, который показывает структуру моего проекта

Screenshot of resource and asset folder with code snippet

И вот метод, который я вызываю всякий раз, когда я хочу отобразить уведомление, будь то из-за того, что я хотел запланированного локального уведомления, или потому что я получил push-уведомление и хочу показать детали пользователю.

1 Ответ

0 голосов
/ 30 мая 2018

Пожалуйста, обратитесь к комментариям от @ SushiHangover

Ваш снимок экрана показывает устройство API-27, и если targetSdkVersion был установлен, вам потребуется использовать NotificationChannels (вам нужно, если /еще тестируем уровни API как в моем связанном примере).Я видел много разных типов сбоев уведомлений на разных (API-26 +) устройствах, даже уведомления в эмуляторах ведут себя по-разному, если не использовать NotificationChannels.

...