サーチ…


備考

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インターフェイスのインスタンスが必要なときに使用できるようにします。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow