Szukaj…


Uwagi

Podczas korzystania z usługi DependencyService zazwyczaj potrzebujesz 3 części:

  • Interfejs - określa funkcje, które chcesz wydzielić.
  • Implementacja platformy - klasa w ramach każdego projektu specyficznego dla platformy, która implementuje wcześniej zdefiniowany interfejs.
  • Rejestracja - każda klasa implementacji specyficzna dla platformy musi zostać zarejestrowana w DependencyService za pomocą atrybutu metadanych. Dzięki temu DependencyService może znaleźć implementację w czasie wykonywania.

Korzystając z usługi DependencyService musisz podać implementację dla każdej platformy, na którą kierujesz. Jeśli implementacja nie zostanie zapewniona, aplikacja przestanie działać w czasie wykonywania.

Berło

Interfejs określa zachowanie, które chcesz ujawnić za pośrednictwem usługi DependencyService . Jednym z przykładów użycia usługi DependencyService jest usługa zamiany tekstu na mowę. Obecnie nie ma abstrakcji dla tej funkcji w Xamarin.Forms, więc musisz stworzyć własną. Zacznij od zdefiniowania interfejsu dla zachowania:

public interface ITextToSpeech
{
       void Speak (string whatToSay);
}

Ponieważ definiujemy nasz interfejs, możemy kodować go na podstawie naszego wspólnego kodu.

Uwaga: Klasy, które implementują interfejs, muszą mieć konstruktora bez parametrów, aby współpracować z DependencyService .

Implementacja iOS

Zdefiniowany interfejs należy zaimplementować na każdej docelowej platformie. W przypadku systemu iOS odbywa się to za pomocą środowiska AVFoundation . Poniższa implementacja interfejsu ITextToSpeech obsługuje mówienie danego tekstu w języku angielskim.

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);
    }
}

Po utworzeniu klasy musisz włączyć DependencyService aby wykryć ją w czasie wykonywania. Odbywa się to poprzez dodanie atrybutu [assembly] powyżej definicji klasy i poza wszelkimi definicjami przestrzeni nazw.

using AVFoundation;
using DependencyServiceSample.iOS;

[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechiOS))]
namespace DependencyServiceSample.iOS {
    public class TextToSpeechiOS : ITextToSpeech
...

Ten atrybut rejestruje klasę w DependencyService dzięki czemu można go użyć, gdy potrzebna jest instancja interfejsu ITextToSpeech .

Wspólny kod

Po utworzeniu i zarejestrowaniu klas specyficznych dla platformy możesz rozpocząć ich podłączanie do wspólnego kodu. Następująca strona zawiera przycisk, który uruchamia funkcję zamiany tekstu na mowę za pomocą predefiniowanego zdania. Korzysta z DependencyService aby pobrać specyficzną dla platformy implementację ITextToSpeech w czasie wykonywania przy użyciu natywnych zestawów SDK.

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;
}

Po uruchomieniu tej aplikacji na urządzeniu z systemem iOS lub Android i dotknięciu przycisku usłyszysz, jak aplikacja wypowiada podane zdanie.

Wdrożenie Androida

Implementacja specyficzna dla Androida jest nieco bardziej złożona, ponieważ zmusza do dziedziczenia z natywnego Java.Lang.Object i zmusza do implementacji interfejsu IOnInitListener . Android wymaga podania prawidłowego kontekstu Androida dla wielu metod SDK, które udostępnia. Forms.Context udostępnia obiekt Forms.Context który zapewnia kontekst systemu Android, którego można użyć w takich przypadkach.

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
}

Po utworzeniu klasy musisz włączyć DependencyService aby wykryć ją w czasie wykonywania. Odbywa się to poprzez dodanie atrybutu [assembly] powyżej definicji klasy i poza wszelkimi definicjami przestrzeni nazw.

using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;


[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechAndroid))]
namespace DependencyServiceSample.Droid {
    ...

Ten atrybut rejestruje klasę w DependencyService dzięki czemu można go użyć, gdy potrzebna jest instancja interfejsu ITextToSpeech .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow