Statik Kartlar

Basit REST API'leri kullanarak statik kartlar ekleyebilir, bunları güncelleyebilir, okuyabilir ve silebilirsiniz. Buna ek olarak, statik bir karta (ör. konum veya medya) nesne ekleyebilirsiniz.

İşleyiş şekli

Statik kartlar varsayılan olarak Glass saatinin sağ tarafında yer alır ve teslimat sırasında kullanıcıyla alakalı bilgileri gösterir. Ancak canlı kartlar gibi hemen dikkat çekmeleri gerekmez ve kullanıcılar isterlerse kartı okumayı veya üzerinde işlem yapmayı seçebilirler.

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

Ne zaman kullanılır?

Statik kartlar, önemli olaylar meydana geldiğinde kullanıcılara düzenli bildirimler göndermek için idealdir. Örneğin, en çok okunan haberleri gerçekleştiği sırada gönderen bir haber sunma hizmeti. Mirror API statik kartları, OPEN_URI menü öğesi aracılığıyla canlı kartlar veya kapsama girmeye de başlayabilir. Bu sayede, daha etkileşimli bir deneyim için statik kartları bildirim olarak, canlı kartı veya yoğun bir şekilde kullanan karma etkileşimler oluşturabilirsiniz.

Zaman çizelgesi öğeleriyle ilgili olası işlemlerin tam listesi için referans belgelerine bakın.

Statik kartlar ekleme

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

Zaman çizelgesi öğesindeki alanların çoğu isteğe bağlıdır. En basit şekilde, bu örnekte olduğu gibi zaman çizelgesi öğesi yalnızca kısa metin mesajı içerir:

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

Başarılı bir şekilde, oluşturulan öğenin tam bir kopyasını içeren bir 201 Created yanıt kodu alırsınız. Önceki örnekte başarılı bir yanıt aşağıdaki gibi 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österilecek şekilde eklenen öğe şu şekilde görünür:

Eki olan bir zaman çizelgesi öğesi ekleme

Bir resim bin kelimeye bedeldir. Bu, bir zaman çizelgesi öğesine sığdırabileceğinizden çok daha fazladır. Bu amaçla, bir zaman çizelgesi öğesine resim ve video da ekleyebilirsiniz. Aşağıda, fotoğraf eki olan 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()

Eklenen resme sahip bir zaman çizelgesi öğesi Glass'ta şöyle görünür:

Video ekleniyor

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

Video yayınlamak için PLAY_VIDEO yerleşik 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çimlerini 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 hepsi aynı timeline.id değerine sahiptir ve bu nedenle aynı menü öğesi grubuna sahiptir. Kullanıcı sayfalara ayrılmış bir zaman çizelgesi öğesine dokunduğunda Devamı menü öğesi görünür.

Glass, görüntülenen zaman çizelgesi öğelerini otomatik olarak sayfalara ayırır text. Glass'ın html sayfasını otomatik olarak sayfalara ayırması için article etiketini aşağıdaki örnekte olduğu gibi sınıf özelliği auto-paginate olarak ayarlayı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>

Sayfayı manuel olarak sayfalara ayırmak için her kartta görüntülemek istediğiniz içeriğin article etiketini kullanın. Glass, her bir article etiketinin içeriğini ayrı bir zaman çizelgesi kartında gösterir. Örneğin, aşağıdaki HTML ile sayfalara ayrılmış 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>

Varsayılan olarak, sayfalara ayrılmış zaman çizelgesi öğesinin ilk kartı kapak kartı olarak gösterilir ve kullanıcı Devamı menü öğesini seçtiğinde tekrar gösterilir. Devamı'na dokunduktan sonra ilk kartın tekrar görünmesini engellemek isterseniz ilk <article> etiketi için cover-only CSS sınıfı belirtebilirsiniz:

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

cover-only sınıfı, otomatik olarak sayfalara ayrılmış zaman çizelgesi öğelerini de destekler:

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

Gruplandırma

Gruplandırma, alakalı ancak farklı öğeleri (örneğin, bir e-posta ileti dizisindeki tekil iletiler için) gruplandırmanızı sağlar. Gruplarda, kullanıcının paketteki diğer kartları içeren bir alt zaman görüntülemek için dokunduğu bir ana kapak kartı vardır. Paketler, zaman çizelgesi kartlarından ayrı olarak paket kapak kartının sağ üst köşesine katlanarak ayrılır.

Zaman çizelgesi öğelerini paketlemek için aynı bundleId değeriyle oluşturun. En son eklenen öğe paketin kapak kartıdır.

Aşağıdaki resimlerde, sağ üst köşesi köşeyle katlanmış bir paket kapak kartı ve altında iki adet birleştirilmiş 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. Hizmetiniz tarafından görülebilen zaman çizelgesi öğelerini aşağıda açıklanan şekilde 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ı dizi özelliği aracılığıyla erişebilirsiniz. Ardından bir ekin ikili verilerini, ekin contentUrl özelliği veya ek uç noktası aracılığıyla alabilirsiniz.

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ı ile ilgili işlemler istemesine olanak tanır ve iki tür halinde sunulur: 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 bir mesajı yanıtlama gibi Glass tarafından sağlanan özel işlevlere erişim sağlar.

Özel menü öğeleri, uygulamanızın Glassware'inize özel davranışı göstermesini sağlar ve aynı zamanda markanıza uygun bir menü öğesi simgesi de sağlayabilirsiniz.

Yerleşik menü öğeleri ekleme

Zaman çizelgesi öğelerinize, eklerken menuItems array öğesini ekleyerek yerleşik menü öğeleri ekleyebilirsiniz. Yerleşik bir menü öğesini kullanmak için yalnızca her menuItem'nin action kısmını doldurmanız gerekir.

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ü öğelerini tanımlama

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

  • menuItem.action için CUSTOM belirtin.
  • Bir menuItem.id belirtin. Kullanıcılar özel menü öğesine dokunduğunda Glassware menuItem.id doldurulur. Bu sayede bildirimin kaynağını belirleyebilirsiniz.
  • Glass'ta görünen iconUrl ve displayName özelliklerini eklemek için menuItem.values öğesini belirtin. İmleci iconUrl için şeffaf bir arka plana sahip, beyaz renkte 50 x 50 boyutunda bir PNG resminin üzerine getirin.
  • Bir displayTime belirtin. Bir displayTime belirtmezseniz kullanıcılar özel menü öğesine her 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ı sabitlemesini sağlayan bir menü öğesi oluşturabilirsiniz. Bu kart, zaman çizelgesi kartını kalıcı olarak ana saat kartının solunda 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, tek yapmanız gereken bir menuItem için TOGGLE_PINNED action sağlamaktı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": "You can pin or unpin this card.",
 "menuItems": [
    {
      "action": "TOGGLE_PINNED"
    }
  ...
 ]
}

Abonelikler

Mirror API, kullanıcı bir Zaman Çizelgesi Öğesi'nde belirli işlemler gerçekleştirdiğinde 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 bildirim, JSON istek gövdesi içeren abone uç noktaya 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 200 OK HTTP durum koduyla API'ye yanıt vermelidir. Hizmetiniz bir hata koduyla yanıt verirse Mirror API, bildirimi hizmetinize yeniden göndermeyi deneyebilir.

Bildirim türleri

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

Yanıtla

Kullanıcı, yerleşik REPLY menü öğesini kullanarak zaman çizelgesi öğenize yanıt verdi:

{
  "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:

  • inReplyTo özelliği, yanıt verdiği zaman çizelgesi öğesinin ID değerine ayarlandı.
  • text özelliği, metne dönüştürme olarak ayarlandı.
  • recipients özelliği, yanıt verdiği zaman çizelgesi öğesinin creator öğesi (varsa) olarak ayarlanır.

Ö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 ayarlanan bir özel menü öğesi seçti:

{
  "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ği olarak ayarlanır.

userActions dizisi, kullanıcının bu öğede gerçekleştirdiği özel işlemlerin listesini içerir. Hizmetiniz bu işlemleri uygun şekilde gerçekleştirmelidir.

Konum güncellemesi

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

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

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

Sesli komut

Kullanıcınız bir sesli komutu etkinleştirdi. Örneğin: "Ok Glass, not al, Cat Stream, Chipotle'ın doğum günü yarın". Aşağıdaki bildirim, Glass yazılımınıza gönderilir:

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

Bu bildirim, userActions özelliğindeki LAUNCH değeriyle diğer bildirimlerden ayrılır.

Daha sonra, zaman çizelgesi öğesini getirmek için itemId içindeki değeri kullanabilirsiniz:

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

recipients özelliği, kullanılan sesli komutu temsil eden kişinin id özelliğini içerir.