Statik Kartlar

Basit REST API'lerini kullanarak statik kartlar ekleyebilir, güncelleyebilir, okuyabilir ve silebilirsiniz. Ayrıca, statik bir karta konum veya medya gibi öğeler ekleyebilirsiniz.

İşleyiş şekli

Statik kartlar varsayılan olarak Glass saatinin sağında bulunur ve teslimat sırasında kullanıcıyla alakalı bilgileri gösterir. Ancak canlı kartlar gibi anında dikkat gerektirmez ve kullanıcılar kartı istedikleri zaman okuyabilir veya kartla ilgili işlem yapabilir.

Glassware zaman çizelgesine statik kartlar eklediğinde Glass, kullanıcıları uyarmak için bildirim sesi çalabilir. Önceki tüm statik kartlar da sağa kayar ve 7 gün sonra veya 200 kart daha yeni olduğunda zaman çizelgesinden kaybolur.

Ne zaman kullanılır?

Statik kartlar, önemli olaylar gerçekleştiğinde kullanıcılara düzenli bildirimler göndermek için idealdir. Örneğin, en önemli haberleri olduğu anda yayınlayan bir haber yayını hizmeti. Mirror API statik kartları, OPEN_URI menü öğesinden canlı kartlar veya immersive deneyimler de başlatabilir. Bu sayede, bildirimler için statik kartlar ve daha etkileşimli bir deneyim için canlı kart veya tam sayfa görüntüleme kullanan karma etkileşimler oluşturabilirsiniz.

Zaman çizelgesi öğeleriyle yapılabilecek işlemlerin tam listesi için referans dokümanlarına bakın.

Statik kart ekleme

Statik kartları (zaman çizelgesi öğeleri) eklemek için REST uç noktasına zaman çizelgesi öğesinin JSON temsilini POST yapın.

Zaman çizelgesi öğesindeki alanların çoğu isteğe bağlıdır. Zaman çizelgesi öğeleri, en basit haliyle yalnızca kısa bir metin mesajı içerir. Örneğin:

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

İşlem başarılı olursa oluşturulan öğenin tam kopyasını içeren bir 201 Created yanıt kodu alırsınız. Önceki örnekte başarılı bir yanıt şu şekilde görünebilir:

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

Kullanıcının zaman çizelgesinde görünecek şekilde eklenen öğe şu şekilde görünür:

Ek içeren bir zaman çizelgesi öğesi ekleme

Bir resim binlerce kelimeye bedeldir. Bu da zaman çizelgesi öğesine sığdırabileceğinizden çok daha fazladır. Bu amaçla, zaman çizelgesi öğelerine resim ve video da ekleyebilirsiniz. Aşağıda, fotoğraf eki içeren bir zaman çizelgesi öğesinin nasıl ekleneceğine dair bir örnek verilmiştir:

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

Ekli resim içeren bir zaman çizelgesi öğesi Glass'ta şöyle görünür:

Video ekleme

Zaman çizelgesi öğelerinize video dosyaları ekliyorsanız yükün tamamını bir kerede yüklemek yerine videoyu aktarmanızı öneririz. Google Mirror API, HTTP canlı yayını, aşamalı indirme ve gerçek zamanlı akış protokolü (RTSP) ile yayını destekler. RTSP genellikle güvenlik duvarları tarafından engellenir. Mümkün olduğunda diğer seçenekleri kullanın.

Video yayınlamak için yerleşik PLAY_VIDEO menü öğesini kullanın ve videonun URL'sini menü öğesinin payload olarak belirtin. Daha fazla bilgi için Yerleşik menü öğeleri ekleme ve desteklenen medya biçimleri başlıklı makaleleri inceleyin.

Sayfalara ayırma

Tek bir zaman çizelgesi kartına sığmayan ancak aynı kartla ilişkilendirilmesi gereken zaman çizelgesi öğelerini sayfalara ayırabilirsiniz. Sayfalandırılmış öğelerin tümü aynı timeline.id öğesini paylaşır ve bu nedenle aynı menü öğelerine sahiptir. Kullanıcı sayfaya ayrılmış bir zaman çizelgesi öğesine dokunduğunda Daha fazla oku menü öğesi gösterilir.

Glass, text görüntülenen zaman çizelgesi öğelerini otomatik olarak sayfalara ayırır. Glass'ın html öğesini otomatik olarak sayfalara ayırmasını sağlamak için sınıf özelliği auto-paginate olarak ayarlanmış article etiketini aşağıdaki örnekte gösterildiği gibi kullanın:

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

Sayfaları manuel olarak bölmek için her kartta görüntülemek istediğiniz içerik için article etiketini kullanın. Glass, her article etiketinin içeriğini ayrı bir alt zaman çizelgesi kartında gösterir. Örneğin, aşağıdaki HTML ile sayfaya bölünmüş bir zaman çizelgesi öğesi oluşturabilirsiniz:

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

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

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

Sayfaya ayrılmış zaman çizelgesi öğesinin ilk kartı varsayılan olarak kapak kartı olarak gösterilir ve kullanıcı Daha fazla oku menü öğesini seçtiğinde tekrar gösterilir. Daha fazla bilgi'ye dokunduktan sonra ilk kartın tekrar görünmesini önlemek için ilk <article> etiketi için cover-only CSS sınıfını belirtebilirsiniz:

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

cover-only sınıfı, otomatik olarak sayfaya bölünmüş zaman çizelgesi öğelerini de destekler:

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

Gruplandırma

Gruplandırma, ilgili ancak farklı öğeleri (ör. bir e-posta ileti dizisindeki ayrı iletiler) birlikte gruplandırmanıza olanak tanır. Paketlerin ana kapak kartı vardır. Kullanıcı, paketteki diğer kartları içeren bir alt zaman çizelgesi görüntülemek için bu karta dokunur. Paketler, paketin kapak kartının sağ üst köşesindeki köşe kıvrımı ile normal zaman çizelgesi kartlarından ayırt edilir.

Zaman çizelgesi öğelerini gruplandırmak için bundleId için aynı değere sahip öğeler oluşturun. En son eklenen öğe paketin kapak kartıdır.

Aşağıdaki resimlerde, sağ üst köşesinde köşe kıvrımı olan bir paket kapak kartı ve altında iki paketlenmiş kart gösterilmektedir.

Zaman çizelgesi öğelerini okuma

Hizmetiniz, oluşturduğu tüm zaman çizelgesi öğelerine ve kendisiyle paylaşılan tüm zaman çizelgesi öğelerine erişebilir. Hizmetinize görünen zaman çizelgesi öğelerini listeleyebilirsiniz.

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

Zaman çizelgesi öğelerini almak, güncellemek ve silmek için diğer REST işlemlerini kullanabilirsiniz.

Eklere erişme

Zaman çizelgesi öğesinin eklerine attachments adlı bir dizi mülkü aracılığıyla erişebilirsiniz. Ardından, ekteki contentUrl mülkü veya ek uç noktası aracılığıyla ekin ikili verilerini elde edebilirsiniz.

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

Menü öğeleri oluşturma

Menü öğeleri, kullanıcıların zaman çizelgesi kartıyla ilgili işlemler istemesine olanak tanır ve iki türde bulunur: yerleşik menü öğeleri ve özel menü öğeleri.

Yerleşik menü öğeleri, zaman çizelgesi kartını sesli okuma, bir konuma gitme, resim paylaşma veya mesajı yanıtlama gibi Glass'ın sunduğu özel işlevlere erişim sağlar:

Özel menü öğeleri, uygulamanızın Glassware'ınıza özgü davranışları göstermesine olanak tanır. Ayrıca markanızla eşleşen bir menü öğesi simgesi de sağlayabilirsiniz.

Yerleşik menü öğeleri ekleme

Zaman çizelgesi öğelerinize yerleşik menü öğeleri eklemek için menuItems array öğesini doldurabilirsiniz. Yerleşik bir menü öğesini kullanmak için her menuItem öğesinin action değerini doldurmanız yeterlidir.

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

Özel menü öğeleri tanımlama

Yerleşik menü öğeleri size uygun değilse zaman çizelgesi öğesi eklerken veya güncellerken aşağıdakileri yaparak kendi işlemlerinizle özel menü öğeleri oluşturabilirsiniz:

  • menuItem.action için CUSTOM değerini belirtin.
  • Bir menuItem.id belirtin. Kullanıcılar özel menü öğesine dokunduğunda, Cam eşyalarınıza menuItem.id değerinin doldurulduğu bir bildirim gönderilir. Bu sayede bildirimin kaynağını belirleyebilirsiniz.
  • Glass'ta görünen bir iconUrl ve displayName eklemek için menuItem.values'ü belirtin. iconUrl için şeffaf arka planlı, beyaz renkli 50 x 50 PNG resmini seçin.
  • Bir displayTime belirtin. displayTime belirtmezseniz kullanıcılar özel menü öğesine dokunduğunda zaman çizelgesi öğesi zaman çizelgesinin önüne taşınır.

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

Kullanıcıların zaman çizelgesi kartınızı sabitlemesine izin verme

Kullanıcılarınızın zaman çizelgesi kartını sabitlemesine olanak tanıyan bir menü öğesi oluşturabilirsiniz. Bu öğe, zaman çizelgesi kartını ana saat kartının sol tarafında kalıcı olarak gösterir. Kullanıcılar aynı menü öğesini kullanarak kartın sabitlemesini de kaldırabilir.

Sabitleme menü öğesi yerleşik bir menü öğesidir. Bu nedenle, menuItem için TOGGLE_PINNED action sağlamanız yeterlidir.

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

Abonelikler

Mirror API, kullanıcı bir zaman çizelgesi öğesinde belirli işlemler yaptığında veya kullanıcı konumu güncellendiğinde gönderilen bildirimlere abone olmanıza olanak tanır. Bir bildirime abone olduğunuzda bildirimi işleyen bir geri çağırma URL'si sağlarsınız.

Bildirim alma

Mirror API'den gelen bir bildirim, abone olunan uç noktaya JSON istek gövdesi içeren bir POST isteği olarak gönderilir.

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

Hata oluşmadıysa hizmetiniz API'ye 200 OK HTTP durum koduyla yanıt vermelidir. Hizmetiniz hata koduyla yanıt verirse Mirror API, bildirimi hizmetinize yeniden göndermeyi deneyebilir.

Bildirim türleri

Mirror API, farklı etkinlikler için farklı bildirim yükü gönderir.

Yanıtla

Kullanıcı, yerleşik REPLYmenü öğesini kullanarak zaman çizelgesi öğenizi yanıtladı:

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

itemId özelliği, aşağıdakileri içeren öğenin ID değerine ayarlanır:

  • Yanıtlandığı zaman çizelgesi öğesinin ID değerine ayarlanan inReplyTo özelliği.
  • text özelliği, metin transkriptine ayarlanır.
  • Yanıtladığı zaman çizelgesi öğesinin creator özelliğine ayarlanmış recipients özelliği (varsa).

Örnek:

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

Sil

Kullanıcı bir zaman çizelgesi öğesini sildi:

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

itemId özelliği, silinen öğenin kimliğine ayarlanır. Öğe artık kimliği ve isDeleted özelliği dışında meta veri içermiyor.

Özel menü öğesi seçildi

Kullanıcı, hizmetiniz tarafından belirlenen bir özel menü öğesini seçtiyse:

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

itemId özelliği, kullanıcının seçtiği menü öğesinin kimliğine ayarlanır.

userActions dizisi, kullanıcının bu öğe üzerinde gerçekleştirdiği özel işlemlerin listesini içerir. Hizmetiniz bu işlemleri uygun şekilde ele almalıdır.

Konum güncellemesi

Mevcut kullanıcı için yeni bir konum kullanılabilir:

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

Glassware'ınız bir konum güncellemesi aldığında, bilinen en son konumu almak için glass.locations.get uç noktasına istek gönderin. Glassware'ınız on dakikada bir konum güncellemesi alır.

Sesli komut

Kullanıcınız bir sesli komutu etkinleştirmiştir. Örneğin: "Ok Glass, not al, Cat Stream, Chipotle'ın doğum günü yarın". Cam eşyalarınıza aşağıdaki bildirim gönderilir:

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

Bu bildirim, userActions mülkünde bulunan LAUNCH değeriyle diğer bildirimlerden ayırt edilir.

Ardından, zaman çizelgesi öğesini almak için itemId içindeki değeri kullanabilirsiniz:

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

recipients mülkü, kullanılan sesli komutu temsil eden kişinin id değerini içerir.