Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用INPlayMediaIntent处理Siri套件,以便在Xamarin.iOS应用程序中播放播客插曲?_C#_Xamarin_Xamarin.ios_Siri_Sirikit - Fatal编程技术网

C# 如何使用INPlayMediaIntent处理Siri套件,以便在Xamarin.iOS应用程序中播放播客插曲?

C# 如何使用INPlayMediaIntent处理Siri套件,以便在Xamarin.iOS应用程序中播放播客插曲?,c#,xamarin,xamarin.ios,siri,sirikit,C#,Xamarin,Xamarin.ios,Siri,Sirikit,对于Siri,我已经遵循了这里提到的所有步骤: 随后还包括: IntentHandler.cs: [Register("IntentHandler")] public class IntentHandler : INExtension, IINPlayMediaIntentHandling, IINAddMediaIntentHandling { protected IntentHandler(IntPtr handle) : base(handle) {

对于Siri,我已经遵循了这里提到的所有步骤:

随后还包括:

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);
    }
}
[寄存器(“IntentHandler”)]
公共类维护者:无张力、iInPlaymedia维护者、iInAdmMediaMaintentHandling
{
受保护的IntentHandler(IntPtr句柄):基本(句柄)
{ 
}
公共覆盖NSObject GetHandler(INIntent intent intent)
{
归还这个;
}
//INPlayMediaIntent
public void resolveMediaItems(INPlayMediaIntent意图、操作完成)
{
var mediateItemData=new-INMediaItem(标识符:SessionService.LastPlayedEpisode.PodcastId,标题:SessionService.LastPlayedEpisode.title,类型:INMediaItemType.PodcastEpisode,插图:null);
MessagingCenter.Send(这是“PlayRecentePiSodesrievent”、“ResolveMediaItems”);
完成(inPlayMediaItemResolutionResult.GetSuccess(mediaItemData));
}
公共无效HandlePlayMedia(INPlayMediaIntent、操作完成)
{
var userActivity=new NSUserActivity(“INPlayMediaIntent”);
var响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp,userActivity);
完成(答复);
}
公共无效HandLeadMedia(不包含调解意图、行动完成)
{
var userActivity=新NSUserActivity(“inaddmediainment”);
var响应=新的InAddMediaIntrentResponse(InAddMediaIntrentResponseCode.Success,userActivity);
完成(答复);
}
}
现在,当我命令Siri喜欢:“在myappname中播放每日”时,它显示:

所以,我不知道siri将如何处理媒体内容,以使用命令显示我的应用程序。任何人都知道:

  • 如何在Xamarin.iOS中处理Siri媒体意图
  • 如何使用Xamarin.iOS添加Siri支持
  • 更新:2020年10月29日-如何播放来自 播放列表是siri吗

    我试图播放播客播放列表中的某一集,但它不起作用。我已经向siri发出了如下命令:
    在siridemo的反锁播客中播放audiochuck的重叠部分

    这里siridemo=我的应用程序名,Overlap=剧集名,反锁=播客名。

    当控件转到appdelegate中的HandleIntent方法时,我在mediasearch.medianame对象中只得到反锁定。那么有可能用Siri实现这一点吗

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

    我找到了解决方案,它就在这里。
    1。您的IntentTexttension项目中的Intent处理程序:
    我犯的第一个错误是使用了INPlayMediaIntentResponseCode.Success而不是HandleInApp,我在这里纠正了这个错误。为什么要手舞足蹈?请稍候:)

    [寄存器(“IntentHandler”)]
    公共类维护者:不精确的,iInPlaymedia维护者
    {
    受保护的IntentHandler(IntPtr句柄):基(句柄){}
    公共覆盖NSObject GetHandler(INIntent intent intent)
    {
    归还这个;
    }
    [导出(“handlePlayMedia:completion:”)]
    公共无效HandlePlayMedia(INPlayMediaIntent、操作完成)
    {
    var响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp,null);
    完成(答复);
    }
    }
    

    2。现在让我们在AppDelegate中处理它:
    由于我们在Intent处理程序的HandlePlayMedia()中将HandleInApp作为响应传递,它将在主iOS项目的AppDelegate中调用handleInent()方法。魔法将在哪里发生。

    public async override void HandleIntent(UIApplication应用程序、INIntent意图、Action completionHandler)
    {
    var playMediaIntent=intent作为INPlayMediaIntent;
    //您将向siri发出的命令将在MediaSearch对象中出现
    var mediaName=playMediaIntent?.MediaSearch?.mediaName;
    //检查搜索到的播客和插曲是否在播客列表中,或者
    //不可以,请相应处理
    var响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.Failure,userActivity);;
    if(mediaName.Exist(播放列表))
    {
    响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.ContinueInApp,null);
    }
    其他的
    {
    响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.FailureUnknownMediaType,null);
    }
    completionHandler(响应);
    }
    

    向siri发出如下搜索命令-
    在应用程序名中播放[PodcastName]的[EpisodeName]
    例如:`在siridemo应用程序中销售《美国女孩》的游戏结论`
    

    输出:
    现在在MediaSearch.MediaName中,您将获得“出售美国女孩的结论”作为搜索字符串。


    快乐编码

    你的ios版本是什么?14.0@LeoZhu msfti是因为你想调用的短语不起作用吗?尝试更改短语或添加自定义语句。我尝试过使用不同的短语,并且根据从苹果文档中获得的演示编写了代码。实际问题是,我想这就是为什么它不起作用的原因。您知道如何调用IntentExtension吗?您是否在
    Info.plist
    文件中配置了Intents扩展名?