Kartu Statis

Anda dapat menyisipkan, memperbarui, membaca, dan menghapus kartu statis menggunakan REST API. Selain itu, Anda bisa memasang objek ke kartu statis, seperti sebagai lokasi atau media.

Cara kerjanya

Kartu statis berada di sebelah kanan jam Glass secara default dan menampilkan informasi relevan bagi pengguna pada saat pengiriman. Namun demikian, cara itu tidak memerlukan perhatian langsung seperti kartu live dan pengguna dapat memilih untuk membaca atau menindaklanjuti kartu di waktu luang.

Ketika Glassware menyisipkan kartu statis ke linimasa, Glass dapat memutar notifikasi suara untuk memperingatkan pengguna. Semua kartu statis sebelumnya juga bergeser ke kanan dan hilang dari linimasa setelah 7 hari atau jika 200 kartu baru.

Kapan menggunakannya

Kartu statis sangat cocok untuk mengirim notifikasi berkala kepada pengguna ketika hal-hal penting terjadi. Misalnya, layanan pengiriman berita yang mengirimkan berita utama pada saat hal itu terjadi. Mencerminkan kartu statis API juga dapat memulai kartu aktif atau imersi OPEN_URI item menu. Hal ini memungkinkan Anda untuk membuat interaksi hibrida yang memanfaatkan kartu statis sebagai notifikasi dan kartu langsung atau imersi selama pengalaman yang lebih interaktif.

Untuk daftar lengkap operasi yang mungkin untuk item linimasa, lihat referensi dokumentasi tambahan.

Memasukkan kartu statis

Untuk menyisipkan kartu statis (item linimasa), POSTING Representasi JSON dari item linimasa untuk endpoint REST.

Sebagian besar kolom di item linimasa bersifat opsional. Dalam bentuk yang paling sederhana, item linimasa hanya berisi pesan teks singkat, seperti dalam contoh ini:

HTTP Mentah

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()

Jika berhasil, Anda akan menerima kode respons 201 Created dengan salinan lengkap dari item yang dibuat. Untuk contoh sebelumnya, respons yang berhasil akan terlihat seperti ini:

HTTP Mentah

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"
}

Item yang disisipkan yang akan muncul di linimasa pengguna terlihat seperti ini:

Menyisipkan item linimasa dengan lampiran

Sebuah gambar bernilai ribuan kata, lebih banyak dari yang bisa Anda masukkan ke dalam item linimasa. Untuk tujuan ini, Anda juga dapat melampirkan gambar dan video ke item linimasa. Berikut adalah contoh cara menyisipkan item linimasa dengan lampiran foto:

HTTP Mentah

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()

Item linimasa dengan lampiran gambar akan terlihat seperti ini di Glass:

Melampirkan video

Jika Anda melampirkan file video ke item linimasa, sebaiknya melakukan streaming video, bukan mengunggah seluruh isi sekaligus. Google Mirror API mendukung streaming dengan live streaming HTTP, download progresif, dan protokol streaming real-time (RTSP). RTSP sering diblokir oleh {i>firewall<i}, jadi gunakan opsi lain saat sebaik mungkin.

Untuk melakukan streaming video, gunakan PLAY_VIDEO item menu bawaan dan menentukan URL video sebagai payload. Lihat Menambahkan item menu bawaan dan format media yang didukung untuk informasi selengkapnya.

Memberi nomor halaman

Anda dapat memberi nomor halaman pada item linimasa yang tidak sesuai di satu kartu linimasa, tetapi yang sebenarnya harus dikaitkan dengan kartu yang sama. Diberi halaman semua item memiliki timeline.id yang sama sehingga memiliki set item menu yang sama. Saat pengguna mengetuk item linimasa yang diberi nomor halaman, Item menu Baca selengkapnya akan muncul.

Glass secara otomatis memberi nomor halaman pada item linimasa yang ditampilkan text Memiliki Glass secara otomatis beri nomor halaman html, gunakan article tag dengan properti class-nya yang disetel ke auto-paginate seperti pada contoh berikut:

<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>

Untuk memberi nomor halaman secara manual, gunakan tag article untuk konten yang ingin ditampilkan pada setiap kartu. Glass menampilkan isi masing-masing article di kartu sub-linimasa terpisah. Misalnya, Anda dapat membuat item linimasa yang telah diberi nomor halaman dengan HTML berikut:

<article>
 <section>
   <p>First page</p>
 </section>
</article>

<article>
 <section>
   <p>Second page</p>
 </section>
</article>

<article>
 <section>
   <p>Third page</p>
 </section>
</article>

Secara default, kartu pertama item linimasa yang diberi nomor halaman ditampilkan sebagai kartu sampul dan ditampilkan kembali saat pengguna memilih tombol Baca selengkapnya item menu. Untuk mencegah kartu pertama muncul lagi setelah diketuk Baca selengkapnya, Anda dapat menentukan class CSS cover-only untuk Tag <article>:

<article class="cover-only">
...

Class cover-only juga mendukung item linimasa yang dipaginasi otomatis:

<article class="auto-paginate cover-only">
...

Pemaketan

Pemaketan memungkinkan Anda untuk mengelompokkan item yang berkaitan namun berbeda, misalnya untuk pesan individual dalam rangkaian pesan email. Paket memiliki kartu sampul utama yang pengguna mengetuk untuk menampilkan sub-linimasa yang berisi kartu lain dalam paket. Paket dibedakan dari kartu linimasa normal dengan lipatan sudut di bagian atas pojok kanan kartu sampul paket.

Untuk memaketkan item linimasa, buat item dengan nilai yang sama untuk bundleId Yang terakhir ditambahkan adalah kartu sampul paket.

Gambar berikut menunjukkan paket kartu sampul dengan lipatan sudut di sudut kanan atas dan dua paket kartu di bawahnya.

Membaca item linimasa

Layanan Anda dapat mengakses semua item linimasa yang dibuatnya, dan semua linimasa item yang dibagikan dengannya. Berikut cara mencantumkan item linimasa yang terlihat oleh layanan Anda.

HTTP Mentah

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()

Anda dapat menggunakan operasi REST lainnya untuk mendapatkan, update dan hapus item linimasa.

Mengakses lampiran

Anda dapat mengakses lampiran ke item linimasa melalui properti array bernama attachments. Anda kemudian bisa mendapatkan data biner lampiran melalui contentUrl properti lampiran atau dengan endpoint lampiran.

HTTP Mentah

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();

Membuat item menu

Dengan item menu, pengguna dapat meminta tindakan yang terkait dengan kartu linimasa, dan tersedia dalam dua jenis: item menu bawaan dan item menu khusus.

Item menu bawaan menyediakan akses ke fungsi khusus yang disediakan oleh Kaca, seperti membacakan kartu linimasa, menavigasi ke lokasi, berbagi gambar, atau membalas pesan:

Item menu khusus memungkinkan aplikasi Anda mengekspos perilaku yang spesifik ke Glassware, dan Anda juga dapat menyediakan ikon item menu {i>branding.<i}

Menambahkan item menu bawaan

Anda dapat menambahkan item menu bawaan ke item linimasa dengan mengisi menuItems array saat Anda menyisipkannya. Untuk menggunakan item menu bawaan, Anda hanya perlu mengisi action dari setiap menuItem.

HTTP Mentah

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"
    }
  ]
}

Menentukan item menu kustom

Jika item menu bawaan tidak berfungsi, Anda dapat membuat item menu khusus dengan tindakan Anda sendiri dengan melakukan hal berikut saat menyisipkan atau memperbarui item linimasa:

  • Tentukan CUSTOM untuk menuItem.action.
  • Tentukan menuItem.id. Saat pengguna mengetuk item menu kustom, Glassware Anda menerima notifikasi berisi menuItem.id telah diisi. Hal ini memungkinkan Anda menentukan sumber notifikasi.
  • Tentukan menuItem.values untuk menambahkan iconUrl dan displayName yang muncul di Glass. Arahkan kursor ke PNG berukuran 50 x 50 gambar berwarna putih dengan latar belakang transparan untuk iconUrl.
  • Tentukan displayTime. Jika Anda tidak menentukan displayTime, item linimasa berpindah ke bagian depan linimasa setiap kali pengguna mengetuk item menu kustom.

HTTP Mentah

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"
      }]
    }
  ]
}

Mengizinkan pengguna menyematkan kartu linimasa Anda

Anda dapat membuat item menu yang memungkinkan pengguna menyematkan kartu linimasa, yang secara permanen menampilkan kartu linimasa di sebelah kiri elemen kartu clock. Pengguna juga dapat melepas sematan kartu, dengan menggunakan menu yang sama yang bermanfaat.

Item menu penyematan adalah item menu bawaan, sehingga Anda hanya perlu menyediakan TOGGLE_PINNED action untuk menuItem.

HTTP Mentah

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"
    }
  ...
 ]
}

Langganan

Mirror API memungkinkan Anda untuk berlangganan notifikasi yang dikirim saat pengguna melakukan tindakan tertentu pada Item Linimasa atau kapan lokasi pengguna telah diperbarui. Jika berlangganan notifikasi, Anda menyediakan URL callback yang memproses notifikasi.

Menerima notifikasi

Notifikasi dari Mirror API dikirim sebagai permintaan POST ke endpoint langganan yang berisi isi permintaan JSON.

HTTP Mentah

{
  "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)

Layanan Anda harus merespons API dengan status HTTP 200 OK jika tidak terjadi error. Jika layanan Anda merespons dengan kode error, Mirror API mungkin coba kirim ulang notifikasi ke layanan Anda.

Jenis notifikasi

Mirror API mengirimkan payload notifikasi yang berbeda untuk berbagai peristiwa.

Balas

Pengguna telah membalas item linimasa Anda menggunakan REPLY bawaan item menu:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "INSERT",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer",
  "userActions": [
    {
      "type": "REPLY"
    }
  ]
}

Atribut itemId disetel ke ID item yang berisi:

  • Atribut inReplyTo disetel ke ID item linimasa balas.
  • Atribut text disetel ke transkripsi teks.
  • Atribut recipients disetel ke creator item linimasa yang adalah balasannya, jika ada.

Contoh:

{
  "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"
      ]
    }
  ]
}

Hapus

Pengguna telah menghapus item linimasa:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "DELETE",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer",
  "userActions": [
    {
      "type": "DELETE"
    }
  ]
}

Atribut itemId disetel ke ID yang dihapus yang bermanfaat. Item tidak lagi berisi metadata selain ID-nya dan isDeleted.

Item menu kustom dipilih

Pengguna telah memilih item menu kustom yang disetel oleh layanan Anda:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "UPDATE",
  "userToken": "harold_penguin",
  "userActions": [
    {
      "type": "CUSTOM",
      "payload": "PING"
    }
  ]
}

Atribut itemId disetel ke ID item menu yang dipilih pengguna.

Array userActions berisi daftar tindakan kustom yang diambil pengguna untuk item ini. Layanan Anda harus menangani hal tersebut tindakan yang sesuai.

Pembaruan lokasi

Lokasi baru tersedia untuk pengguna saat ini:

{
  "collection": "locations",
  "itemId": "latest",
  "operation": "UPDATE",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer"
}

Saat Glassware menerima pembaruan lokasi, kirimkan permintaan ke glass.locations.get endpoint untuk mengambil lokasi terbaru yang diketahui. Peralatan Kaca Anda menerima pembaruan lokasi setiap sepuluh menit.

Perintah suara

Pengguna telah mengaktifkan perintah suara, misalnya: "Ok Glass, catat, Cat Stream, Ulang tahun Chipotle adalah besok". Notifikasi berikut dikirim ke Peralatan Pecah Belah:

{
  "collection": "timeline",
  "operation": "INSERT",
  "userToken": "chipotle's_owner",
  "verifyToken": "mew mew mew",
  "itemId": "<ITEM_ID>",
  "userActions": [
    {type: "LAUNCH"}
  ]
}

Notifikasi ini dibedakan dari notifikasi lainnya berdasarkan nilai LAUNCH di properti userActions.

Anda kemudian dapat menggunakan nilai dalam itemId untuk mengambil item linimasa:

{
  "id": "<ITEM_ID>",
  "text": "Chipotle's birthday is tomorrow",
  "recipients": [
    {"id": "CAT_STREAM"}
  ]
}

Properti recipients berisi id kontak yang mewakili menggunakan perintah suara.