alexa - audioPlayer.Play问题在Echo Show Now Playing屏幕上显示内容

时间:2018-05-31 11:08:36

标签: alexa-skills-kit alexa-skill amazon-echo-show

我在了解如何在audioPlayer“正在播放”屏幕内的Echo Show上显示图像时遇到问题。

我正在播放音频文件,想要在“正在播放”屏幕上显示图像。我能得到的最接近的是以下代码,它在音频开始之前显示图像和标题,但随后立即消失,Echo Show进入“正在播放”屏幕,没有背景图像,也没有元数据。我觉得我很接近,但是无法理解如何更新“正在播放”屏幕,而不是之前的屏幕。

这是代码的一部分(按上述方式工作):

var handlers = {
  'LaunchRequest': function() {
   this.emit('PlayStream');        
   },

'PlayStream': function() {
 let builder = new Alexa.templateBuilders.BodyTemplate1Builder();
 let template = builder.setTitle('Test Title')
    .setBackgroundImage(makeImage('https://link_to_my_image.png'))
    .setTextContent(makePlainText('Test Text'))
    .build();

 this.response.speak('OK.').

 audioPlayerPlay(
    'REPLACE_ALL', 
    stream.url, 
    stream.url, 
    null, 
    0)
    .renderTemplate(template);

 this.emit(':responseReady');  
 }

我一直在查看此页面https://developer.amazon.com/docs/custom-skills/audioplayer-interface-reference.html,但无法理解如何将该页面上的内容结构转换为我的代码。我假设,从页面上的代码:

{
  "type": "AudioPlayer.Play",
  "playBehavior": "valid playBehavior value such as ENQUEUE",
  "audioItem": {
    "stream": {
      "url": "https://url-of-the-stream-to-play",
      "token": "opaque token representing this stream",
      "expectedPreviousToken": "opaque token representing the previous stream",
      "offsetInMilliseconds": 0
    },
    "metadata": {
      "title": "title of the track to display",
      "subtitle": "subtitle of the track to display",
      "art": {
        "sources": [
          {
            "url": "https://url-of-the-album-art-image.png"
          }
        ]
      },
      "backgroundImage": {
        "sources": [
          {
            "url": "https://url-of-the-background-image.png"
          }
        ]
      }
    }
  }
}

我不知何故需要得到这个部分:

"metadata": {
          "title": "title of the track to display",
          "subtitle": "subtitle of the track to display",
          "art": {
            "sources": [
              {
                "url": "https://url-of-the-album-art-image.png"
              }
            ]
          },

进入我的代码块:

audioPlayerPlay(
        'REPLACE_ALL', 
        streamInfo.url, 
        streamInfo.url, 
        null, 
        0)
        .renderTemplate(template);

(并且可能会丢失.renderTemplate(template);部分,因为它只会在“正在播放”屏幕加载之前短暂闪烁。

关于如何实现这一目标的任何想法?

谢谢!

更新:

我已将以下内容添加到index.js:

var metadata = { 
    title: "title of the track to display",
    subtitle: "subtitle of the track to display",
    art: { 
        sources: {
            url: "https://url-of-the-album-art-image.png"
            } 
        }
    };

并按如下方式修改了audioPlayer:

audioPlayerPlay(
    'REPLACE_ALL', 
    stream.url, 
    stream.url, 
    null, 
    0,
    metadata)
    .renderTemplate(template);

并按照指示修改了responseBuilder.js:

audioPlayerPlay(behavior, url, token, expectedPreviousToken, offsetInMilliseconds, metadata) {
    const audioPlayerDirective = {
        type : DIRECTIVE_TYPES.AUDIOPLAYER.PLAY,
        playBehavior: behavior,
        audioItem: {
            stream: {
                url: url,
                token: token,
                expectedPreviousToken: expectedPreviousToken,
                offsetInMilliseconds: offsetInMilliseconds,   
                metadata : metadata 
            }
        }
    };

    this._addDirective(audioPlayerDirective);
    return this;
}

但我仍然没有在“正在播放”屏幕上显示任何内容。

2 个答案:

答案 0 :(得分:5)

出于某种原因,Echo Show没有实时更新,需要重新启动才能显示元数据变量中传递的内容,这就是为什么我没有看到任何结果。

简单地传递变量就可以了。我只需要找出为什么内容会卡在“正在播放”的内容上。屏幕并需要重启才能工作。

var "metadata": {
      "title": "title of the track to display",
      "subtitle": "subtitle of the track to display",
      "art": {
        "sources": [
          {
            "url": "https://url-of-the-album-art-image.png"
          }
        ]
      },

答案 1 :(得分:4)

只需定义您的元数据,如下所示。并将其作为第6个参数传递给audioPlayerPlay;

"metadata": {
          "title": "title of the track to display",
          "subtitle": "subtitle of the track to display",
          "art": {
            "sources": [
              {
                "url": "https://url-of-the-album-art-image.png"
              }
            ]
          },

audioPlayerPlay(
        'REPLACE_ALL', 
        streamInfo.url, 
        streamInfo.url, 
        null, 
        0,metadata)

P.S。为了使其正常工作,您必须修改您将要压缩并上传到lambda的节点模块。

步骤 - 转到node_modules \ alexa-sdk \ lib并在其中打开responseBuilder文件。并修改代码如下 -

audioPlayerPlay(behavior, url, token, expectedPreviousToken, offsetInMilliseconds, **metadata**) {
        const audioPlayerDirective = {
            type : DIRECTIVE_TYPES.AUDIOPLAYER.PLAY,
            playBehavior: behavior,
            audioItem: {
                stream: {
                    url: url,
                    token: token,
                    expectedPreviousToken: expectedPreviousToken,
                    offsetInMilliseconds: offsetInMilliseconds
                },
                **metadata : metadata**
            }
        };

        this._addDirective(audioPlayerDirective);
        return this;
    }

P.S。 - 只有在使用alexa-sdk版本1时才需要修改节点模块。