수색…


비고

구현이 발견되지 않을 때 코드가 중단되지 않게하려면 먼저 구현이 사용 가능한 경우 DependencyService 확인하십시오.

null 이 아닌 경우 간단한 점검으로이를 수행 할 수 있습니다.

var speaker = DependencyService.Get<ITextToSpeech>();

if (speaker != null)
{
    speaker.Speak("Ready for action!");
}

또는 IDE가 C # 6을 null 조건부 연산자로 지원하는 경우 :

var speaker = DependencyService.Get<ITextToSpeech>();

speaker?.Speak("Ready for action!");

이 작업을 수행하지 않고 런타임에 구현이 없으면 코드에서 예외가 생성됩니다.

TTS (text-to-speech) 구현

플랫폼 특정 코드를 요청하는 기능의 좋은 예는 텍스트 음성 변환 (tts)을 구현하려는 경우입니다. 이 예제에서는 PCL 라이브러리에서 공유 코드로 작업한다고 가정합니다.

우리의 솔루션에 대한 개략적 인 개요는 아래 그림과 같습니다.

개요 개요 (Xamarin 이미지)

공유 코드에서는 DependencyService 등록 된 인터페이스를 정의합니다. 이것은 우리가 부름을 할 곳입니다. 아래처럼 인터페이스를 정의하십시오.

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

이제 각 특정 플랫폼에서이 인터페이스의 구현을 만들어야합니다. iOS 구현부터 살펴 보겠습니다.

iOS 구현

using AVFoundation;

public class TextToSpeechImplementation : ITextToSpeech
{
    public TextToSpeechImplementation () {}

    public void Speak (string text)
    {
        var speechSynthesizer = new AVSpeechSynthesizer ();

        var speechUtterance = new AVSpeechUtterance (text) {
            Rate = AVSpeechUtterance.MaximumSpeechRate/4,
            Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
            Volume = 0.5f,
            PitchMultiplier = 1.0f
        };

        speechSynthesizer.SpeakUtterance (speechUtterance);
    }
}

위의 코드 예에서 iOS에 특정 코드가 있음을 알 수 있습니다. AVSpeechSynthesizer 와 같은 유형입니다. 공유 코드에서는 작동하지 않습니다.

이 구현을 Xamarin DependencyService 등록하려면이 특성을 네임 스페이스 선언 위에 추가하십시오.

using AVFoundation;
using DependencyServiceSample.iOS;//enables registration outside of namespace

[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechImplementation))]
namespace DependencyServiceSample.iOS {
    public class TextToSpeechImplementation : ITextToSpeech
//... Rest of code

이제 공유 코드에서 이와 같은 호출을하면 앱을 실행중인 플랫폼에 적합한 구현이 삽입됩니다.

DependencyService.Get<ITextToSpeech>() . 이것에 관해서는 나중에 더.

Android 구현

이 코드의 안드로이드 구현은 아래처럼 보일 것입니다.

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

public class TextToSpeechImplementation : Java.Lang.Object, ITextToSpeech, TextToSpeech.IOnInitListener
{
    TextToSpeech speaker;
    string toSpeak;

    public TextToSpeechImplementation () {}

    public void Speak (string text)
    {
        var ctx = Forms.Context; // useful for many Android SDK features
        toSpeak = text;
        if (speaker == null) {
            speaker = new TextToSpeech (ctx, this);
        } else {
            var p = new Dictionary<string,string> ();
            speaker.Speak (toSpeak, 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 에 등록하는 것을 잊지 마십시오.

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


[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechImplementation))]
namespace DependencyServiceSample.Droid{
    //... Rest of code

Windows Phone 구현

마지막으로 Windows Phone의 경우이 코드를 사용할 수 있습니다.

public class TextToSpeechImplementation : ITextToSpeech
{
    public TextToSpeechImplementation() {}

    public async void Speak(string text)
    {
        MediaElement mediaElement = new MediaElement();

        var synth = new Windows.Media.SpeechSynthesis.SpeechSynthesizer();

        SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync("Hello World");

        mediaElement.SetSource(stream, stream.ContentType);
        mediaElement.Play();
        await synth.SynthesizeTextToStreamAsync(text);
    }
}

그리고 한번 더 등록하는 것을 잊지 마십시오.

using Windows.Media.SpeechSynthesis;
using Windows.UI.Xaml.Controls;
using DependencyServiceSample.WinPhone;//enables registration outside of namespace

[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechImplementation))]
namespace DependencyServiceSample.WinPhone{
    //... Rest of code

공유 코드로 구현하기

이제는 모든 것이 작동하도록 모든 것이 준비되어 있습니다! 마지막으로 공유 코드에서 인터페이스를 사용하여이 함수를 호출 할 수 있습니다. 런타임에 실행중인 현재 플랫폼에 해당하는 구현이 삽입됩니다.

이 코드에는 Xamarin Forms 프로젝트에있을 수있는 페이지가 표시됩니다. DependencyService 를 사용하여 Speak() 메서드를 호출하는 단추를 만듭니다.

public MainPage ()
{
    var speak = new Button {
        Text = "Hello, Forms !",
        VerticalOptions = LayoutOptions.CenterAndExpand,
        HorizontalOptions = LayoutOptions.CenterAndExpand,
    };
    speak.Clicked += (sender, e) => {
        DependencyService.Get<ITextToSpeech>().Speak("Hello from Xamarin Forms");
    };
    Content = speak;
}

결과는 응용 프로그램이 실행되고 버튼을 클릭하면 제공된 텍스트가 음성으로 나옵니다.

이 모든 것은 컴파일러 힌트와 같은 어려운 작업을 수행하지 않고도 가능합니다. 이제 플랫폼 독립적 인 코드를 통해 플랫폼 특정 기능에 액세스하는 단일 한 방법이 있습니다.

애플리케이션 및 기기 OS 버전 번호 받기 - Android 및 iOS - PCL

아래 예제는 Android의 버전 이름 과 iOS의 버전 에 입력 된 기기의 OS 버전 번호와 각 프로젝트의 속성에 정의 된 애플리케이션 버전을 수집합니다.

먼저 PCL 프로젝트에서 인터페이스를 만드십시오.

public interface INativeHelper {
    /// <summary>
    /// On iOS, gets the <c>CFBundleVersion</c> number and on Android, gets the <c>PackageInfo</c>'s <c>VersionName</c>, both of which are specified in their respective project properties.
    /// </summary>
    /// <returns><c>string</c>, containing the build number.</returns>
    string GetAppVersion();

    /// <summary>
    /// On iOS, gets the <c>UIDevice.CurrentDevice.SystemVersion</c> number and on Android, gets the <c>Build.VERSION.Release</c>.
    /// </summary>
    /// <returns><c>string</c>, containing the OS version number.</returns>
    string GetOsVersion();
}

이제 Android 및 iOS 프로젝트에서 인터페이스를 구현합니다.

기계적 인조 인간:

[assembly: Dependency(typeof(NativeHelper_Android))]

namespace YourNamespace.Droid{
    public class NativeHelper_Android : INativeHelper {
        
        /// <summary>
        /// See interface summary.
        /// </summary>
        public string GetAppVersion() {
            Context context = Forms.Context;
            return context.PackageManager.GetPackageInfo(context.PackageName, 0).VersionName;
        }

        /// <summary>
        /// See interface summary.
        /// </summary>
        public string GetOsVersion() { return Build.VERSION.Release; }
    }
}

iOS :

[assembly: Dependency(typeof(NativeHelper_iOS))]

namespace YourNamespace.iOS {
    public class NativeHelper_iOS : INativeHelper {
        
        /// <summary>
        /// See interface summary.
        /// </summary>
        public string GetAppVersion() { return Foundation.NSBundle.MainBundle.InfoDictionary[new Foundation.NSString("CFBundleVersion")].ToString(); }

        /// <summary>
        /// See interface summary.
        /// </summary>
        public string GetOsVersion() { return UIDevice.CurrentDevice.SystemVersion; }
    }
}

이제 메소드에서 코드를 사용합니다.

public string GetOsAndAppVersion {
    INativeHelper helper = DependencyService.Get<INativeHelper>();

    if(helper != null) {
        string osVersion  = helper.GetOsVersion();
        string appVersion = helper.GetBuildNumber()
    }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow