Я пытаюсь воспроизвести собственный звук на платформе 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);
}
}
Вот скриншот, который показывает структуру моего проекта
И вот метод, который я вызываю всякий раз, когда я хочу отобразить уведомление, будь то из-за того, что я хотел запланированного локального уведомления, или потому что я получил push-уведомление и хочу показать детали пользователю.