Puoi inserire, aggiornare, leggere ed eliminare schede statiche utilizzando le API REST. Inoltre, puoi collegare oggetti a una scheda statica, come come posizione o contenuto multimediale.
Funzionamento
Per impostazione predefinita, le schede statiche si trovano a destra dell'orologio di Glass e mostrano informazioni pertinente per l'utente al momento della consegna. Tuttavia, non richiedono Attenzione immediata come live card e gli utenti possono scegliere di leggere o agire sulla scheda a proprio piacimento.
Quando Glassware inserisce schede statiche nella sequenza temporale, Glass potrebbe riprodurre una notifica per avvisare gli utenti. Anche tutte le schede statiche precedenti si spostano verso destra e scompaiono dalla sequenza temporale dopo 7 giorni o quando sono più recenti 200 schede.
Quando utilizzarle
Le schede statiche sono ideali per la pubblicazione
notifiche periodiche
agli utenti quando si verificano eventi importanti.
Ad esempio, un servizio di consegna di notizie che
invia le notizie principali non appena si presentano. Schede statiche dell'API Mirror
possono anche avviare live card o
immersioni attraverso
OPEN_URI
voce di menu. Ciò consente di creare interazioni ibride che utilizzano
schede statiche come notifiche e una scheda dal vivo o un'immersione per
un'esperienza più interattiva.
Per un elenco completo delle possibili operazioni relative agli elementi della sequenza temporale, consulta i riferimenti documentazione.
Inserimento di schede statiche
Per inserire schede statiche (elementi della cronologia), PUBBLICA un Rappresentazione JSON di un elemento della cronologia per l'endpoint REST.
La maggior parte dei campi di un elemento della sequenza temporale è facoltativa. Nella sua forma più semplice, un elemento della sequenza temporale contiene solo un breve messaggio di testo, come in questo esempio:
HTTP non elaborato
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()
Se l'operazione riesce, riceverai un codice di risposta 201 Created
con un
copia completa dell'elemento creato. Nell'esempio precedente, una risposta corretta
potrebbe avere il seguente aspetto:
HTTP non elaborato
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"
}
L'elemento inserito che verrebbe visualizzato nella sequenza temporale dell'utente ha il seguente aspetto:
Inserimento di un elemento della sequenza temporale con un allegato
Un'immagine vale più di mille parole, molte più parole di quanto potresti inserire in una della sequenza temporale. A questo scopo, puoi anche allegare immagini e video a un elemento della sequenza temporale. Di seguito viene riportato un esempio di come inserire un elemento della sequenza temporale con un foto allegata:
HTTP non elaborato
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 della sequenza temporale con un'immagine allegata ha il seguente aspetto su Glass:
Caricamento allegato del video in corso...
Se alleghi file video agli elementi della sequenza temporale, ti consigliamo di: riprodurre il video in streaming invece di caricare l'intero payload L'API Google Mirror supporta lo streaming con live streaming HTTP, il download progressivo e il protocollo di streaming in tempo reale (RTSP). Il protocollo RTSP è spesso bloccato dai firewall, quindi utilizza le altre opzioni quando possibile.
Per riprodurre i video in streaming, utilizza PLAY_VIDEO
voce di menu integrata e specificare l'URL del video come voce di menu
payload
. Consulta
Aggiunta di voci di menu integrate e
formati multimediali supportati
per ulteriori informazioni.
Impaginazione
Puoi impaginare gli elementi della sequenza temporale che non rientrano in una singola scheda della sequenza temporale,
ma che in caso contrario devono essere associati alla stessa carta. Impaginato
elementi condividono tutti lo stesso timeline.id
e, pertanto, hanno lo
stesso insieme di voci di menu. Quando un utente tocca un elemento della sequenza temporale impaginato, viene visualizzata una
Viene visualizzata la voce di menu Scopri di più.
Glass esegue automaticamente l'impaginazione degli elementi della sequenza temporale visualizzati
text
Per attivare automaticamente Glass
impaginare html
, utilizza article
con la proprietà di classe impostata su auto-paginate
come nell'esempio seguente:
<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>
Per impaginare manualmente, utilizza il tag article
per i contenuti
da visualizzare su ciascuna scheda. Glass mostra i contenuti di ogni
article
in una scheda separata della cronologia secondaria. Ad esempio, puoi creare una
elemento della sequenza temporale impaginato con il seguente 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>
Per impostazione predefinita, la prima scheda dell'elemento della sequenza temporale impaginato è visualizzata come
di copertina e viene nuovamente visualizzata quando l'utente seleziona Leggi tutto
voce di menu. Per evitare che la prima scheda venga visualizzata di nuovo dopo aver toccato
Scopri di più, puoi specificare la classe CSS cover-only
per la prima
Tag <article>
:
<article class="cover-only">
...
La classe cover-only
supporta anche gli elementi della sequenza temporale suddivisi automaticamente in pagine:
<article class="auto-paginate cover-only">
...
Raggruppamento
Il raggruppamento ti consente di raggruppare elementi correlati ma distinti, come singoli messaggi in un thread di email. I bundle hanno una scheda di copertina principale l'utente tocca per visualizzare una cronologia secondaria contenente le altre schede del bundle. I pacchetti sono distinti dalle normali schede della sequenza temporale da un angolo nella parte superiore della pagina nell'angolo in alto a destra della scheda di copertina del cofanetto.
Per raggruppare gli elementi della sequenza temporale, creali con lo stesso valore per
bundleId
Aggiunti più di recente
è la scheda di copertina del set.
Le seguenti immagini mostrano un cofanetto scheda di copertina con la piega in un angolo nell'angolo in alto a destra e due raccolte schede sottostanti.
Lettura degli elementi della sequenza temporale in corso...
Il tuo servizio può accedere a tutti gli elementi della sequenza temporale che ha creato e a tutte le tempistiche elementi condivisi con quest'ultima. Di seguito viene spiegato come elencare gli elementi della sequenza temporale visibile al tuo servizio.
HTTP non elaborato
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()
Puoi utilizzare altre operazioni REST per get, update e eliminare gli elementi della sequenza temporale.
Accesso agli allegati
Puoi accedere agli allegati di un elemento della cronologia tramite
una proprietà array denominata attachments
.
È quindi possibile ottenere i dati binari di un allegato tramite
contentUrl
dell'allegato o con la proprietà
endpoint degli allegati.
HTTP non elaborato
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();
Creazione di voci di menu
Le voci di menu consentono agli utenti di richiedere azioni relative alla scheda della cronologia, e sono disponibili in due tipi: voci di menu integrate e voci di menu personalizzate.
Le voci di menu integrate offrono l'accesso a funzionalità speciali fornite da Glass, ad esempio la lettura ad alta voce di una scheda della cronologia, la navigazione verso un posizione, condivisione di un'immagine o risposta a un messaggio:
Le voci di menu personalizzate consentono all'applicazione di esporre un comportamento specifico al tuo Glassware e puoi anche fornire un'icona di voce di menu corrispondente branding.
Aggiunta di voci di menu integrate
Puoi aggiungere elementi di menu integrati agli elementi della sequenza temporale compilando la
menuItems array
quando le inserisci.
Per usare una voce di menu integrata, devi solo compilare
action
di ogni menuItem
.
HTTP non elaborato
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"
}
]
}
Definizione di voci di menu personalizzate
Se le voci di menu integrate non funzionano, puoi creare voci di menu personalizzate con eseguendo le seguenti azioni durante l'inserimento o l'aggiornamento di un elemento della sequenza temporale:
- Specifica
CUSTOM
permenuItem.action
. - Specifica un valore
menuItem.id
. Quando gli utenti toccano la voce di menu personalizzata, il tuo riceve una notifica con Dati compilati:menuItem.id
. Ciò consente di determinare l'origine del notifica. - Specifica
menuItem.values
per aggiungereiconUrl
edisplayName
che appare su Glass. Posiziona il puntatore del mouse su un'immagine PNG 50 x 50 immagine bianca con uno sfondo trasparente periconUrl
. Specifica un valore
displayTime
. Se non specifichi un valoredisplayTime
, l'elemento della sequenza temporale si sposta in primo piano nella sequenza temporale ogni volta che gli utenti toccano la voce di menu personalizzata.
HTTP non elaborato
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"
}]
}
]
}
Consentire agli utenti di fissare la scheda della cronologia
Puoi creare una voce di menu che consenta agli utenti di fissare la scheda della cronologia, che mostra in modo permanente la scheda della cronologia a sinistra del riquadro principale scheda orologio. Gli utenti possono anche sbloccare la scheda utilizzando lo stesso menu molto utile.
La voce di menu di blocco è una voce di menu integrata, quindi non devi fare altro che fornire TOGGLE_PINNED
action
per menuItem
.
HTTP non elaborato
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"
}
...
]
}
Iscrizioni
L'API Mirror ti consente di iscriversi alle notifiche inviate quando l'utente intraprende azioni specifiche su una Elemento della sequenza temporale o quando la posizione dell'utente è stato aggiornato. Quando ti iscrivi a una notifica, fornisci un URL di callback che elabora la notifica.
Ricezione di notifiche
Una notifica dall'API Mirror viene inviata come richiesta POST
all'utente
endpoint a cui è stata effettuata la sottoscrizione contenente un corpo di richiesta JSON
.
HTTP non elaborato
{
"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)
Il servizio deve rispondere all'API con uno stato HTTP 200 OK
se non si è verificato alcun errore.
Se il servizio risponde con un codice di errore, l'API Mirror potrebbe
prova a inviare di nuovo la notifica al tuo servizio.
Tipi di notifiche
L'API Mirror invia un payload di notifica diverso per eventi diversi.
Rispondi
L'utente ha risposto all'elemento della cronologia utilizzando la REPLY
integrata
voce di menu:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "REPLY"
}
]
}
L'attributo itemId
è impostato sul valore ID
dell'articolo che contiene:
- Attributo
inReplyTo
impostato suID
dell'elemento della sequenza temporale è un a cui rispondi. - Attributo
text
impostato sulla trascrizione del testo. - Attributo
recipients
impostato sucreator
dell'elemento della sequenza temporale è una risposta, se esistente.
Esempio:
{
"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"
]
}
]
}
Elimina
L'utente ha eliminato un elemento della cronologia:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "DELETE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "DELETE"
}
]
}
L'attributo itemId
è impostato sull'ID dell'elemento eliminato
molto utile. L'elemento non contiene più metadati diversi dal suo ID e dalla
isDeleted
proprietà.
Voce di menu personalizzata selezionata
L'utente ha selezionato un voce di menu personalizzata impostati dal tuo servizio:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"userActions": [
{
"type": "CUSTOM",
"payload": "PING"
}
]
}
L'attributo itemId
è impostato sull'ID della voce del menu che
selezionato dall'utente.
L'array userActions
contiene l'elenco di azioni personalizzate
assunto dall'utente per l'elemento. Il tuo servizio dovrebbe gestire queste
azioni di conseguenza.
Aggiornamento posizione
È disponibile una nuova posizione per l'utente corrente:
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
Quando il tuo Glassware riceve un aggiornamento della posizione, invia un al comando glass.locations.get per recuperare l'ultima posizione nota. I tuoi bicchieri riceve aggiornamenti sulla posizione ogni dieci minuti.
Comando vocale
L'utente ha attivato un comando vocale, ad esempio: "Hey Glass, scrivi una nota, Cat Stream, il compleanno di Chipotle è domani". La seguente notifica viene inviata al tuo Bicchieri:
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
Questa notifica si distingue dalle altre per il valore LAUNCH
nella proprietà userActions
.
Puoi quindi utilizzare il valore in itemId
per recuperare l'elemento della sequenza temporale:
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
La proprietà recipients
contiene il id
del contatto che rappresenta il
il comando vocale utilizzato.