您可以透過簡單的 REST API此外,您可以將物件附加至靜態資訊卡,例如 文字或媒體
運作方式
靜態卡片預設位於 Glass 時鐘的右側,並顯示資訊 建立與使用者相關的主題但不必 立即受到關注,例如即時資訊卡 使用者可以選擇閱讀卡片或處理資訊卡 用自己的方式享受美好時光
Glassware 將靜態卡片插入時間軸時,Glass 可能會播放通知 提醒使用者所有先前的靜態卡片也移至右側 且有 200 張資訊卡更新後,時間軸就會消失。
使用時機
使用靜態卡片時
定期通知
把重點放在使用者身上
例如新聞廣告放送服務
即時新聞報導Mirror API 靜態資訊卡
啟動即時資訊卡或
沉浸在
OPEN_URI
選單項目。這樣一來,您就能建立
使用靜態卡片做為通知,即時資訊卡或沈浸式內容
以及更具互動性的體驗
如需時間軸項目可進行的完整作業清單,請參閱參考資料 說明文件。
插入靜態卡片
如要插入靜態資訊卡 (時間軸項目),請將 時間軸項目的 JSON 表示法 REST 端點
時間軸項目中的大多數欄位都是選填欄位。最簡單的形式 時間軸項目只包含簡短文字訊息,如以下範例所示:
原始 HTTP
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()
成功後,您會收到 201 Created
回應代碼,其中包含
項目的完整副本。就上例而言,成功的回應
看起來會像這樣:
原始 HTTP
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"
}
插入的項目會顯示在使用者時間軸中,如下所示:
插入含有附件的時間軸項目
一張圖勝過千言萬語,這遠超出了 時間軸項目你也可以附加圖片和影片 附加至時間軸項目以下範例說明如何插入含有 相片附件:
原始 HTTP
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()
含有附加圖片的時間軸項目在 Glass 上看起來如下:
正在附加影片
如要在時間軸項目中附加影片檔案,建議您 串流影片,而不是一次上傳整個酬載。 Google Mirror API 支援 HTTP 直播, 漸進式下載,以及即時串流通訊協定 (RTSP)。 防火牆經常封鎖 RTSP,因此請採用其他選項
如要串流播放影片,請使用PLAY_VIDEO
,並將影片網址指定為該選單項目的
payload
。詳情請見
新增內建的選單項目和
支援的媒體格式
瞭解詳情
分頁
您可以將不符合單一時間軸資訊卡的時間軸項目套用分頁;
但應與同一張卡片相關聯整頁模式
所有項目都共用相同的 timeline.id
,因此具有
一組相同的選單項目使用者輕觸分頁式時間軸項目時,
系統會隨即顯示「閱讀完整內容」選單項目。
Glass 會自動為時間軸項目顯示分頁
text
。自動讓 Glass
分頁 html
,使用 article
且其類別屬性設為 auto-paginate
的標記,如以下範例所示:
<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>
如要手動進行分頁,請為內容使用 article
標記
顯示您要顯示在每張資訊卡上的資訊卡Glass 會顯示每個
article
標記顯示在個別子時間軸資訊卡中。舉例來說,您可以建立
包含下列 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>
根據預設,分頁時間軸項目的第一張資訊卡會顯示為
封面資訊卡,會在使用者選取「閱讀完整內容」時再次顯示
選單項目。防止在輕觸後再次顯示第一張卡片
瞭解詳情,您可以為第一個指定 cover-only
CSS 類別
<article>
標記:
<article class="cover-only">
...
cover-only
類別也支援自動分頁時間軸項目:
<article class="auto-paginate cover-only">
...
郵件分類
您可以透過郵件分類功能,將具有不同但相關的項目歸為一組,例如 電子郵件討論串中的個別郵件。套裝組合會有主要封面資訊卡, 使用者輕觸後,即可顯示包含組合中其他資訊卡的子時間軸。 套裝組合與一般時間軸資訊卡在上方角落的摺疊位置做出區隔 。
如要組合時間軸項目,請使用相同的值建立這些項目:
bundleId
。最近新增
項目是套裝組合的封面資訊卡。
下圖顯示組合圖片 右上角折疊的封面資訊卡,以及兩個組合 資訊卡
讀取時間軸項目
你的服務可以存取所有由您建立的時間軸項目和所有時間軸 其他共用項目。方法如下 列出時間軸項目 使用者社群中的個人資料。
原始 HTTP
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()
您可以使用其他 REST 作業來 get、 更新並 刪除時間軸項目。
存取附件
你可以透過以下方式存取時間軸項目附件:
名為 attachments
的陣列屬性。
接著,您可以透過
contentUrl
敬上
或含有附加文字的
「連結端點」。
原始 HTTP
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();
建立選單項目
選單項目可讓使用者要求與時間軸資訊卡相關的動作。 且有兩種類型:內建選單項目和自訂選單項目。
使用者可透過內建的選單項目,存取 玻璃,例如大聲朗讀時間軸資訊卡、前往 位置、分享圖片或回覆訊息:
自訂選單項目可讓應用程式公開特定的 與您的 Glassware 通訊,而您也可提供與自身的 品牌
新增內建選單項目
只要填入
menuItems array
。
如要使用內建的選單項目,您只需要填入
每個 menuItem
的 action
。
原始 HTTP
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"
}
]
}
定義自訂選單項目
如果內建的選單項目不符合您的需求,您可以使用 方法是在插入或更新時間軸項目時執行下列操作:
- 為
menuItem.action
指定CUSTOM
。 - 指定
menuItem.id
。使用者輕觸自訂選單項目時,您的 Glassware 會收到 已填入menuItem.id
。這可以判斷 通知。 - 指定
menuItem.values
即可新增iconUrl
和displayName
會出現在 Glass 上。指向 50 x 50 的 PNG 檔案 是白色且帶有透明背景的iconUrl
圖片。 指定
displayTime
。如未指定displayTime
,時間軸項目 每當使用者輕觸自訂選單項目時,就會移至時間軸前方。
原始 HTTP
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"
}]
}
]
}
允許使用者固定時間軸資訊卡
您可以建立選單項目,讓使用者固定時間軸資訊卡 會在主要視窗左側永久顯示時間軸資訊卡 時鐘資訊卡。使用者也可以使用相同的選單取消固定資訊卡 項目。
固定選單項目是內建的選單項目,因此您只需要提供 TOGGLE_PINNED
適用於 menuItem
的 action
。
原始 HTTP
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"
}
...
]
}
訂閱
Mirror API 可讓您 訂閱通知 在使用者採取特定動作時傳送 時間軸項目或使用者位置時 已更新。訂閱通知後, 提供可處理通知的回呼網址。
接收通知
Mirror API 的通知會以 POST
要求的形式傳送至
已訂閱的端點,內含 JSON
要求主體。
原始 HTTP
{
"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)
您的服務必須以 200 OK
HTTP 狀態回應 API
程式碼。
如果服務傳回錯誤代碼,Mirror API 可能會
請嘗試重新傳送通知給服務。
通知類型
Mirror API 會針對不同事件傳送不同的通知酬載。
回覆
使用者使用內建的 REPLY
回覆時間軸項目
選單項目:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "REPLY"
}
]
}
itemId
屬性已設為包含以下項目的項目 ID
:
inReplyTo
屬性已設為時間軸項目的ID
回覆者。text
屬性已設為文字語音轉錄。recipients
屬性已設為時間軸項目的creator
是指回覆 (如果有的話)。
範例:
{
"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"
]
}
]
}
刪除
使用者已刪除時間軸項目:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "DELETE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "DELETE"
}
]
}
itemId
屬性設為已刪除項目的 ID
項目。項目不再包含 ID 和
isDeleted
屬性。
已選取自訂選單項目
使用者已選取 自訂選單項目 元件設定:
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"userActions": [
{
"type": "CUSTOM",
"payload": "PING"
}
]
}
itemId
屬性已設為該選單項目的 ID
使用者選取的項目
userActions
陣列包含自訂動作清單
使用者花費的項目您的服務應能處理這些要求
並據此採取行動
位置更新
新的位置將對目前的使用者開放:
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
Glassware 收到位置更新後, 要求 glass.locations.get 端點,擷取最新的已知位置。你的 Glassware 則每十分鐘會收到位置更新通知。
語音指令
使用者啟動了語音指令,例如: 「Ok Glass,新增記事, Cat Stream, Chipotle 的生日是 。以下通知會傳送到 Glassware:
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
此通知與其他通知的 LAUNCH
值不同
在 userActions
屬性中。
然後,您可以使用 itemId
中的值擷取時間軸項目:
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
recipients
屬性包含代表 id
的聯絡人
語音指令。