靜態卡片

您可以透過簡單的 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。 如要使用內建的選單項目,您只需要填入 每個 menuItemaction

原始 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 即可新增 iconUrldisplayName會出現在 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 適用於 menuItemaction

原始 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 的聯絡人 語音指令。