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 介面的例項時使用。