Statische Karten

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ür menuItem.action angeben.
  • Geben Sie einen menuItem.id an. Wenn Nutzer auf den benutzerdefinierten Menüpunkt tippen, wird Ihre Glassware erhält eine Benachrichtigung mit menuItem.id ausgefüllt. So können Sie die Quelle der Benachrichtigung.
  • Geben Sie menuItem.values an, um eine iconUrl hinzuzufügen und displayName, 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ür iconUrl.
  • Geben Sie einen displayTime an. Wenn Sie keinen displayTime 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 auf ID 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 auf creator 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.