Sie können statische Karten mit einfachen REST APIs Darüber hinaus können Sie Objekte mit einer statischen Karte verknüpfen, z. B. als Ort oder Medium.
Funktionsweise
Statische Karten befinden sich standardmäßig rechts neben der Glass-Uhr und zeigen Informationen an. die für den Nutzer zum Zeitpunkt der Bereitstellung relevant sind. Sie benötigen jedoch keine sofortige Aufmerksamkeit, wie Livekarten und Nutzer können entscheiden, ob sie die Karte lesen oder darauf reagieren möchten. zu entscheiden.
Wenn Glassware statische Karten in die Zeitachse einfügt, gibt Glass möglicherweise eine Benachrichtigung aus. um Nutzende zu warnen. Alle vorherigen statischen Karten werden ebenfalls nach rechts verschoben und verschwinden nach 7 Tagen oder wenn 200 Karten neuer sind.
Verwendung
Statische Karten eignen sich hervorragend für
regelmäßige Benachrichtigungen
bei wichtigen Ereignissen.
Beispiel: Ein Nachrichten-Lieferservice,
die wichtigsten Schlagzeilen in Echtzeit. Statische Karten der Mirror API
Sie können auch Livekarten oder
immersion über die
OPEN_URI
Menüpunkt. So können Sie hybride Interaktionen erstellen,
statische Karten als Benachrichtigungen und eine Live-Karte oder Immersion für
interaktiver gestalten.
Eine vollständige Liste der möglichen Vorgänge für Zeitachsenelemente finden Sie in der Referenz Dokumentation.
Statische Karten einfügen
POSTEN Sie zum Einfügen statischer Karten (Zeitachsenelemente) einen JSON-Darstellung eines Zeitachsenelements in den REST-Endpunkt.
Die meisten Felder in einem Zeitachsenelement sind optional. In ihrer einfachsten Form Ein Zeitachsenelement enthält nur eine kurze Textnachricht, wie in diesem Beispiel:
HTTP-Rohdaten
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()
Bei Erfolg erhalten Sie einen 201 Created
-Antwortcode mit einer
vollständige Kopie des erstellten Elements. Für das vorherige Beispiel
ist eine erfolgreiche Antwort
könnte wie folgt aussehen:
HTTP-Rohdaten
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"
}
Das eingefügte Element, das in der Zeitachse des Nutzers erscheinen würde, sieht wie folgt aus:
Zeitachsenelement mit einem Anhang einfügen
Ein Bild sagt mehr als tausend Worte – ein großes Bild Zeitachsenelements. Sie können zu diesem Zweck auch Bilder und Videos anhängen. zu einem Zeitachsenelement. Hier ist ein Beispiel für das Einfügen eines Zeitachsenelements mit einem Fotoanhang:
HTTP-Rohdaten
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()
Eine Zeitachse mit einem angehängten Bild sieht in Glass in etwa so aus:
Video wird angehängt
Wenn Sie Videodateien an Ihre Zeitachsenelemente anhängen, empfehlen wir, dass Sie das Video zu streamen, anstatt die gesamte Nutzlast auf einmal hochzuladen. Die Google Mirror API unterstützt Streaming mit HTTP-Livestreaming, progressiven Download und das Echtzeit-Streaming-Protokoll (Real Time Streaming Protocol, RTSP). RTSP wird häufig von Firewalls blockiert. Verwende also die anderen Optionen, wenn möglich.
Verwende zum Streamen von Videos die PLAY_VIDEO
integrierten Menüpunkt und geben Sie die Video-URL als
payload
Weitere Informationen finden Sie unter
Integrierte Menüelemente hinzufügen und
unterstützte Medienformate
.
Paginierung
Sie können Zeitachsenelemente paginieren,
die nicht auf eine Zeitachse passen,
sollten aber ansonsten mit derselben Karte verknüpft sein. Mit Seitenumbruch
Elemente haben alle denselben timeline.id
und daher den Wert
die gleichen Menüpunkte. Wenn Nutzende auf ein paginiertes Zeitachsenelement tippen,
Der Menüpunkt Weitere Informationen wird angezeigt.
Glass paginiert automatisch die angezeigten Zeitachsenelemente.
text
Um Glass automatisch zu nutzen
html
, verwenden Sie die article
-Tag, dessen Klasseneigenschaft auf auto-paginate
festgelegt ist, wie im folgenden Beispiel:
<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>
Verwende für den manuellen Seitenumbruch das article
-Tag für den Inhalt.
die auf den einzelnen Karten
angezeigt werden sollen. In Glass wird der Inhalt jedes
article
-Tag in einer separaten untergeordneten Zeitleistenkarte. Sie können beispielsweise eine
paginiertes Zeitachsenelement mit folgendem HTML-Code:
<article>
<section>
<p>First page</p>
</section>
</article>
<article>
<section>
<p>Second page</p>
</section>
</article>
<article>
<section>
<p>Third page</p>
</section>
</article>
Standardmäßig wird die erste Karte des paginierten Zeitachsenelements als
Coverkarte. Diese wird erneut angezeigt, wenn der Nutzer auf die Schaltfläche Weitere Informationen klickt.
Menüpunkt. Um zu verhindern, dass die erste Karte nach dem Tippen
Weitere Informationen, Sie können die CSS-Klasse cover-only
für die erste
<article>
-Tag:
<article class="cover-only">
...
Die cover-only
-Klasse unterstützt auch automatisch paginierte Zeitachsenelemente:
<article class="auto-paginate cover-only">
...
Bündelung
Mithilfe von Gruppierungen können Sie zusammengehörige, aber unterschiedliche Elemente gruppieren, z. B. einzelne Nachrichten in einem E-Mail-Thread. Sets haben eine Haupttitelkarte, tippt der Nutzer darauf, um eine Teilzeitachse mit den anderen Karten im Set anzuzeigen. Sets unterscheiden sich von normalen Zeitachsenkarten durch eine umfaltbare Ecke oben rechts auf der Titelkarte des Sets.
Wenn Sie Zeitachsenelemente bündeln möchten, erstellen Sie sie mit demselben Wert für
bundleId
Die zuletzt hinzugefügten
ist die Coverkarte des Sets.
Die folgenden Bilder zeigen ein Set. Deckblatt mit der Eckfaltung in der oberen rechten Ecke und zwei gebündelten Karten darunter.
Zeitachsenelemente werden gelesen
Ihr Dienst kann auf alle Zeitachsenelemente, die er erstellt hat, und auf alle Zeitachsen zugreifen. Elemente, die für sie freigegeben wurden. So kannst du Liste der Zeitachsenelemente auf, die für Ihren Dienst sichtbar sind.
HTTP-Rohdaten
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()
Sie können andere REST-Vorgänge für get, update und Zeitachsenelemente löschen.
Auf Anhänge zugreifen
Um auf Anhänge eines Zeitachsenelements zuzugreifen,
Ein Array-Attribut mit dem Namen attachments
.
Sie können die Binärdaten eines Anhangs dann über die
contentUrl
des Anhangs oder mit der Eigenschaft
Endpunkt für Anhänge festlegen.
HTTP-Rohdaten
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();
Menüpunkte werden erstellt
Über Menüpunkte können Nutzende Aktionen im Zusammenhang mit der Zeitachse anfordern, Es gibt zwei Arten von Menüs: integrierte und benutzerdefinierte Menüelemente.
Integrierte Menüpunkte bieten Zugriff auf spezielle Funktionen von Glass, beispielsweise das Vorlesen einer Zeitachsenkarte, das Navigieren zu einem Standort teilen, ein Bild teilen oder auf eine Nachricht antworten:
Mit benutzerdefinierten Menüelementen kann Ihre Anwendung spezifisches Verhalten anzeigen. zu Ihrer Glassware hinzufügen. Sie können auch ein Menüsymbol Branding.
Integrierte Menüelemente hinzufügen
Sie können Ihren Zeitachsenelementen integrierte Menüelemente hinzufügen, indem Sie das Menü
menuItems array
, wenn Sie sie einfügen.
Wenn Sie ein integriertes Menüelement verwenden möchten, müssen Sie nur das Feld
action
von menuItem
.
HTTP-Rohdaten
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"
}
]
}
Benutzerdefinierte Menüelemente definieren
Sollten integrierte Menüelemente bei Ihnen nicht funktionieren, können Sie benutzerdefinierte Menüelemente mit Ihrem Aktionen, indem Sie beim Einfügen oder Aktualisieren eines Zeitachsenelements folgende Schritte ausführen:
CUSTOM
fürmenuItem.action
angeben.- Geben Sie einen
menuItem.id
an. Wenn Nutzer auf den benutzerdefinierten Menüpunkt tippen, wird Ihre Glassware erhält eine Benachrichtigung mitmenuItem.id
ausgefüllt. So können Sie die Quelle der Benachrichtigung. - Geben Sie
menuItem.values
an, um eineiconUrl
hinzuzufügen unddisplayName
, das in Glass angezeigt wird. Bewegen Sie den Mauszeiger auf eine PNG-Datei im Format 50 x 50. Weißes Bild mit transparentem Hintergrund füriconUrl
. Geben Sie einen
displayTime
an. Wenn Sie keinendisplayTime
angeben, wird das Zeitachsenelement wird in den Anfang der Zeitachse verschoben, wenn Nutzende auf den benutzerdefinierten Menüpunkt tippen.
HTTP-Rohdaten
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"
}]
}
]
}
Nutzern erlauben, Ihre Zeitachse anzupinnen
Sie können einen Menüpunkt erstellen, mit dem Ihre Nutzer die Zeitachse anpinnen können, Dadurch wird die Zeitachsenkarte dauerhaft links vom Hauptfenster Uhrenkarte. Nutzer können die Karte auch loslösen, indem sie dasselbe Menü verwenden ein.
Das Anheften des Menüpunkts ist ein integrierter Menüpunkt. Sie müssen also nur die TOGGLE_PINNED
action
für menuItem
.
HTTP-Rohdaten
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"
}
...
]
}
Abos
Mit der Mirror API können Sie Benachrichtigungen abonnieren die gesendet werden, wenn der Nutzer bestimmte Aktionen Zeitachsenelement oder wenn der Nutzerstandort wurde aktualisiert. Wenn Sie eine Benachrichtigung abonnieren, eine Callback-URL angeben, die die Benachrichtigung verarbeitet.
Benachrichtigungen erhalten
Von der Mirror API wird eine Benachrichtigung als POST
-Anfrage an den
abonnierten Endpunkt mit einem JSON
-Anfragetext.
HTTP-Rohdaten
{
"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)
Der Dienst muss der API mit dem HTTP-Status 200 OK
antworten
wenn kein Fehler aufgetreten ist.
Wenn der Dienst einen Fehlercode zurückgibt, kann es sein, dass die Mirror API
versuchen Sie, die Benachrichtigung
noch einmal an Ihren Dienst zu senden.
Benachrichtigungstypen
Die Mirror API sendet für verschiedene Ereignisse eine andere Benachrichtigungsnutzlast.
Antworten
Der Nutzer hat über die integrierte REPLY
-Funktion auf deine Zeitachse geantwortet
Menüpunkt:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "REPLY"
}
]
}
Das Attribut itemId
ist auf die ID
des Elements festgelegt, das Folgendes enthält:
- Das
inReplyTo
-Attribut wurde aufID
des Zeitachsenelements festgelegt, um das es sich handelt. auf die Sie antworten. - Das Attribut
text
, das auf die Texttranskription festgelegt ist. - Das
recipients
-Attribut wurde aufcreator
des Zeitachsenelements festgelegt, das es eine Antwort ist, sofern vorhanden.
Beispiel:
{
"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"
]
}
]
}
Löschen
Der Nutzer hat ein Zeitachsenelement gelöscht:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "DELETE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "DELETE"
}
]
}
Das Attribut itemId
ist auf die ID des gelöschten Elements festgelegt.
ein. Der Artikel enthält abgesehen von der ID und dem
isDeleted
-Property.
Benutzerdefinierter Menüpunkt ausgewählt
Der Nutzer hat ein benutzerdefinierter Menüpunkt durch den Dienst festgelegt:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"userActions": [
{
"type": "CUSTOM",
"payload": "PING"
}
]
}
Das Attribut itemId
ist auf die ID des Menüpunkts festgelegt, der
ausgewählt haben.
Das Array userActions
enthält die Liste der benutzerdefinierten Aktionen
die der Nutzer für das
Element übernommen hat. Ihr Dienst sollte diese
entsprechende Maßnahmen ergreifen.
Standortaktualisierung
Für den aktuellen Nutzer ist ein neuer Standort verfügbar:
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
Wenn Ihre Glassware ein Standortupdate erhält, senden Sie an glass.locations.get um den letzten bekannten Standort abzurufen. Meine Glassware erhält alle zehn Minuten Standortaktualisierungen.
Sprachbefehl
Der Nutzer hat einen Sprachbefehl aktiviert, zum Beispiel: "Ok Glass, mach eine Notiz, Cat Stream, Chipotles Geburtstag ist morgen“. Die folgende Benachrichtigung wird an Ihr Glassware:
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
Diese Benachrichtigung unterscheidet sich von anderen Benachrichtigungen durch den Wert LAUNCH
.
in der userActions
-Property
Anschließend können Sie den Wert in itemId
verwenden, um das Zeitachsenelement abzurufen:
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
Die Eigenschaft recipients
enthält die id
des Kontakts, der den
verwendeter Sprachbefehl.