É 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
paramenuItem.action
. - Especifique um
menuItem.id
. Quando os usuários tocam no item de menu personalizado, o Glassware recebe uma notificaçãomenuItem.id
preenchido. Isso permite determinar a origem do notificação. - Especifique
menuItem.values
para adicionar umiconUrl
edisplayName
que aparece no Glass. Apontar para um PNG de 50 x 50 de cor branca com um plano de fundo transparente para aiconUrl
. Especifique um
displayTime
. Se você não especificar umdisplayTime
, 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 oID
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 ocreator
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.