Basit REST API'leri kullanarak statik kartları ekleyebilir, güncelleyebilir, okuyabilir ve silebilirsiniz. Ayrıca, statik bir karta konum veya medya gibi nesneler ekleyebilirsiniz.
İşleyiş şekli
Statik kartlar, varsayılan olarak Glass saatinin sağında yer alır ve teslimat sırasında kullanıcıyla ilgili bilgileri gösterir. Ancak bu kartlar, canlı kartlar gibi hemen ilgilenmeniz gerekmez. Kullanıcılar isterlerse karttaki içerikleri okumayı veya kartta işlem yapmayı tercih edebilirler.
Glassware zaman çizelgesine statik kartlar eklediğinde Glass, kullanıcıları uyarmak için bir bildirim sesi çalabilir. Önceki tüm statik kartlar da sağa geçer ve 7 gün sonra veya 200 kart daha yeni olduğunda zaman çizelgesinden kaybolur.
Ne zaman kullanılır?
Statik kartlar, önemli şeyler meydana geldikçe kullanıcılara düzenli aralıklarla bildirimler göndermek için idealdir.
Örneğin, en çok okunan haberleri anında gönderen bir haber
teslimat hizmeti bu kapsama girer. Mirror API statik kartları, OPEN_URI
menü öğesi üzerinden canlı kartlar veya Yoğun İçerikler başlatılabilir. Bu sayede, statik kartlardan hem bildirim olarak hem de canlı kart veya sürükleyicilik kullanarak daha etkileşimli bir deneyim sunan 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 bir zaman çizelgesi öğesinin JSON gösterimi POST yapın.
Zaman çizelgesi öğesindeki alanların çoğu isteğe bağlıdır. En basit biçimiyle, bir zaman çizelgesi öğesi aşağıdaki örnekte olduğu gibi yalnızca kısa bir kısa 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ı olursa, oluşturulan öğenin tam kopyasını içeren bir 201 Created
yanıt kodu alırsınız. Yukarıdaki örnek için başarılı bir yanıt
şöyle 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 olan eklenen öğe aşağıdaki gibi görünür:
Ek içeren bir zaman çizelgesi öğesi ekleme
Bir resim bin kelimeye bedeldir. Bu da bir zaman çizelgesi öğesine sığdırabileceğinizden çok daha fazladır. Bu doğrultuda, bir zaman çizelgesi öğesine resim ve video da ekleyebilirsiniz. Fotoğraf eki olan 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()
Resim ekli bir zaman çizelgesi öğesi, Glass'ta şuna benzer:
Video ekleniyor
Zaman çizelgesi öğelerinize video dosyaları ekliyorsanız tüm yükü 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 yayını destekler. RTSP, güvenlik duvarları tarafından sıklıkla engellendiğinden mümkün olduğunda diğer seçenekleri kullanın.
Video akışı gerçekleştirmek 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çimleri bölümlerine bakın.
Sayfalara ayırma
Tek bir zaman çizelgesi kartına uymayan ancak aynı kartla ilişkilendirilmesi gereken zaman çizelgesi öğelerini sayfalara ayırabilirsiniz. Sayfalara ayrılmış öğelerin tümü aynı timeline.id
değerini paylaşır ve bu nedenle aynı menü öğelerine sahiptir. Kullanıcı, sayfalara ayrılmış bir zaman çizelgesi öğesine dokunduğunda Devamı menü öğesi görünür.
Glass, text
görüntüleyen zaman çizelgesi öğelerini otomatik olarak sayfalara ayırır. Glass'ın html
sayfasını otomatik olarak sayfalandırmasını sağlamak için article
etiketini aşağıdaki örnekte gösterildiği gibi sınıf özelliği auto-paginate
değerine ayarlanmış şekilde 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 sayfalandı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 alt zaman çizelgesi kartında görüntüler. Ö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 önlemek amacıyla, ilk <article>
etiketi için cover-only
CSS sınıfını belirtebilirsiniz:
<article class="cover-only">
...
cover-only
sınıfı, otomatik sayfalandırılmış zaman çizelgesi öğelerini de destekler:
<article class="auto-paginate cover-only">
...
Paket
Gruplandırma, alakalı ancak farklı öğeleri (örneğin, bir e-posta ileti dizisindeki tek tek iletiler için) gruplandırmanıza olanak tanır. Paketlerde, kullanıcının paketteki diğer kartları içeren bir alt zaman çizelgesi görüntülemek için dokunduğu bir ana kapak kartı bulunur. Paketler, normal zaman çizelgesi kartlarından, paketin kapak kartının sağ üst köşesinde köşeye katlanarak ayrılır.
Zaman çizelgesi öğelerini gruplandırmak için bunları bundleId
için aynı değerle oluşturun. En son eklenen öğe
paketin kapak kartıdır.
Aşağıdaki resimlerde, sağ üst köşede köşeye katlanmış bir paket kılıfı ve altında iki adet gruplandırılmış kart gösterilmektedir.
Zaman çizelgesi öğeleri okunuyor
Hizmetiniz, oluşturduğu tüm zaman çizelgesi öğelerine ve onunla paylaşılan tüm zaman çizelgesi öğelerine erişebilir. Hizmetiniz tarafından görülebilen zaman çizelgesi öğelerini nasıl listeleyeceğinizi buradan öğrenebilirsiniz.
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 özelliği üzerinden erişebilirsiniz.
Daha sonra, 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ıyla ilgili işlemler istemesine olanak tanır. Bu öğeler iki türde 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 özgü davranışı göstermesine olanak tanır. Ayrıca, markanızla uyumlu bir menü öğesi simgesi de sağlayabilirsiniz.
Yerleşik menü öğeleri ekleme
Zaman çizelgesi öğelerinize yerleşik menü öğeleri eklemek için bunları eklerken menuItems array
alanını doldurabilirsiniz.
Yerleşik bir menü öğesini kullanmak için yalnızca her bir menuItem
öğesinin action
öğesini 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 yaramıyorsa zaman çizelgesi öğesi eklerken veya güncellerken aşağıdakileri yaparak kendi işlemlerinizle özel menü öğeleri oluşturabilirsiniz:
menuItem.action
içinCUSTOM
değerini belirtin.menuItem.id
belirtin. Kullanıcılar özel menü öğesine dokunduğunda Glassware'inizmenuItem.id
alanının doldurulduğu bir bildirim alır. Bu sayede bildirimin kaynağını belirleyebilirsiniz.- Glass'ta görünen bir
iconUrl
vedisplayName
eklemek içinmenuItem.values
değerini belirtin.iconUrl
için şeffaf bir arka plana sahip beyaz renkli bir 50 x 50 PNG resminin üzerine gelin. displayTime
belirtin. BirdisplayTime
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örüntüler. Kullanıcılar aynı menü öğesini kullanarak kartın sabitlemesini de kaldırabilir.
Sabitleme menüsü öğesi yerleşik bir menü öğesi olduğundan, 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 Öğ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, JSON
istek gövdesi içeren abone olunan uç noktaya POST
isteği olarak bir bildirim 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 olduğu zaman çizelgesi öğesininID
değerine ayarlandı.text
özelliği, metin transkriptine ayarlandı.recipients
özelliği, yanıtlandığı zaman çizelgesi öğesinin (varsa)creator
değerine 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çmiştir:
{
"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 yapmalıdır.
Konum güncellemesi
Geçerli kullanıcı için yeni bir konum mevcut:
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
Glassware'iniz bir konum güncellemesi aldığında, bilinen en son konumu almak için glass.locations.get uç noktasına bir istek gönderin. Glassware'iniz her on dakikada bir konum güncellemelerini alır.
Sesli komut
Kullanıcınız bir sesli komutu etkinleştirdi. Örneğin: "Ok Glass, not al, Kedi Akışı, Chipotle'ın doğum günü yarın". 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
mülkündeki LAUNCH
değeriyle diğer bildirimlerden ayrılır.
Ardından 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.