수색…


비고

DependencyService 를 사용하는 경우 일반적으로 3 부분이 필요합니다.

  • 인터페이스 - 추상화하려는 기능을 정의합니다.
  • 플랫폼 구현 - 이전에 정의 된 인터페이스를 구현하는 각 플랫폼 별 프로젝트 내의 클래스입니다.
  • 등록 - 플랫폼 별 구현 클래스는 메타 데이터 속성을 통해 DependencyService 등록해야합니다. 이렇게하면 DependencyService 가 런타임에 구현을 찾을 수 있습니다.

DependencyService 를 사용하는 경우 대상 플랫폼마다 구현을 제공해야합니다. 구현이 제공되지 않으면 런타임에 응용 프로그램이 실패합니다.

인터페이스

인터페이스는 DependencyService 통해 표시 할 동작을 정의합니다. DependencyService 의 한 가지 사용 예는 텍스트 음성 변환 서비스입니다. 현재 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 를 사용하여 네이티브 SDK를 사용하여 런타임에 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 인터페이스를 구현해야하기 때문에 조금 더 복잡합니다. 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