Xamarin.Forms
DependencyService
サーチ…
備考
DependencyService
を使用する場合、通常は3つの部分が必要です。
- インタフェース - 抽象化したい機能を定義します。
- プラットフォーム実装 - 以前定義されたインタフェースを実装する各プラットフォーム固有のプロジェクト内のクラス。
- 登録 - 各プラットフォーム固有の実装クラスは、メタデータ属性を介して
DependencyService
登録する必要があります。これにより、DependencyService
は実行時に実装を見つけることができます。
DependencyService
を使用する場合は、ターゲットプラットフォームごとに実装を提供する必要があります。実装が提供されていない場合、アプリケーションは実行時に失敗します。
インタフェース
インタフェースは、 DependencyService
介して公開する動作を定義します。 DependencyService
1つの使用例は、テキスト・ツー・スピーチ・サービスである。現在のところ、Xamarin.Formsではこの機能の抽象化がないため、独自に作成する必要があります。ビヘイビアのインタフェースを定義することから始めます。
public interface ITextToSpeech
{
void Speak (string whatToSay);
}
インタフェースを定義するので、共有コードからそのインタフェースをコーディングすることができます。
注意:インタフェースを実装するクラスでは、 DependencyService
を操作するためのパラメータのないコンストラクタが必要です。
iOSの実装
定義したインタフェースは、すべての対象プラットフォームで実装する必要があります。 iOSの場合、これはAVFoundation
フレームワークによって行われます。次のITextToSpeech
インターフェイスの実装では、英語のテキストをスピーチします。
using AVFoundation;
public class TextToSpeechiOS : ITextToSpeech
{
public TextToSpeechiOS () {}
public void Speak (string whatToSay)
{
var speechSynthesizer = new AVSpeechSynthesizer ();
var speechUtterance = new AVSpeechUtterance (whatToSay) {
Rate = AVSpeechUtterance.MaximumSpeechRate/4,
Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
Volume = 0.5f,
PitchMultiplier = 1.0f
};
speechSynthesizer.SpeakUtterance (speechUtterance);
}
}
クラスを作成したら、実行時にDependencyService
を検出できるようにする必要があります。これは、 [assembly]
属性をクラス定義の上に追加し、名前空間の定義の外に追加することによって行われます。
using AVFoundation;
using DependencyServiceSample.iOS;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechiOS))]
namespace DependencyServiceSample.iOS {
public class TextToSpeechiOS : ITextToSpeech
...
この属性はクラスをDependencyService
登録し、 ITextToSpeech
インターフェイスのインスタンスが必要なときに使用できるようにします。
共有コード
プラットフォーム固有のクラスを作成して登録したら、それらを共有コードにフックすることができます。次のページには、定義済みの文章を使用してテキスト読み上げ機能をトリガーするボタンが含まれています。これは、ネイティブSDKを使用して、実行時にDependencyService
を使用してITextToSpeech
プラットフォーム固有の実装を取得します。
public MainPage ()
{
var speakButton = new Button {
Text = "Talk to me baby!",
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.CenterAndExpand,
};
speakButton.Clicked += (sender, e) => {
DependencyService.Get<ITextToSpeech>().Speak("Xamarin Forms likes eating cake by the ocean.");
};
Content = speakButton;
}
このアプリケーションをiOSまたはAndroidデバイスで実行し、ボタンをタップすると、アプリケーションが特定の文章を話すのが聞こえます。
Androidの実装
Android固有の実装は、ネイティブのJava.Lang.Object
から継承する必要があり、 IOnInitListener
インタフェースを実装する必要があるため、 IOnInitListener
です。 Androidでは、公開する多くのSDKメソッドに対して有効なAndroidコンテキストを提供する必要があります。 Xamarin.Formsは、そのような場合に使用できるAndroidコンテキストを提供するForms.Context
オブジェクトを公開します。
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
インターフェイスのインスタンスが必要なときに使用できるようにします。