xamarin - 在手机 xamarin 表单上播放标准/系统声音
问题描述
是否有标准的跨平台方式在 Xamarin Forms iOS 和 Android 上播放 250 毫秒左右的“叮当”?
马克·沃德尔
解决方案
您可以使用DependencyService在每个平台播放默认的系统通知声音。
创建IPlaySoundService接口:
public interface IPlaySoundService
{
void PlaySystemSound();
}
在iOS中实现该PlaySystemSound
方法如下:
[assembly: Xamarin.Forms.Dependency(typeof(PlaySoundService))]
namespace AppCarouselViewSample.iOS
{
public class PlaySoundService : IPlaySoundService
{
public void PlaySystemSound()
{
var sound = new SystemSound(1000);
sound.PlaySystemSound();
}
}
}
在Android中实现该PlaySystemSound
方法如下:
[assembly:Xamarin.Forms.Dependency(typeof(PlaySoundService))]
namespace AppCarouselViewSample.Droid
{
public class PlaySoundService : IPlaySoundService
{
public void PlaySystemSound()
{
Android.Net.Uri uri = RingtoneManager.GetDefaultUri(RingtoneType.Ringtone);
Ringtone rt = RingtoneManager.GetRingtone(MainActivity.instance.ApplicationContext, uri);
rt.Play();
}
}
}
这是instance
来自MainActivity的定义:
namespace xxx.Droid
{
[Activity(Label = "AppCarouselViewSample", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static MainActivity instance { set; get; }
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
instance = this;
Xamarin.Forms.Forms.SetFlags(new string[] { "CarouselView_Experimental", "SwipeView_Experimental", "IndicatorView_Experimental" });
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
...
}
然后他们将在每个平台播放默认通知声音。您可以SystemSoundID
在 iOS 中进行修改以适合您的需要。这里是声音 ID 列表。
推荐阅读
- javascript - 从 mongoose 文档中获取普通的 javascript 对象(或 JSON-ready 对象)
- c# - 如何使用 GoogleARCore Wrappers (CS0121) 消除那些模棱两可的调用错误
- php - Laravel 批量插入或更新失败
- android - 区分 OnTouchListener 中的短按(单击)和长按
- python - 我们可以使用 eval 函数来获取用户创建的列表吗?
- python - 为什么在 TF 2.0 和 1.15 上训练 DCGAN 时结果会不同?
- javascript - 如何使用酶作为实例()测试功能组件内部的方法,为浅包装器返回 null?
- php - 从 php 返回的 Android 读取数组
- typescript - 无法使用 `ts-node` 在 expo 上运行脚本(react-native)
- java - 在不同的计算机上出现此错误:源服务器没有找到当前的表示