Puedes insertar, actualizar, leer y borrar tarjetas estáticas APIs de REST. Además, puedes adjuntar objetos a una tarjeta estática, como como una ubicación o un medio de comunicación.
Cómo funcionan
De forma predeterminada, las tarjetas estáticas residen a la derecha del reloj de Glass y muestran información relevantes para el usuario en el momento de la entrega. Sin embargo, no requieren atención inmediata, como tarjetas en vivo. y los usuarios pueden elegir leer la tarjeta o tomar medidas al respecto. a su propio ritmo.
Cuando Glassware inserta tarjetas estáticas en el cronograma, puede reproducir una notificación. para alertar a los usuarios. Todas las tarjetas estáticas anteriores también se desplazan hacia la derecha y desaparecen del cronograma después de 7 días o cuando hay 200 tarjetas más nuevas.
Cuándo usarlos
Las tarjetas estáticas son excelentes para
notificaciones periódicas
a los usuarios a medida que suceden cosas importantes.
Por ejemplo, un servicio de entrega de noticias que
envía las noticias destacadas a medida que ocurren. Duplicar tarjetas estáticas de la API
también puedes crear tarjetas en vivo o
inmersiones
OPEN_URI
elemento de menú. Esto te permite crear interacciones híbridas que usan
tarjetas estáticas como notificaciones, y una tarjeta en vivo o inmersión para
una experiencia más interactiva.
Para obtener una lista completa de las posibles operaciones para los elementos del cronograma, consulta la referencia documentación.
Cómo insertar tarjetas estáticas
Para insertar tarjetas estáticas (elementos de una línea de tiempo), haz una PUBLICACIÓN DE Representación JSON de un elemento del cronograma para el extremo de REST.
La mayoría de los campos de un elemento de cronograma son opcionales. En su forma más sencilla, un elemento del cronograma contiene solo un mensaje de texto corto, como en este ejemplo:
HTTP sin procesar
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()
Si se realiza de forma correcta, recibirás un código de respuesta 201 Created
con un
copia completa del elemento creado. Para el ejemplo anterior, una respuesta exitosa
podría verse así:
HTTP sin procesar
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"
}
El elemento insertado que aparecería en el cronograma del usuario se ve de la siguiente manera:
Cómo insertar un elemento de la línea de tiempo con un archivo adjunto
Una imagen vale más que mil palabras, lo que es mucho más de lo que cabe en una elemento del cronograma. Para ello, también puedes adjuntar imágenes y videos a un elemento del cronograma. Este es un ejemplo de cómo insertar un elemento del cronograma con una foto adjunta:
HTTP sin procesar
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()
Un elemento del cronograma con una imagen adjunta se ve de la siguiente manera en Glass:
Adjuntando video
Si quieres adjuntar archivos de video a los elementos de la línea de tiempo, te recomendamos que transmitir el video en lugar de subir toda la carga útil de una sola vez. La API de Google Mirror admite la transmisión en vivo HTTP, la descarga progresiva y el protocolo de transmisión en tiempo real (RTSP). Los firewalls suelen bloquear el RTSP, así que usa las otras opciones como sea posible.
Para transmitir videos, usa PLAY_VIDEO
.
elemento de menú integrado y especificar la URL del video como la del elemento de menú
payload
Consulta
Cómo agregar elementos de menú integrados
formatos multimedia compatibles
para obtener más información.
Paginación
Puedes paginar elementos del cronograma que no caben en una sola tarjeta del cronograma.
pero que se deben asociar a la misma tarjeta. Paginado
todos los elementos comparten el mismo timeline.id
y, por lo tanto, tienen el
mismo conjunto de elementos de menú. Cuando un usuario presiona un elemento del cronograma paginado,
Aparecerá el elemento de menú Leer más.
Glass pagina automáticamente los elementos del cronograma que se muestran
text
Para tener Glass automáticamente
para paginar html
, usa article
etiqueta con su propiedad de clase establecida en auto-paginate
, como en el siguiente ejemplo:
<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 el contenido de forma manual, usa la etiqueta article
que quieres que se muestre en cada tarjeta. Glass muestra el contenido de cada una
Etiqueta article
en una tarjeta de subcronograma independiente. Por ejemplo, puedes crear una
elemento de cronograma paginado con el siguiente código 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>
De forma predeterminada, la primera tarjeta del elemento del cronograma paginado se muestra como
tarjeta de portada y vuelve a mostrarse cuando el usuario selecciona el botón Leer más
elemento de menú. Para evitar que vuelva a aparecer la primera tarjeta después de presionar
Obtén más información, puedes especificar la clase de CSS cover-only
para la primera
Etiqueta <article>
:
<article class="cover-only">
...
La clase cover-only
también admite elementos de cronograma de paginación automática:
<article class="auto-paginate cover-only">
...
Paquetes
Los paquetes te permiten agrupar elementos relacionados, pero diferentes, por ejemplo, para mensajes individuales en una conversación de correo electrónico. Los paquetes tienen una tarjeta de portada principal el usuario presiona para mostrar una sublínea de tiempo que contiene las otras tarjetas del paquete. Los paquetes se distinguen de las tarjetas de línea de tiempo normales porque tienen un pliegue de esquina en la parte superior. en la esquina derecha de la tarjeta de portada del paquete.
Para agrupar los elementos del cronograma, créalos con el mismo valor para
bundleId
Lo que se agregó más recientemente
artículo es la tarjeta de portada del paquete.
En las siguientes imágenes, se muestra un paquete tarjeta cubierta con la línea de plegado de esquina en la esquina superior derecha y dos agrupadas tarjetas debajo de él.
Lee los elementos del cronograma
Tu servicio puede acceder a todos los elementos del cronograma que creó y a todos los cronogramas elementos compartidos con ella. Aquí te indicamos cómo enumerar los elementos del cronograma que se visibles para tu servicio.
HTTP sin procesar
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()
Puedes usar otras operaciones REST para get, update y borrar elementos del cronograma
Acceso a archivos adjuntos
Puedes acceder a los archivos adjuntos de un elemento de la línea de tiempo a través de
una propiedad de array llamada attachments
Luego, puedes obtener los datos binarios de un adjunto a través de la
contentUrl
del archivo adjunto o con el
extremo de archivos adjuntos.
HTTP sin procesar
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();
Cómo crear elementos de menú
Los elementos de menú permiten que los usuarios soliciten acciones relacionadas con la tarjeta de cronograma Existen dos tipos: elementos de menú integrados y elementos de menú personalizados.
Los elementos de menú integrados brindan acceso a funciones especiales proporcionadas por Vidrio, como leer en voz alta una tarjeta con la línea de tiempo, navegar a una ubicación, compartir una imagen o responder un mensaje:
Los elementos de menú personalizados permiten que tu aplicación exponga un comportamiento específico a tu Glassware. También puedes proporcionar un icono de elemento de menú para que coincida desarrollo de la marca.
Cómo agregar elementos de menú integrados
Puedes agregar elementos de menú integrados a los elementos de la línea de tiempo si propagas los
menuItems array
cuando las insertes.
Para usar un elemento de menú integrado, solo necesitas completar el
action
de cada menuItem
.
HTTP sin procesar
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"
}
]
}
Cómo definir elementos de menú personalizados
Si los elementos de menú integrados no funcionan en tu caso, puedes crear elementos de menú personalizados con tu acciones propias. Para ello, haz lo siguiente cuando insertes o actualices un elemento del cronograma:
- Especifica
CUSTOM
paramenuItem.action
. - Especifica un
menuItem.id
. Cuando los usuarios presionan el elemento de menú personalizado, tu Glassware recibe una notificación con Se propagómenuItem.id
. Esto te permite determinar la fuente de la notificación. - Especifica
menuItem.values
para agregar uniconUrl
ydisplayName
que aparece en Glass Coloca el cursor sobre un archivo PNG de 50 x 50. de color blanco con un fondo transparente para eliconUrl
. Especifica un
displayTime
. Si no especificas undisplayTime
, el elemento del cronograma se mueve al principio de la línea de tiempo cada vez que los usuarios presionan el elemento de menú personalizado.
HTTP sin procesar
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 los usuarios fijen tu tarjeta de rutas
Puedes crear un elemento de menú que permita a los usuarios fijar la tarjeta del cronograma que muestra de forma permanente la tarjeta del cronograma a la izquierda de la pantalla tarjeta de reloj. Los usuarios también pueden dejar de fijar la tarjeta usando el mismo menú elemento.
El elemento de menú fijo es un elemento de menú integrado, por lo que todo lo que debes hacer es proporcionar el TOGGLE_PINNED
.
action
para un menuItem
.
HTTP sin procesar
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"
}
...
]
}
Suscripciones
La API de Mirror te permite suscribirse a las notificaciones que se envían cuando el usuario realiza acciones específicas en un Elemento de cronograma o cuándo la ubicación del usuario se actualizó. Cuando te suscribes a una notificación, proporcionar una URL de devolución de llamada que procese la notificación.
Recibe notificaciones
Se envía una notificación de la API de Mirror como una solicitud POST
al
extremo suscrito que contiene un cuerpo de solicitud JSON
.
HTTP sin procesar
{
"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)
Tu servicio debe responder a la API con un estado HTTP 200 OK
el código si no se produce un error.
Si tu servicio responde con un código de error, la API de Mirror podría
vuelve a enviar la notificación a tu servicio.
Tipos de notificación
La API de Mirror envía una carga útil de notificación diferente para diferentes eventos.
Responder
El usuario respondió a tu elemento de cronograma con el REPLY
integrado.
elemento del menú:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "REPLY"
}
]
}
El atributo itemId
se estableció en el ID
del artículo que contiene lo siguiente:
- El atributo
inReplyTo
se estableció en laID
del elemento de cronograma que es responder. - Se estableció el atributo
text
en la transcripción de texto. - El atributo
recipients
se estableció en lacreator
del elemento de cronograma que es una respuesta, si existe.
Ejemplo:
{
"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"
]
}
]
}
Borrar
El usuario borró un elemento del cronograma:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "DELETE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "DELETE"
}
]
}
El atributo itemId
se estableció en el ID de la plataforma
elemento. El elemento ya no contiene otros metadatos además de su ID y el
isDeleted
.
Se seleccionó el elemento de menú personalizado
El usuario seleccionó un elemento de menú personalizado que estableció el servicio:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"userActions": [
{
"type": "CUSTOM",
"payload": "PING"
}
]
}
El atributo itemId
se establece en el ID del elemento de menú que
seleccionado por el usuario.
El array userActions
contiene la lista de acciones personalizadas.
que el usuario tomó con este elemento. Tu servicio debe controlar esos
acciones en consecuencia.
Actualización de ubicación
Hay una nueva ubicación disponible para el usuario actual:
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
Cuando tu Glassware reciba una actualización de ubicación, envía un la solicitud a glass.locations.get para recuperar la última ubicación conocida. Tu cristalería recibe actualizaciones de ubicación cada diez minutos.
Comando por voz
Si el usuario activó un comando por voz, por ejemplo: "Ok Glass, toma una nota, Cat Stream, el cumpleaños de Chipotle es mañana". La siguiente notificación se envía a tu Cristalería:
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
Esta notificación se distingue de otras por el valor LAUNCH
en la propiedad userActions
.
Luego, puedes usar el valor en itemId
para recuperar el elemento de cronograma:
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
La propiedad recipients
contiene el id
del contacto que representa al
comando por voz usado.