Basit REST API'lerini kullanarak statik kartları ekleyebilir, güncelleyebilir, okuyabilir ve silebilirsiniz. Ayrıca, statik bir karta konum veya medya gibi nesneler de ekleyebilirsiniz.
İşleyiş şekli
Statik kartlar, varsayılan olarak Glass saatini sağında yer alır ve teslimat sırasında kullanıcıyla alakalı bilgileri gösterir. Ancak canlı kartlar gibi hemen ilgilenilmesi gerekmez ve kullanıcılar kartı okumayı veya kartta belirtilen işlemi yapmayı kendi zamanlarında tercih edebilir.

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 yeni kart olduğunda zaman çizelgesinden kaybolur.
Ne zaman kullanılır?
Statik kartlar, önemli olaylar gerçekleştiğinde kullanıcılara periyodik bildirimler göndermek için idealdir.
Örneğin, önemli haberleri anında gönderen bir haber servisi. Mirror API statik kartları, canlı kartları veya etkileşimli deneyimleri OPEN_URI menü öğesi aracılığıyla da başlatabilir. Bu sayede, bildirim olarak statik kartların, daha etkileşimli bir deneyim için ise canlı kartın veya imersiyonun kullanıldığı karma etkileşimler oluşturabilirsiniz.
Zaman çizelgesi öğeleriyle ilgili olası işlemlerin tam listesi için referans belgelerine bakın.
Statik kart ekleme
Statik kartları (zaman çizelgesi öğeleri) eklemek için REST uç noktasına zaman çizelgesi öğesinin JSON gösterimini POST edin.
Zaman çizelgesi öğesindeki alanların çoğu isteğe bağlıdır. En basit haliyle, zaman çizelgesi öğesi 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ı olduğunda, oluşturulan öğenin tam kopyasıyla birlikte 201 Created yanıt kodunu 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 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, zaman çizelgesi öğesine resim ve video da ekleyebilirsiniz. Fotoğraf eki içeren bir zaman çizelgesi öğesinin nasıl ekleneceğine dair örneği aşağıda bulabilirsiniz:
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 şu şekilde görünür:

Video ekleme
Zaman çizelgesi öğelerinize video dosyaları ekliyorsanız tüm yükü tek seferde yüklemek yerine videoyu yayınlamanızı öneririz. Google Mirror API, HTTP canlı yayını, progresif indirme ve gerçek zamanlı akış protokolü (RTSP) ile akışı destekler. RTSP, güvenlik duvarları tarafından sık sık engellendiği için 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 menü öğesinin payload olarak videonun URL'sini 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 sayfalandırabilirsiniz. Sayfalandırılmış öğelerin tümü aynı timeline.id'ı paylaştığından aynı menü öğeleri grubuna sahiptir. Kullanıcı, sayfalandırılmış bir zaman çizelgesi öğesine dokunduğunda Daha fazla oku menü öğesi görünür.
Glass, text simgesini gösteren zaman çizelgesi öğelerini otomatik olarak sayfalandırır. Glass'ın otomatik olarak html sayfalara ayırması için aşağıdaki örnekte olduğu gibi sınıf özelliği auto-paginate olarak ayarlanmış article etiketini 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>
Manuel olarak sayfalara ayırmak için her kartta göstermek istediğiniz içerik için article etiketini kullanın. Glass, her bir article etiketinin içeriğini ayrı bir alt zaman çizelgesi kartında gösterir. Örneğin, aşağıdaki HTML ile sayfalandırı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, sayfalandırılmış zaman çizelgesi öğesinin ilk kartı 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 cover-only etiketi için <article> CSS sınıfını belirtebilirsiniz:
<article class="cover-only">
...
cover-only sınıfı, otomatik olarak sayfalandırılmış zaman çizelgesi öğelerini de destekler:
<article class="auto-paginate cover-only">
...
Paketleme
Gruplandırma, ilgili ancak farklı öğeleri (ör. bir e-posta dizisindeki ayrı iletiler) birlikte gruplandırmanıza olanak tanır. Paketlerde, kullanıcının paketteki diğer kartları içeren bir alt zaman çizelgesini görüntülemek için dokunduğu ana kapak kartı bulunur. Paketler, kapak kartının sağ üst köşesindeki katlanmış köşeyle normal zaman çizelgesi kartlarından ayırt edilir.
Zaman çizelgesi öğelerini paketlemek için bundleId özelliği için aynı değerle oluşturun. En son eklenen öğe, paketin kapak kartıdır.
Aşağıdaki resimlerde, sağ üst köşesinde katlanmış bir köşe bulunan bir paket kapak kartı ve altında iki paketlenmiş kart gösterilmektedir.


Okuma takvim öğeleri
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 nasıl listeleyeceğiniz aşağıda açıklanmıştır.
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
Bir zaman çizelgesi öğesine eklenen dosyalara, attachments adlı bir dizi özelliği üzerinden erişebilirsiniz.
Daha sonra, eklerin ikili verilerini eklerin contentUrl özelliği veya attachments uç noktası aracılığıyla 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 gelir: yerleşik menü öğeleri ve özel menü öğeleri.
Yerleşik menü öğeleri, Glass'ın sağladığı özel işlevlere erişim imkanı sunar. Örneğin, zaman çizelgesi kartını sesli okuma, bir konuma gitme, resim paylaşma veya mesaj yanıtlama gibi:

Özel menü öğeleri, uygulamanızın Glassware'inize özgü davranışları göstermesine olanak tanır. Ayrıca, markanıza uygun bir menü öğesi simgesi de sağlayabilirsiniz.
Yerleşik menü öğeleri ekleme
Yerleşik menü öğelerini, eklerken menuItems array öğesini doldurarak zaman çizelgesi öğelerinize ekleyebilirsiniz.
Yerleşik bir menü öğesini kullanmak için her menuItem'nin action bölümünü 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 sizin için uygun değilse zaman çizelgesi öğesi eklerken veya güncellerken aşağıdakileri yaparak kendi işlemlerinizi içeren özel menü öğeleri oluşturabilirsiniz:
menuItem.actioniçinCUSTOMdeğerini belirtin.menuItem.idbelirtin. Kullanıcılar özel menü öğesine dokunduğunda Glassware'iniz,menuItem.idöğesi doldurulmuş bir bildirim alır. Bu sayede bildirimin kaynağını belirleyebilirsiniz.- Glass'ta görünen bir
iconUrlvedisplayNameeklemek içinmenuItem.valuesdeğerini belirtin.iconUrliçin arka planı şeffaf ve rengi beyaz olan 50 x 50 boyutlarında bir PNG resmini işaret edin. displayTimebelirtin.displayTimebelirtmezseniz kullanıcılar özel menü öğesine her dokunduğunda zaman çizelgesi öğesi zaman çizelgesinin en ö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 solunda kalıcı olarak gösterir. Kullanıcılar, aynı menü öğesini kullanarak kartı sabitlemeyi kaldırabilir.
Sabitleme menü öğesi yerleşik bir menü öğesidir. Bu nedenle, tek yapmanız gereken TOGGLE_PINNED
action için menuItem 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ının bir Zaman Çizelgesi Öğesi üzerinde belirli işlemler gerçekleştirmesi 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 arama URL'si sağlarsınız.
Bildirim alma
Mirror API'den gelen bir bildirim, JSON istek gövdesi içeren POST isteği olarak abone olunan uç noktaya 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)
Hizmetiniz, hata oluşmadıysa API'ye 200 OK HTTP durum koduyla 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ı bildirim yükleri 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 olarak ayarlanır:
inReplyToözelliği, yanıt verilen zaman çizelgesi öğesininIDolarak ayarlanır.textözelliği, metin transkripsiyonu olarak ayarlanmalıdır.- Yanıtlanan zaman çizelgesi öğesinin
recipientsözelliği varsa bu özelliğe ayarlanır.creator
Ö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ği olarak 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ğinde:
{
"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 öğ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'iniz konum güncellemesi aldığında bilinen son konumu almak için glass.locations.get uç noktasına istek gönderin. Glassware'iniz on dakikada bir konum güncellemeleri alır.
Sesli komut
Kullanıcınız bir sesli komut etkinleştirdiyse (örneğin): "Ok Glass, take a note, Cat Stream, Chipotle's birthday is tomorrow". Glassware'inize 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 özelliğindeki LAUNCH değeriyle diğer bildirimlerden ayırt edilir.
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 bilgisini içerir.