Writing Mirror API and Native Apps for Google Glass

100 %
0 %
Information about Writing Mirror API and Native Apps for Google Glass

Published on February 28, 2014

Author: jldavid

Source: slideshare.net


Presented at Confoo 2014 (Friday - February 28th, 2014)

Writing Mirror API & 
 Native Applications for Jean-Luc David

Who am I? - Freelance wearables developer   - Wrote 5 books for Wiley Publishing
 - Worked at Yellow Pages Group,
 Microsoft, Digiflare Inc.
 - I love hackathons Everyone in this room will
 get to try out !

What is Google Glass? - Galaxy Nexus - Android 4.0.4, dual-core   - Battery ≤ 1 day   - 5MPX camera, 720p video, touchpad   - Display 640x360px (= 25' HD screen 2m)   - Gyroscope, accelerometer, compass   - Wifi, BT, GPS   - 16 GB, 682 RAM   - Sound “bone conduction”   - Microphone, eye tracker   - Calls/sms/gps/internet through phone   

Why Wearables?                                 Source: Everett Rogers - Diffusion of Evolution

Why Wearables? Source: Morgan Stanley Research

What are the programming models for ? Glass Developer Kit    

What are the programming models for ? Mirror API    

Demo: PictureThis

Basic Android Application Layout.xml     Layout.xml Intent Activity #1 Activity #2

Glass Application Card.xml Card.xml Card.xml Card.xml     CardScrollView CardScrollView Intent Activity #1 Activity #2

Glass Timeline

Glass Application with Live Cards
 & Immersions

Launching Glass Apps

Launching Glass Apps res/values/strings.xml 
 ! <?xml version="1.0" encoding="utf-8"?>
    <string name="glass_voice_trigger">take note</string>
    <string name="glass_voice_prompt">what's on your mind?</string>
 </resources>   ! res/xml/<my_voice_trigger>.xml
 <?xml version="1.0" encoding="utf-8"?>
 <trigger keyword="@string/glass_voice_trigger">
   <input prompt="@string/glass_voice_prompt" />

Launching Glass Apps AndroidManifest.xml 
 <?xml version="1.0" encoding="utf-8"?>
 <application ...>
     <activity ...>
   android:resource="@xml/my_voice_trigger" />
     // ...

Voice Commands

Voice Commands private void displaySpeechRecognizer() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);   startActivityForResult(intent, SPEECH_REQUEST);   }
 ! protected void onActivityResult(int reqCode, int resCode, Intent data) { if (reqCode == SPEECH_REQUEST && resCode == RESULT_OK) {   List<String> results = data.getStringArrayListExtra(
 RecognizerIntent.EXTRA_RESULTS);   String spokenText = results.get(0);   Log.e("SPOKEN TEXT", spokenText); }   super.onActivityResult(requestCode, resultCode, data);   }

Read Aloud

Read Aloud import android.speech.tts.TextToSpeech;   ... private TextToSpeech mSpeech;   ! public void onCreate() {   super.onCreate();   mSpeech = new TextToSpeech(this, 
 new TextToSpeech.OnInitListener() {   @Override   public void onInit(int status) {   // Do nothing.   } }); }   !

Read Aloud public void sayStuff() {   String helloWorld = "hello world"; mSpeech.speak(helloWorld, TextToSpeech.QUEUE_FLUSH, null);   }


Camera // Start Camera Intent   Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);   startActivityForResult(cameraIntent, TAKE_PICTURE_REQUEST);   ! @Override   protected void onActivityResult(int requestCode, int resultCode, Intent data) {   if (requestCode == TAKE_PICTURE_REQUEST 
 && resultCode == RESULT_OK) {   String picturePath = 
 data.getStringExtra(CameraManager.EXTRA_PICTURE_FILE_PATH);   processPictureWhenReady(picturePath);   } super.onActivityResult(requestCode, resultCode, data);   }

Camera private void processPictureWhenReady(final String picturePath) {   final File pictureFile = new File(picturePath);   if (pictureFile.exists()) {   // Picture Exists } else {   final File directory = pictureFile.getParentFile();   FileObserver observer = new 
 FileObserver(parentDirectory.getPath()) {   private boolean isFileWritten;

Camera @Override   public void onEvent(int event, String path) {   if (!isFileWritten) {   File affectedFile = new File(parentDirectory, path);   isFileWritten = (event == FileObserver.CLOSE_WRITE && affectedFile.equals(pictureFile)); if (isFileWritten) {   stopWatching(); runOnUiThread(new Runnable() {   @Override   public void run() {   // File Exists } });   }}}};   observer.startWatching();   }   }

Demo: Stereo


Cards <?php // Add includes & OAuth Check
 ! // Set up client $client = get_google_api_client(); $bundleVer = 15;   $mirror_service = new Google_MirrorService($client);   ! $new_timeline_item = new Google_TimelineItem();   $new_timeline_item->setHTML("<article class='photo'><img style='width:100%; height:100%;' src='http://stereo.com/ splash.png'></article>");   $new_timeline_item->setBundleId($bundleVer);   $new_timeline_item->setIsBundleCover(false);   $notification = new Google_NotificationConfig();   $notification->setLevel("DEFAULT");   $new_timeline_item->setNotification($notification);

Cards // A custom menu item   $menu_items = array();   $custom_menu_item = new Google_MenuItem();   $custom_menu_value = new Google_MenuValue();   $custom_menu_value->setDisplayName("Drill Into");   $custom_menu_value->setIconUrl($service_base_url."/static/images/ drill.png"); $custom_menu_item->setValues(array($custom_menu_value));   $custom_menu_item->setAction("REPLY");   ! // This is how you identify it on the notification ping   $custom_menu_item->setId("safe-for-later");   array_push($menu_items, $custom_menu_item);   $new_timeline_item->setMenuItems($menu_items);   ! insert_timeline_item($mirror_service, $new_timeline_item, null, null);   ?>


Audio/Video <?php // Includes & OAuth Check
 // Setup Client $client = get_google_api_client(); $mirror_service = new Google_MirrorService($client);   ! // Create a new timeline item, notify & insert audio $new_timeline_item = new Google_TimelineItem();   $new_timeline_item->setText("Audio Stream");   ! $notification = new Google_NotificationConfig();   $notification->setLevel("DEFAULT");   $new_timeline_item->setNotification($notification);   ! insert_timeline_item($mirror_service, $new_timeline_item, "video/ vnd.google-glass.stream-url", "https://api.soundcloud.com/tracks/ 102874582/stream?consumer_key=apigee");   ?>


Maps <?   // Includes & OAuth Check
 // Set up Mirror API client   $bundle_id = "map";   $client = get_google_api_client();   mirror_service = new Google_MirrorService($client);   ! // Search Results Card   $results_html = "<img src="glass://map?w=640&h=360&marker=0;   42.369590,-71.107132" width="640" height="360" />";   $new_timeline_item = new Google_TimelineItem();   $new_timeline_item->setHTML($results_html);   $new_timeline_item->setBundleId($bundle_id);   $new_timeline_item->setIsBundleCover(false);

Maps // Set Notification Level $notification = new Google_NotificationConfig();   $notification->setLevel("DEFAULT");   $new_timeline_item->setNotification($notification);   ! // Add Menu Item $menu_items = array();   $menu_item = new Google_MenuItem();   $menu_item->setAction("DELETE");   array_push($menu_items, $menu_item);   ! // Insert into Google Glass Timeline $new_timeline_item->setMenuItems($menu_items);   insert_timeline_item($mirror_service, $new_timeline_item, null, null,null); ?>

When will it be available? I don't know. +

How can I get my own pair?     - Be U.S. residents - Be at least 18 years old - Purchase Glass for $1,500 + tax within the US - Provide a US shipping address or pick up their 
 Glass at one of our locations in New York, San 
 Francisco or Los Angeles  

Thank you! Slides: http://www.jldavid.com
 Glass Dev: https://developers.google.com/ glass/ Want an app built or have questions?
 Jean-Luc David

Add a comment

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

Glass | Google Developers

Google Glass; list All Products. Sign in ... follow Glass patterns and style, ... Mirror API Tools. Assets ...
Read more

Writing Mirror API & Native Apps for Google Glass | ConFoo.ca

In this new wave of wearable computing, Google Glass is an exciting device that could change the way we interact with technology. In this session, you'll ...
Read more

Google Opens Glass Mirror API To All Developers Even If ...

... to the Mirror API, as Google only wanted ... Google Announces Native Glass ... apps for the Mirror API, writing GDK apps is ...
Read more

Running Native Android Apps On Google Glass: INGRESS! (And ...

... the Mirror API, is pretty limited, but native apps give you full control ... back to writing! ... glass; google glass; hacking; Ingress; native apps ...
Read more

mirror api – TechCrunch

There are currently two ways of writing… Read More. Google Opens Glass Mirror ... Google Announces Native Glass ... at the Google Glass Mirror API, ...
Read more

Google Glass: A Developer's Paradise, Thoughts, and ...

... A Developer's Paradise, Thoughts, and Experiences. ... Programming for Glass with the Mirror API is a ... Writing APKs for Google Glass is a ...
Read more

Google Glass Application List | Google Glass Apps

This is a complete list of Google Glassware and Google Glass Apps ... for google glass with more than ... for Glass built using Mirror API. by ...
Read more

Glass Development Kit | Glass | Google Developers

Google Glass list All ... The Glass Development Kit ... Mirror API Tools. Assets ...
Read more

Do we need Chrome on Glass? - LivingThruGlass.com

... (the Mirror API) ... play a role in rapid prototyping and development on Google Glass. ... Operate XE10 is rumored to bring native Glass apps.
Read more