如何使用INPlayMediaIntent处理Siri套件以在Xamarin.iOS应用中播放Podcast剧集?

问题描述

我已经遵循了Siri此处提到的所有步骤: https://docs.microsoft.com/en-us/xamarin/ios/platform/sirikit/implementing-sirikit?tabs=macos

也遵循:https://developer.apple.com/documentation/sirikit/media/managing_audio_with_sirikit

IntentHandler.cs:

[Register("IntentHandler")]
public class IntentHandler : INExtension,IINPlayMediaIntentHandling,IINAddMediaIntentHandling
{
    protected IntentHandler(IntPtr handle) : base(handle)
    { 
    }

    public override NSObject GetHandler(INIntent intent)
    {
        return this;
    }

    //INPlayMediaIntent

    public void resolveMediaItems(INPlayMediaIntent intent,Action<INPlayMediaMediaItemResolutionResult> completion)
    {
        var mediaItemData = new INMediaItem(identifier: SessionService.LastPlayedEpisode.PodcastId,title: SessionService.LastPlayedEpisode.Title,type: INMediaItemType.PodcastEpisode,artwork: null);
        MessagingCenter.Send<object,string>(this,"PlayRecentEpisodeSiriEvent","ResolveMediaItems");
        completion(INPlayMediaMediaItemResolutionResult.GetSuccess(mediaItemData));
    }

    public void HandlePlayMedia(INPlayMediaIntent intent,Action<INPlayMediaIntentResponse> completion)
    {
        var userActivity = new NSUserActivity("INPlayMediaIntent");
        var response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp,userActivity);
        completion(response);
    }

    public void HandleAddMedia(INAddMediaIntent intent,Action<INAddMediaIntentResponse> completion)
    {
        var userActivity = new NSUserActivity("INAddMediaIntent");
        var response = new INAddMediaIntentResponse(INAddMediaIntentResponseCode.Success,userActivity);
        completion(response);
    }
}

现在,当我向Siri发出命令时喜欢:“以myappname播放Daily节目”时,显示以下内容:

因此,我并没有真正了解siri如何处理Media内容以通过命令显示我的应用程序。任何人都知道:

  1. 如何在Xamarin.iOS中处理Siri Media Intent?
  2. 如何通过Xamarin.iOS添加Siri支持?

更新:2020年10月29日-如何播放《播客》中的特定剧集 播放列表是siri吗?

我正在尝试播放Podcast播放列表的特定剧集,但是它不起作用。我已将命令传递给siri,例如:Play the Overlap by audiochuck from CounterClock podcast in siridemo

here siridemo = my app's name,Overlap = episode name,counterclock = Podcast name.

当控件进入appdelegate中的HandleIntent方法时,我在mediasearch.medianame对象中仅获得CounterClock。因此,可以使用Siri实现这一目标吗?

如何修复应用程序未添加具有siri错误的支持?

enter image description here

解决方法

我有解决方案,就在这里。


1。您的IntentExtension项目中的Intent Handler:

First mistake I have done was I have used INPlayMediaIntentResponseCode.Success instead of HandleInApp,which I have corrected here. Why HandleInApp? Hold on :)

[Register("IntentHandler")]
public class IntentHandler : INExtension,IINPlayMediaIntentHandling
{
   protected IntentHandler(IntPtr handle) : base(handle) { }

   public override NSObject GetHandler(INIntent intent)
   {
      return this;
   }

   [Export("handlePlayMedia:completion:")]
   public void HandlePlayMedia(INPlayMediaIntent intent,Action<INPlayMediaIntentResponse> completion)
   {
      var response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp,null);
      completion(response);
   }
}


2。现在,让我们在AppDelegate中处理它:

As we have passed HandleInApp as a response in Intent handler's HandlePlayMedia() it will call HandleIntent() method in AppDelegate of your main iOS project. Where the magic will happen.

public async override void HandleIntent(UIApplication application,INIntent intent,Action<INIntentResponse> completionHandler)
{
   var playMediaIntent = intent as INPlayMediaIntent;
   
   // The command you will give to siri will come here in MediaSearch object 
   var mediaName = playMediaIntent?.MediaSearch?.MediaName;

   // Check if the Searched Podcast and episode is there in your Podcasts list or 
   // not and handle it accordingly
   var response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.Failure,userActivity);;
   
   if(mediaName.Exist(Playlist))
   {
       response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.ContinueInApp,null);
   }
   else
   {
       response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.FailureUnknownMediaType,null);
   }
   completionHandler(response);
}


Give search command to siri like this - 

Play [EpisodeName] of [PodcastName] in your app name

For Example: `Play Conclusion in Selling Girls of America in siridemo app`

输出:

Now in MediaSearch.MediaName you will get "Conclusion in Selling Girls of America" as search string.

快乐编码!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...