Я понял, как это сделать, и мог бы помочь кому-то, пытающемуся сделать то же самое. Вот решение:
Как указано @SharpMoibileCode, при использовании помощников файловой системы Xamarin Essentials и, в частности, при сохранении записи с использованием пути FileSystem.AppDataDirectory она сохраняется во Internal Storage . Вот такой путь:
/ данные / пользователь / 0 / com.company.AppName / файлы / customsoundfilename.wav
Чтобы настроить звук push-уведомлений для канала во время выполнения, звуковой файл необходимо сохранить в Public External Storage , а именно Android.OS.Environment.ExternalStorageDirectory * 1016. * у которого есть такой путь:
/ хранение / эмулировать / 0 /.../
Теперь для записи / чтения в / из внешнего хранилища необходимы разрешения на запись во внешнее хранилище. Поэтому их необходимо добавить в манифест:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Но этого недостаточно. Разрешение необходимо запросить непосредственно перед тем, как получить доступ к внешнему хранилищу следующим образом (используя плагин NuGet «Текущий проект для Android», чтобы получить текущее действие):
var currentActivity = CrossCurrentActivity.Current.Activity;
int requestCode=1;
ActivityCompat.RequestPermissions(currentActivity, new string[] {
Manifest.Permission.ReadExternalStorage,
Manifest.Permission.WriteExternalStorage
}, requestCode);
если разрешение предоставлено, продолжить и скопировать файл на внешнее хранилище:
var recordingFileExternalPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, AppConstants.CUSTOM_ALERT_FILENAME);
if (ContextCompat.CheckSelfPermission(Android.App.Application.Context, Manifest.Permission.WriteExternalStorage) == (int)Permission.Granted)
{
try
{
if (File.Exists(recordingFileExternalPath))
{
File.Delete(recordingFileExternalPath);
}
File.Copy(filePath, recordingFileExternalPath);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
UserDialogs.Instance.Alert("Permission to write to External Storage not approved, cannot save settings.", "Permission Denied", "Ok");
}
А теперь, наконец, установите скопированный выше звук как уведомление для канала:
try
{
// the urgent channel
var urgentChannelName = GetString(Resource.String.noti_chan_urgent);
var urgentChannelDescription = GetString(Resource.String.noti_chan_urgent_description);
// set the vibration patterns for the channels
long[] urgentVibrationPattern = { 100, 30, 100, 30, 100, 200, 200, 30, 200, 30, 200, 200, 100, 30, 100, 30, 100, 100, 30, 100, 30, 100, 200, 200, 30, 200, 30, 200, 200, 100, 30, 100, 30, 100 };
// Creating an Audio Attribute
var alarmAttributes = new AudioAttributes.Builder()
.SetContentType(AudioContentType.Speech)
.SetUsage(AudioUsageKind.Notification).Build();
// Create the uri for the alarm file
var recordingFileDestinationPath = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, AppConstants.CUSTOM_ALERT_FILENAME);
Android.Net.Uri urgentAlarmUri = Android.Net.Uri.Parse(recordingFileDestinationPath);
var chan1 = new NotificationChannel(PRIMARY_CHANNEL_ID, urgentChannelName, NotificationImportance.High)
{
Description = urgentChannelDescription
};
// set the urgent channel properties
chan1.EnableLights(true);
chan1.LightColor = Color.Red;
chan1.SetSound(urgentAlarmUri, alarmAttributes);
chan1.EnableVibration(true);
chan1.SetVibrationPattern(urgentVibrationPattern);
chan1.SetBypassDnd(true);
chan1.LockscreenVisibility = NotificationVisibility.Public;
var manager = (NotificationManager)GetSystemService(NotificationService);
// create chan1 which is the urgent notifications channel
manager.CreateNotificationChannel(chan1);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}