정적 카드

간단한 명령을 사용하여 정적 카드를 삽입, 업데이트, 읽고 삭제할 수 있습니다. REST API를 사용할 수 있습니다. 또한 정적 카드에 객체를 첨부할 수 있습니다. 위치 또는 미디어로 지정할 수 있습니다

작동 방식

정적 카드는 기본적으로 Glass 시계의 오른쪽에 위치하며 정보를 표시합니다. 사용자에게 관련성이 있습니다. 그러나 라이브 카드와 같은 즉각적인 관심 유도 사용자는 카드를 읽거나 작업을 할 수 있습니다 혼자 여가 시간을 보낼 수 있습니다.

Glass에서 타임라인에 정적 카드를 삽입하면 Glass에서 알림을 재생할 수 있습니다. 사용자에게 경고할 수 있습니다 이전의 모든 정적 카드도 오른쪽으로 이동합니다. 7일 후 또는 최신 카드가 200개 이상이면 타임라인에서 사라집니다.

용도

정적 카드는 게재 시 효과적임 정기적인 알림 중요한 일이 발생할 때마다 사용자에게 제공할 수 있어야 합니다 예를 들어 뉴스 전송 서비스는 주요 뉴스 기사가 발생하면 전송합니다. 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" }

자바

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

자바

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를 사용하세요. 동영상의 URL을 메뉴 항목의 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 최근 추가된 항목 항목은 번들의 표지 카드입니다.

다음 이미지는 번들을 보여줍니다. 오른쪽 상단에 모서리에서 접은 부분과 번들 2개가 있는 커버 카드 아래에 있는 카드가 표시됩니다.

타임라인 항목 읽기

서비스는 자신이 생성한 모든 타임라인 항목 및 모든 타임라인에 액세스할 수 있습니다. 개의 항목이 공유되었습니다. 다음 단계를 따르세요. 타임라인 항목을 나열합니다 표시됩니다

원시 HTTP

GET /mirror/v1/timeline HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}

자바

TimelineItem timelineItem = new TimelineItem();
service.timeline().list().execute();

Python

service.timeline().list().execute()

다른 REST 작업을 사용하여 get, update 및 타임라인 항목을 삭제합니다.

첨부파일 액세스

다음을 통해 타임라인 항목의 첨부파일에 액세스할 수 있습니다. attachments라는 배열 속성 그런 다음 contentUrl 드림 속성 또는 첨부파일 엔드포인트가 있습니다.

원시 HTTP

GET /mirror/v1/timeline/{itemId}/attachments/{attachmentId} HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}

자바

TimelineItem item = service.timeline().get(itemId).execute();
String attachmentId = item.getAttachments().get(0).getId();
service.attachments().get(itemId, attachmentId).executeAsInputStream();

메뉴 항목 만들기

메뉴 항목을 통해 사용자는 타임라인 카드와 관련된 작업을 요청할 수 있습니다. 내장된 메뉴 항목과 사용자 지정 메뉴 항목의 두 가지 유형이 있습니다.

내장 메뉴 항목을 통해 타임라인 카드 소리내어 읽기, 원하는 위치로 이동 등 위치, 이미지 공유, 메시지에 답장하기:

맞춤 메뉴 항목을 사용하면 애플리케이션이 사용자의 기기에 맞는 메뉴 항목 아이콘을 브랜드 인지도 제고를 목표로 하는 광고주

기본 제공 메뉴 항목 추가

타임라인 항목에 기본 제공 메뉴 항목을 추가하려면 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.actionCUSTOM를 지정합니다.
  • menuItem.id를 지정합니다. 사용자가 맞춤 메뉴 항목을 탭하면 Glass 소프트웨어는 다음을 포함하여 알림을 수신합니다. menuItem.id가 채워졌습니다. 이를 통해 있습니다.
  • menuItem.values를 지정하여 iconUrl 및 Glass에 표시되는 displayName입니다. 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를 사용하면 다음과 같은 작업을 수행할 수 있습니다. 알림 구독 사용자가 사이트에서 특정 작업을 수행할 때 전송되는 타임라인 항목 또는 사용자 위치 이(가) 업데이트되었습니다. 알림을 구독하면 알림을 처리하는 콜백 URL을 제공합니다.

알림 수신

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

자바

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)

서비스가 API에 200 OK HTTP 상태로 응답해야 합니다. 오류가 발생하지 않을 경우 코드를 반환합니다. 서비스가 오류 코드로 응답하면 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로 설정됩니다.

  • 타임라인 항목의 ID로 설정된 inReplyTo 속성 답글 작성
  • 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 속성은 확인할 수 있습니다

userActions 배열에는 맞춤 작업 목록이 포함됩니다. 알 수 있습니다. 여러분의 서비스는 적절한 조치를 취할 수 있습니다

위치 업데이트

현재 사용자가 새 위치를 사용할 수 있습니다.

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

Glass 소프트웨어에서 위치 업데이트를 수신하면 glass.locations.get에 대한 요청을 엔드포인트를 사용하여 알려진 최신 위치를 가져옵니다. 내 Glass 식기 10분마다 위치 업데이트를 수신합니다.

음성 명령

사용자가 다음과 같은 음성 명령을 활성화했습니다. "Ok Glass, 메모 작성하기, Cat Stream, 치폴레 생일은 내일' 다음 알림이 유리 제품:

{
  "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 표시됩니다.