Android 实施
Android 特定的实现有点复杂,因为它迫使你继承本机 Java.Lang.Object
并强制你实现 IOnInitListener
接口。Android 要求你为其公开的许多 SDK 方法提供有效的 Android 上下文。Xamarin.Forms 公开了一个 Forms.Context
对象,它为你提供了在这种情况下可以使用的 Android 上下文。
using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;
public class TextToSpeechAndroid : Java.Lang.Object, ITextToSpeech, TextToSpeech.IOnInitListener
{
TextToSpeech _speaker;
public TextToSpeechAndroid () {}
public void Speak (string whatToSay)
{
var ctx = Forms.Context;
if (_speaker == null)
{
_speaker = new TextToSpeech (ctx, this);
}
else
{
var p = new Dictionary<string,string> ();
_speaker.Speak (whatToSay, QueueMode.Flush, p);
}
}
#region IOnInitListener implementation
public void OnInit (OperationResult status)
{
if (status.Equals (OperationResult.Success))
{
var p = new Dictionary<string,string> ();
_speaker.Speak (toSpeak, QueueMode.Flush, p);
}
}
#endregion
}
创建类后,你需要启用 DependencyService
以在运行时发现它。这是通过在类定义之上添加 [assembly]
属性并在任何命名空间定义之外添加来完成的。
using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechAndroid))]
namespace DependencyServiceSample.Droid {
...
该属性使用 DependencyService
注册该类,因此可以在需要 ITextToSpeech
接口的实例时使用。