Anda dapat menyisipkan, memperbarui, membaca, dan menghapus kartu statis menggunakan REST API sederhana. Selain itu, Anda dapat melampirkan objek ke kartu statis, seperti lokasi atau media.
Cara kerjanya
Kartu statis berada di sebelah kanan jam Glass dan secara default menampilkan informasi yang relevan bagi pengguna pada saat pengiriman. Namun, metode ini tidak memerlukan fokus langsung seperti kartu live dan pengguna dapat memilih untuk membaca atau menindaklanjuti kartu tersebut di waktu senggang.
Saat Glassware menyisipkan kartu statis ke linimasa, Glass dapat memutar suara notifikasi untuk memberi tahu pengguna. Semua kartu statis sebelumnya juga akan bergeser ke kanan dan menghilang dari linimasa setelah 7 hari atau saat 200 kartu lebih baru.
Kapan menggunakannya
Kartu statis sangat bagus untuk mengirimkan
notifikasi berkala
kepada pengguna saat hal penting terjadi.
Misalnya, layanan pengiriman berita yang
mengirim berita utama saat itu terjadi. Kartu statis Mirror API
juga dapat memulai kartu live atau
immers melalui item menu
OPEN_URI
. Hal ini memungkinkan Anda membuat interaksi campuran yang menggunakan
kartu statis sebagai notifikasi dan kartu live atau imersif untuk
pengalaman yang lebih interaktif.
Untuk mengetahui daftar lengkap operasi yang dapat dilakukan untuk item linimasa, lihat dokumentasi referensi.
Memasukkan kartu statis
Untuk menyisipkan kartu statis (item linimasa), POSTING representasi JSON item linimasa ke endpoint REST.
Sebagian besar kolom dalam 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()
Setelah berhasil, Anda akan menerima kode respons 201 Created
dengan salinan lengkap item yang dibuat. Untuk contoh sebelumnya, respons yang berhasil
mungkin 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 akan terlihat seperti ini:
Menyisipkan item linimasa dengan lampiran
Sebuah gambar bernilai ribuan kata, yang jauh lebih banyak daripada yang dapat Anda masukkan ke dalam item linimasa. Untuk itu, 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 gambar terlampir terlihat seperti ini di Glass:
Melampirkan video
Jika Anda melampirkan file video ke item linimasa, sebaiknya lakukan streaming video, bukan mengupload seluruh payload sekaligus. Google Mirror API mendukung streaming dengan live streaming HTTP, download progresif, dan protokol streaming real-time (RTSP). RTSP sering diblokir oleh firewall, jadi gunakan opsi lainnya jika memungkinkan.
Untuk melakukan streaming video, gunakan item menu bawaan PLAY_VIDEO
dan tentukan URL video menjadi payload
item menu. Lihat
Menambahkan item menu bawaan dan
format media yang didukung
untuk informasi selengkapnya.
Penomoran halaman
Anda dapat memberi nomor item linimasa yang tidak muat dalam satu kartu linimasa,
tetapi seharusnya dikaitkan dengan kartu yang sama. Semua item yang dipaginasi memiliki timeline.id
yang sama, sehingga memiliki kumpulan 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 menampilkan
text
. Agar Glass membagi halaman secara otomatis html
, gunakan tag article
dengan properti class-nya yang ditetapkan ke auto-paginate
seperti dalam 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 melakukan penomoran halaman secara manual, gunakan tag article
untuk konten
yang ingin Anda tampilkan di setiap kartu. Glass menampilkan konten setiap tag article
dalam kartu sub-linimasa terpisah. Misalnya, Anda dapat membuat
item linimasa yang dipaginasi 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 lagi saat pengguna memilih item menu
Baca selengkapnya. Agar kartu pertama tidak muncul lagi setelah mengetuk
Baca selengkapnya, Anda dapat menentukan class CSS cover-only
untuk
tag <article>
pertama:
<article class="cover-only">
...
Class cover-only
juga mendukung item linimasa yang dipaginasi otomatis:
<article class="auto-paginate cover-only">
...
Pemaketan
Dengan pengelompokan, Anda dapat mengelompokkan item yang terkait, tetapi yang berbeda, seperti untuk setiap pesan dalam rangkaian email. Paket memiliki kartu sampul utama yang diketuk pengguna untuk menampilkan sub-linimasa yang berisi kartu lain dalam paket. Paket dibedakan dari kartu linimasa normal dengan lipatan sudut di sudut kanan atas kartu sampul paket.
Untuk memaketkan item linimasa, buat item dengan nilai yang sama untuk
bundleId
. Item yang
terakhir ditambahkan adalah kartu sampul paket.
Gambar berikut menampilkan kartu sampul paket dengan lipatan sudut di sudut kanan atas dan dua kartu paket di bawahnya.
Membaca item linimasa
Layanan Anda dapat mengakses semua item linimasa yang dibuatnya, dan semua item linimasa 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 lain untuk mendapatkan, memperbarui, dan menghapus item linimasa.
Mengakses lampiran
Anda dapat mengakses lampiran ke item linimasa melalui
properti array bernama attachments
.
Kemudian, Anda dapat memperoleh data biner lampiran melalui properti
contentUrl
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
Item menu memungkinkan pengguna meminta tindakan yang terkait dengan kartu linimasa, dan tersedia dalam dua jenis: item menu bawaan dan item menu kustom.
Item menu bawaan memberikan akses ke fungsi khusus yang disediakan oleh Glass, seperti membaca kartu linimasa, menavigasi ke lokasi, berbagi gambar, atau membalas pesan:
Item menu kustom memungkinkan aplikasi mengekspos perilaku spesifik untuk Glassware, dan Anda juga dapat menyediakan ikon item menu agar sesuai dengan branding.
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 kustom dengan tindakan Anda sendiri dengan melakukan hal berikut saat menyisipkan atau memperbarui item linimasa:
- Tentukan
CUSTOM
untukmenuItem.action
. - Tentukan
menuItem.id
. Saat pengguna mengetuk item menu kustom, Glassware akan menerima notifikasi yang berisimenuItem.id
yang terisi. Ini memungkinkan Anda menentukan sumber notifikasi. - Tentukan
menuItem.values
untuk menambahkaniconUrl
dandisplayName
yang muncul di Glass. Arahkan kursor ke gambar PNG 50 x 50 yang berwarna putih dengan latar belakang transparan untukiconUrl
. Tentukan
displayTime
. Jika Anda tidak menentukandisplayTime
, item linimasa akan 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 menampilkan kartu linimasa secara permanen di sebelah kiri kartu jam utama. Pengguna juga dapat melepaskan kartu, dengan menggunakan item menu yang sama.
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"
}
...
]
}
Subscription
Dengan Mirror API, Anda dapat berlangganan notifikasi yang dikirim saat pengguna mengambil tindakan tertentu pada Item Linimasa atau saat lokasi pengguna telah diperbarui. Saat berlangganan notifikasi, Anda memberikan URL callback yang memproses notifikasi tersebut.
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 kode status HTTP 200 OK
jika tidak terjadi error.
Jika layanan Anda merespons dengan kode error, Mirror API mungkin akan mencoba mengirim ulang notifikasi ke layanan Anda.
Jenis notifikasi
Mirror API mengirim payload notifikasi yang berbeda untuk peristiwa yang berbeda.
Balas
Pengguna telah membalas item linimasa Anda menggunakan item menu REPLY
bawaan:
{
"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
yang ditetapkan keID
item linimasa yang dibalas. - Atribut
text
ditetapkan ke transkripsi teks. - Atribut
recipients
yang disetel kecreator
item linimasa yang dibalasnya, 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 item
yang dihapus. Item tidak lagi berisi metadata selain ID-nya dan properti
isDeleted
.
Item menu kustom dipilih
Pengguna telah memilih item menu kustom yang ditetapkan 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 dilakukan pengguna pada item ini. Layanan Anda harus menangani
tindakan tersebut sebagaimana mestinya.
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, kirim permintaan ke endpoint glass.locations.get untuk mengambil lokasi terbaru yang diketahui. Glassware akan menerima pembaruan lokasi setiap sepuluh menit.
Perintah suara
Pengguna Anda telah mengaktifkan perintah suara, misalnya: "Ok Glass, catat, Cat Stream, ulang tahun Chipotle adalah besok". Notifikasi berikut dikirim ke Glassware:
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
Notifikasi ini berbeda dari notifikasi lain berdasarkan nilai LAUNCH
di properti userActions
.
Selanjutnya, Anda dapat menggunakan nilai di 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 perintah suara yang digunakan.