Xamarin.Forms
DependencyService를 사용하여 기본 기능 액세스
수색…
비고
구현이 발견되지 않을 때 코드가 중단되지 않게하려면 먼저 구현이 사용 가능한 경우 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 라이브러리에서 공유 코드로 작업한다고 가정합니다.
우리의 솔루션에 대한 개략적 인 개요는 아래 그림과 같습니다.
공유 코드에서는 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()
}
}