Cards estáticos

É possível inserir, atualizar, ler e excluir cards estáticos usando APIs REST. Além disso, é possível anexar objetos a um cartão estático, como como um local ou mídia.

Como funcionam

Por padrão, os cards estáticos ficam à direita do relógio do Glass e exibem informações relevante para o usuário no momento da entrega. No entanto, não é necessário atenção imediata, como cards ativos e os usuários podem ler ou interagir no card quando quiserem.

Quando o Glassware insere cartões estáticos no cronograma, o Google Glass pode reproduzir uma notificação. para alertar os usuários. Todos os cards estáticos anteriores também se deslocam para a direita e desaparecem da linha do tempo após 7 dias ou quando 200 cartões são mais recentes.

Quando usar as extensões

Os cards estáticos são ótimos para enviar notificações periódicas para os usuários quando coisas importantes acontecerem. Por exemplo, um serviço de entrega de notícias que envia as principais notícias à medida que elas acontecem. Cards estáticos da API Mirror também pode iniciar cards ativos ou imersões por meio do OPEN_URI item de menu. Isso permite criar interações híbridas que usam cards estáticos como notificações e um card ao vivo ou uma imersão para uma experiência mais interativa.

Para uma lista completa das possíveis operações para itens da linha do tempo, consulte a referência Documentação.

Como inserir cards estáticos

Para inserir cards estáticos (itens de linha do tempo), POSTA um Representação JSON de um item da linha do tempo para endpoint REST.

A maioria dos campos em um item da linha do tempo é opcional. Na forma mais simples, um item da linha do tempo contém apenas uma pequena mensagem de texto, como neste exemplo:

HTTP bruto

POST /mirror/v1/timeline HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}
Content-Type: application/json
Content-Length: 26

{ "text": "Hello world" }

Java

TimelineItem timelineItem = new TimelineItem();
timelineItem.setText("Hello world");
service.timeline().insert(timelineItem).execute();

Python

timeline_item = {'text': 'Hello world'}
service.timeline().insert(body=timeline_item).execute()

Em caso de sucesso, você vai receber um código de resposta 201 Created com um cópia completa do item criado. No exemplo anterior, uma resposta bem-sucedida pode ter esta aparência:

HTTP bruto

HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303

{
 "kind": "glass#timelineItem",
 "id": "1234567890",
 "selfLink": "https://www.googleapis.com/mirror/v1/timeline/1234567890",
 "created": "2012-09-25T23:28:43.192Z",
 "updated": "2012-09-25T23:28:43.192Z",
 "etag": "\"G5BI0RWvj-0jWdBrdWrPZV7xPKw/t25selcGS3uDEVT6FB09hAG-QQ\"",
 "text": "Hello world"
}

O item inserido que apareceria na linha do tempo do usuário tem esta aparência:

Como inserir um item da linha do tempo com um anexo

Uma imagem vale mais que mil palavras, o que é muito mais do que você consegue encaixar em uma item da linha do tempo. Para isso, você também pode anexar imagens e vídeos a um item da linha do tempo. Veja um exemplo de como inserir um item da linha do tempo com um anexo de fotos:

HTTP bruto

POST /upload/mirror/v1/timeline HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}
Content-Type: multipart/related; boundary="mymultipartboundary"
Content-Length: {length}

--mymultipartboundary
Content-Type: application/json; charset=UTF-8

{ "text": "A solar eclipse of Saturn. Earth is also in this photo. Can you find it?" }
--mymultipartboundary
Content-Type: image/jpeg
Content-Transfer-Encoding: binary

[binary image data]
--mymultipartboundary--

Java

TimelineItem timelineItem = new TimelineItem();
timelineItem.setText("Hello world");
InputStreamContent mediaContent = new InputStreamContent(contentType, attachment);
service.timeline().insert(timelineItem, mediaContent).execute();

Python

timeline_item = {'text': 'Hello world'}
media_body = MediaIoBaseUpload(
    io.BytesIO(attachment), mimetype=content_type, resumable=True)
service.timeline().insert(body=timeline_item, media_body=media_body).execute()

Um item da linha do tempo com uma imagem anexada tem esta aparência no Glass:

Anexando vídeo

Se você estiver anexando arquivos de vídeo aos seus itens da linha do tempo, recomendamos que você transmitir o vídeo em vez de enviar todo o payload de uma só vez. A API Google Mirror é compatível com transmissão ao vivo HTTP, download progressivo e o protocolo de fluxo contínuo em tempo real (RTSP, na sigla em inglês). O RTSP é frequentemente bloqueado por firewalls, portanto, use as outras opções ao sempre que possível.

Para fazer streaming de vídeo, use o PLAY_VIDEO de menu integrado e especificar o URL do vídeo como o payload Consulte Como adicionar itens de menu integrados e formatos de mídia com suporte para mais informações.

Paginação

É possível paginar itens da linha do tempo que não cabem em um único card. mas devem ser associados ao mesmo cartão. Paginado todos os itens compartilham o mesmo timeline.id e, portanto, têm o mesmo conjunto de itens de menu. Quando um usuário toca em um item de linha do tempo paginado, uma Leia mais.

O Glass faz a paginação automaticamente dos itens da linha do tempo que são exibidos text Usar o Google Glass automaticamente paginar html, use a article com a propriedade de classe definida como auto-paginate, como no exemplo a seguir:

<article class="auto-paginate">
 <h3>Very long list</h3>
 <ul>
   <li>First item</li>
   <li>Second item</li>
   <li>Third item</li>
   <li>Fourth item</li>
   <li>Fifth item</li>
   <li>Sixth item</li>
   <li>...</li>
 </ul>
<article>

Para paginar manualmente, use a tag article para o conteúdo que você quer exibir em cada card. O Google Glass exibe o conteúdo de cada Tag article em outro card de sublinha do tempo. Por exemplo, é possível criar item da linha do tempo paginado com o seguinte HTML:

<article>
 <section>
   <p>First page</p>
 </section>
</article>

<article>
 <section>
   <p>Second page</p>
 </section>
</article>

<article>
 <section>
   <p>Third page</p>
 </section>
</article>

Por padrão, o primeiro card do item da linha do tempo paginado é exibido como o cartão de capa e é exibido novamente quando o usuário seleciona o botão Ler mais item de menu. Para evitar que o primeiro cartão apareça novamente após um toque Leia mais, é possível especificar a classe CSS cover-only para o primeiro Tag <article>:

<article class="cover-only">
...

A classe cover-only também oferece suporte a itens da linha do tempo paginados automaticamente:

<article class="auto-paginate cover-only">
...

Pacotes

O agrupamento permite agrupar itens relacionados, mas distintos, como para mensagens individuais em uma conversa por e-mail. Os pacotes têm um cartão de capa principal que o usuário toca para exibir uma sublinha do tempo que contém os outros cards do pacote. Os pacotes se distinguem dos cards de linha do tempo normais por uma dobra de canto na parte superior. no canto direito do card da capa do pacote.

Para agrupar itens da linha do tempo, crie-os com o mesmo valor para bundleId O item adicionado mais recentemente é o cartão de capa do pacote.

As imagens a seguir mostram um pacote cartão de capa com a dobra no canto superior direito e dois agrupados abaixo dele.

Ler itens da linha do tempo

Seu serviço pode acessar todos os itens da linha do tempo que ele criou e toda a linha do tempo itens que foram compartilhados com ela. Saiba como list para os itens da linha do tempo que são visíveis para seu serviço.

HTTP bruto

GET /mirror/v1/timeline HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}

Java

TimelineItem timelineItem = new TimelineItem();
service.timeline().list().execute();

Python

service.timeline().list().execute()

É possível usar outras operações REST para get, update e excluir itens da linha do tempo.

Como acessar anexos

Para acessar os anexos de um item da linha do tempo, use o uma propriedade de matriz chamada attachments. Você pode obter os dados binários de um anexo por meio da contentUrl do anexo ou com a tag endpoint de anexos.

HTTP bruto

GET /mirror/v1/timeline/{itemId}/attachments/{attachmentId} HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}

Java

TimelineItem item = service.timeline().get(itemId).execute();
String attachmentId = item.getAttachments().get(0).getId();
service.attachments().get(itemId, attachmentId).executeAsInputStream();

Criar itens de menu

Os itens de menu permitem que os usuários solicitem ações relacionadas ao card da linha do tempo. e vêm em dois tipos: itens de menu integrados e itens de menu personalizados.

Os itens de menu integrados dão acesso a funcionalidades especiais fornecidas pelo Google Glass, como ler um card de linha do tempo em voz alta, navegar para uma local, compartilhar uma imagem ou responder a uma mensagem:

Os itens de menu personalizados permitem que seu aplicativo exponha um comportamento específico ao seu Glassware, e você também pode fornecer um ícone de item de menu para corresponder ao seu branding.

Adicionar itens de menu integrados

Você pode adicionar itens de menu integrados aos itens da linha do tempo preenchendo o menuItems array quando você os inserir. Para usar um item de menu integrado, você só precisa preencher o action de cada menuItem.

HTTP bruto

HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303

{
  "text": "Hello world",
  "menuItems": [
    {
      "action": "REPLY"
    }
  ]
}

Definir itens de menu personalizados

Se os itens de menu integrados não funcionam para você, é possível criar itens de menu personalizados com sua próprias ações fazendo o seguinte ao inserir ou atualizar um item da linha do tempo:

  • Especifique CUSTOM para menuItem.action.
  • Especifique um menuItem.id. Quando os usuários tocam no item de menu personalizado, o Glassware recebe uma notificação menuItem.id preenchido. Isso permite determinar a origem do notificação.
  • Especifique menuItem.values para adicionar um iconUrl e displayName que aparece no Glass. Apontar para um PNG de 50 x 50 de cor branca com um plano de fundo transparente para a iconUrl.
  • Especifique um displayTime. Se você não especificar um displayTime, o item da linha do tempo move para a frente da linha do tempo sempre que os usuários tocam no item de menu personalizado.

HTTP bruto

HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303

{
  "text": "Hello world",
  "displayTime": "2013-08-08T22:47:31-07:00",
  "menuItems": [
    {
      "action": "CUSTOM",
      "id": "complete"
      "values": [{
        "displayName": "Complete",
        "iconUrl": "http://example.com/icons/complete.png"
      }]
    }
  ]
}

Permitir que os usuários fixem o card da linha do tempo

É possível criar um item de menu que permite que os usuários fixem o card da linha do tempo que exibe permanentemente o card da linha do tempo à esquerda do de relógio. Os usuários também podem liberar o card usando o mesmo menu do item de linha.

O item de menu de fixação é um item de menu integrado, então tudo o que você precisa fazer é fornecer o TOGGLE_PINNED. action para um menuItem.

HTTP bruto

HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303

{
  "text": "You can pin or unpin this card.",
 "menuItems": [
    {
      "action": "TOGGLE_PINNED"
    }
  ...
 ]
}

Inscrições

A API Mirror permite inscrever-se para receber notificações que são enviadas quando o usuário realiza ações específicas em uma Item da linha do tempo ou quando o local do usuário foi atualizado. Ao se inscrever para receber uma notificação, forneça um URL de retorno de chamada que processe a notificação.

Como receber notificações

Uma notificação da API Mirror é enviada como uma solicitação POST ao endpoint inscrito contendo um corpo de solicitação JSON.

HTTP bruto

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "UPDATE",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer",
  "userActions": [
    {
      "type": "<TYPE>",
      "payload": "<PAYLOAD>"
    }
  ]
}

Java

import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.mirror.model.Notification;

import java.io.IOException;
import java.io.InputStream;
// ...

public class MyClass {
  // ...

  /**
    * Parse a request body into a Notification object.
    *
    * @param requestBody The notification payload sent by the Mirror API.
    * @return Parsed notification payload if successful, {@code null} otherwise.
    */
  static Notification parseNotification(InputStream requestBody) {
    try {
      JsonFactory jsonFactory = new JacksonFactory();

      return jsonFactory.fromInputStream(requetBody, Notification.class);
    } catch (IOException e) {
      System.out.println("An error occurred: " + e);
      return null;
    }
  }

  // ...
}

Python

import json

def parse_notification(request_body):
  """Parse a request body into a notification dict.

  Params:
    request_body: The notification payload sent by the Mirror API as a string.
  Returns:
    Dict representing the notification payload.
  """
  return json.load(request_body)

Seu serviço precisa responder à API com um status HTTP 200 OK se nenhum erro tiver ocorrido. Se o serviço responder com um código de erro, é possível que a API Mirror tente reenviar a notificação ao serviço.

Tipos de notificação

A API Mirror envia um payload de notificação diferente para diferentes eventos.

Responder

O usuário respondeu ao seu item da linha do tempo usando o REPLY integrado item de menu:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "INSERT",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer",
  "userActions": [
    {
      "type": "REPLY"
    }
  ]
}

O atributo itemId é definido como o ID do item que contém:

  • O atributo inReplyTo foi definido como o ID do item da linha do tempo de que ele é responder.
  • O atributo text foi definido como a transcrição de texto.
  • O atributo recipients foi definido como o creator do item da linha do tempo é uma resposta, se houver.

Exemplo:

{
  "kind": "glass#timelineItem",
  "id": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "inReplyTo": "3236e5b0-b282-4e00-9d7b-6b80e2f47f3d",
  "text": "This is a text reply",
  "recipients": [
    {
      "id": "CREATOR_ID",
      "displayName": "CREATOR_DISPLAY_NAME",
      "imageUrls": [
        "CREATOR_IMAGE_URL"
      ]
    }
  ]
}

Excluir

O usuário excluiu um item da linha do tempo:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "DELETE",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer",
  "userActions": [
    {
      "type": "DELETE"
    }
  ]
}

O atributo itemId está definido como o ID do objeto excluído. do item de linha. O item não contém mais metadados além do ID e do isDeleted.

Item de menu personalizado selecionado

O usuário selecionou um item do cardápio personalizado definido pelo serviço:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "UPDATE",
  "userToken": "harold_penguin",
  "userActions": [
    {
      "type": "CUSTOM",
      "payload": "PING"
    }
  ]
}

O atributo itemId é definido como o ID do item de menu que que o usuário selecionou.

A matriz userActions contém a lista de ações personalizadas que o usuário assumiu neste item. Seu serviço deve lidar com essas as ações apropriadas.

Atualização do local

Um novo local está disponível para o usuário atual:

{
  "collection": "locations",
  "itemId": "latest",
  "operation": "UPDATE",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer"
}

Quando o Glassware receber uma atualização de local, envie um solicitação para o objeto glass.locations.get para recuperar a localização conhecida mais recente. Seus artigos de vidro recebe atualizações de localização a cada dez minutos.

Comando de voz

Seu usuário ativou um comando de voz, por exemplo: "Ok Glass, anote, Cat Stream, o aniversário do Chipotle é amanhã". A seguinte notificação é enviada ao seu Utensílios de vidro:

{
  "collection": "timeline",
  "operation": "INSERT",
  "userToken": "chipotle's_owner",
  "verifyToken": "mew mew mew",
  "itemId": "<ITEM_ID>",
  "userActions": [
    {type: "LAUNCH"}
  ]
}

Essa notificação se distingue de outras notificações pelo valor LAUNCH na propriedade userActions.

É possível usar o valor em itemId para buscar o item da linha do tempo:

{
  "id": "<ITEM_ID>",
  "text": "Chipotle's birthday is tomorrow",
  "recipients": [
    {"id": "CAT_STREAM"}
  ]
}

A propriedade recipients contém o id do contato que representa o Comando de voz usado.