Поиск…


замечания

При использовании DependencyService вам обычно требуется 3 части:

  • Интерфейс - определяет функции, которые вы хотите абстрагировать.
  • Реализация платформы - класс в рамках каждого конкретного проекта, реализующего ранее определенный интерфейс.
  • Регистрация. Каждый класс реализации конкретной платформы должен быть зарегистрирован в DependencyService через атрибут метаданных. Это позволяет DependencyService находить вашу реализацию во время выполнения.

При использовании DependencyService вам необходимо предоставить реализацию для каждой целевой платформы. Когда реализация не предоставляется, приложение будет работать во время выполнения.

Интерфейс

Интерфейс определяет поведение, которое вы хотите открыть через DependencyService . Одним из примеров использования DependencyService является служба Text-To-Speech. В настоящее время абстракции для этой функции в 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 .

Общий код

После того, как вы создали и зарегистрировали свои классы для платформы, вы можете начать подключать их к своему коду. Следующая страница содержит кнопку, которая запускает функции преобразования текста в речь с использованием заранее определенного предложения. Он использует DependencyService для извлечения реализации ITextToSpeech на ITextToSpeech во время выполнения с использованием собственных 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;
}

Когда вы запускаете это приложение на устройстве iOS или Android и нажимаете кнопку, вы услышите, как приложение произносит данное предложение.

Реализация Android

Специфическая реализация Android немного сложнее, потому что она заставляет вас наследовать от родного Java.Lang.Object и заставляет вас реализовать интерфейс IOnInitListener . Android требует, чтобы вы предоставили действительный контекст Android для многих методов SDK, которые он предоставляет. 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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow