Google Glass

advertisement
Cosc 4730
Basics of Google glass development.
Basic idea
From https://developers.google.com/glass/develop/overview
Basic Idea (2)
• So we use everything we have learned so far,
except it’s only API 19.
– There is a note, that the sensors api were frozen at
17 and that any changes in 18+ were not added.
humor
Creating a glass project
• Create a new project
– Minimum and Target SDK Versions: 19
• There is only one Glass version, so minimum and target
SDK are the same.)
– Compile with: Glass Development Kit Developer
Preview [Android 4.4.2]
– Theme: None
Creating a glass project (2)
• AndroidManifest.xml file:
– You chose no theme, but
• ADT and Android Studio assigns a theme automatically, even if you specify no
theme, so remove the android:theme property from your manifest after
creating a project.)
– Add for voice:
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT"/>
– Change the Intent-filter. Launcher is not used and we need voice
<intent-filter>
<action android:name=
"com.google.android.glass.action.VOICE_TRIGGER" />
</intent-filter>
<meta-data android:name="com.google.android.glass.VoiceTrigger"
android:resource="@xml/voice_trigger"/>
Voice Trigger
• Pick a couple of words
– Hello world project uses “Hello World”
• The full command would be “Ok Glass Hello World” and it
will launch the hello world app.
– Voice_trigger.xml file:
<trigger keyword="@string/voice_trigger" />
– Since we are “Doing this correctly”
– In String.xml file (only a snippet of the file)
<!-- The voice trigger used for launching general demos. -->
<string name="voice_trigger">Hello World</string>
Creating a glass project (3)
• Remove the android-support-v4.jar
– Eclipse automatically includes it.
– You can then code any layout needed and it will
display.
• helloGlass
– Remember though, you don’t touch widgets and
thought of thing. We use the voice and hardware
sensors
Example: HelloGlass
Live Cards
• Live Cards app show up on the glass time line
• They are updated (low or high frequency) via a
service render
– We also use menus, When the live card is no
longer needed then the service is ended (or
destroyed) via the stop menu.
https://developers.google.com/glass/develop/gdk/live-cards
Immersion
• Immersion app’s display outside the time line
• The Hello Glass app is basically an immersion app and what we are used too.
– This are “great for experiences that require prolonged user attention”
• Design items to keep in mind:
– Design your UIs for a 640 × 360 pixel screen. With a layout, custom 2D view,
or opengl rendering.
– Don't rely on complex touch gestures or UI patterns: Instead use menus, voice,
or simple touch events (tap, slide forward, slide backward, slide up)
• You can use more then one finger touch as well, but those tend to be complex.
– Create a 50 × 50 pixel icon and specify it for the android:icon attribute of the
<activity> element in your Android manifest. Also specify text for
android:label. This allows a voice or touch menu item that is associated with
multiple Glassware to show your Glassware's name and icon as an option.
– Specify android:immersive="true" for your <activity> element to give
immersions focus after a screen sleeps and wakes up.
https://developers.google.com/glass/develop/gdk/immersions
Immersion and custom view
• Setup the project for glass
– Pretty much is the same as normal.
– It demo with the AndGame code, which is called
GlassInvaders
• There were some issues with guestures, which
in mainActivity instead of view as the before.
– Uses the slide forward and backward to move
– Tap to fire
– Also the voice system can be used.
Glass Invaders
Full size
200 px less
Bigger font
gestures
• Swipe forward, back, tap, and double tap
– Declare a GestureDetector and in onCreate
– GestureDetector gestureDetector = new
GestureDetector(context);
– //Create a base listener for generic gestures
– gestureDetector.setBaseListener( new
GestureDetector.BaseListener() {
• public boolean onGesture(Gesture gesture) {
– If gesture == Gesture.TAP
– Gesture.TWO_TAP, Gesture.SWIPE_RIGHT, or
Gesture.SWIPE_LEFT
Gestures (2)
gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
@Override
public void onFingerCountChanged(int previousCount, int currentCount) {
// do something on finger count changes
}
});
gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
@Override
public boolean onScroll(float displacement, float delta, float velocity) {
// do something on scrolling
return false;
}
});
voice
• In the App you can also respond to voice
pretty easily.
• NOTE: The system requires that user to say “OK Glass”
before every command.
– This is not a free form voice recognition, which you can do
just like in any android app.
• In OnCreate and before SetContentView
– getWindow().requestFeature(WindowUtils.FEAT
URE_VOICE_COMMANDS);
Voice (2)
• Now it works off the same functions/idea as a
menu does,
public boolean onMenuItemSelected(int featureId,
MenuItem item) {
if (featureId ==
WindowUtils.FEATURE_VOICE_COMMANDS) {
If (item.getItemId() == R.id.menuitemid) {
//do something
}
}
}
Immersion and openGL
• Setup the project for glass
• And then use the openGL just like before.
• See openGL demo for the example.
• Also there is a LiveCardOpenGL version too.
OpenGL picture
menu
• Almost all of the menu system is just like android with a couple of
exceptions.
• First the menu system is not automatic. We have to start it up
when the user taps.
– So we have to include this code in the activity we want a menu in.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
openOptionsMenu();
return true;
}
return false;
}
– Now the onCreateOptionsMenu and onOptionsItemSelected methods
will be called.
Menu (2)
• For each menu item, provide a 50 × 50 pixel
menu item icon. The menu icon must be white in
color on a transparent background.
– Download the Glass menu icons for use or as an
example.
• Use a short phrase that describes the action and
is in sentence case. An imperative verb works
well (for example, "Share" or "Reply all").
<item
android:id="@+id/exit_menu"
android:icon="@drawable/ic_done_50"
android:title="@string/exit"/>
https://developers.google.com/glass/develop/gdk/immersions#creating_and_displaying_a_menu
Card View
• A Card class creates a well-formed cards given
a set of properties and can be used where you
need any view (ie in a layout)
• We can also use a CardScrollView (and
adapter), so it works like a listview
– But the user “scroll” back and forth between the
cards.
Card View (2)
• The card can have text, a footer, and pictures.
card.setText()
Card.setFootnote()
cardsetImagelayout(Card.ImageLayout.FULL)
or Card.ImageLayout.LEFT
Card.AddImage(R.drawable.X)
• Add The number of images needed
Card View (3)
• A click (tap) listener for the CardScrollView
– mCardScrollView.setOnItemClickListener(new
AdapterView.OnItemClickListener() {
• @Override
• public void onItemClick(AdapterView<?> parent, View
view, int position, long id) {
– Position is the which card in the CardScrollView (and
adapterview parent)
CardView example
Back to Live Cards.
• Low-Frequency Rendering
– It’s a small of views, that don’t need updated
every second
• FrameLayout, LinearLayout, RelativeLayout, GridLayout,
AdapterViewFlipper, AnalogClock, Button,
Chronometer, GridView, ImageButton, ImageView,
ListView, ProgressBar, StrackView, TextView, and
ViewFlipper
• High Frequency Rendering
– Custom 2D view (ie drawing) and OpenGL
Live Cards (2)
• LiveCard app will have the following parts
– MenuActivity (required)
• Used to Stop the LiveCard at the very minimum
– Provides a Stop Menu item and other menu items as needed.
– Service
• This is actually what is called when the app is started
• It provided the view to be displayed either view a Render or
RemoteView (Low Frequency)
– Render (High Frequency only)
• OpenGL code and/or Custum View
– Other Java classes as needed.
Live Cards (3)
• Some Notes
– Put all images in a drawable directory (not
drawable-XXX)
– Live Card are long running services. You may have
to manually uninstall the app to get to it stop if
there are problems.
• Even if it crashes, sometimes the devices restarts it.
Creating the LiveCard
• It’s created in service, in the OnStartCommand(..)
– mLiveCard = new LiveCard (this, LIVE_CARD_TAG)
– Where private static final String LIVE_CARD_TAG = "GameStats";
– Inflate the view (as a RemoteViews)
• mLiveCardView = new RemoteViews( getPackageName(),
R.layout.main_layout);
• //now you work on the layout via the variable, example:
– mLiveCardView.setTextViewText(R.id.home_team, "UW Cowboys");
• You have to include a pending intent for the menu and the publish the card
(otherwise it won’t show)
– Intent menuIntent = new Intent(this, MenuActivity.class);
– menuIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK);
– mLiveCard.setAction(PendingIntent.getActivity(this, 0, menuIntent,
0));
– mLiveCard.publish(PublishMode.REVEAL);
Example
Creating the LiveCard (2)
• Also you would use a thread or asynctask to
update the card with new/updated data.
– Again with the mLiveCardView variables.
– Then set view , so the card will redraw.
• mLiveCard.setViews(mLiveCardView);
MenuActivity
• For any LiveCard, you are REQUIRED to have a
menu and the Stop.
– Ie it’s the only way to end the service.
– See the liveCardGameStats demo code for the
MenuActivity on how to make it work correctly.
TextToSpeech and Binder
• In LiveCards you have a service which holds all
the running data.
– So if you want to use “Read Aloud” functions,
then you must use the IPC functions in android (ie
Binder) methods.
• Shown in the code and here.
– LiveCardStats2
– Use the normal TextToSpeech like normal android.
LiveCard and OpenGL
• So like before, use the OnStartCommand to
start the Renderer()
– And menuActivity and publish.
• The render though uses a import
com.google.android.glass.timeline.GlRenderer
; //which is a GLES20 version (not 1.1)
• Otherwise, just like normal openGL.
example
Sensors
• Glass supports the following sensors (and
used just like on android)
– TYPE_ACCELEROMETER, TYPE_GRAVITY,
TYPE_GYROSCOPE, TYPE_LIGHT,
TYPE_LINEAR_ACCELERATION,
TYPE_MAGNETIC_FIELD, TYPE_ORIENTATION
(deprecated), TYPE_ROTATION_VECTOR
Sensors
• Location (GPS) is the same.
• Camera is also the same, but there is a camera
button builtin to the top of the glass.
– You can override it as needed
– public boolean onKeyDown(int keyCode, KeyEvent
event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA) {
return false; //let the glass do the work
return true; //if you handled it
or taking video
• Taking video and pictures are like in android.
References
• Using glass:
https://support.google.com/glass/?hl=en#topic=43633
45
• Using an older API, but somewhat useful:
– https://github.com/harrywye/gdkdemo
• Glass doc’s:
– https://developers.google.com/glass/develop/overview
– https://developers.google.com/glass/develop/patterns/ind
ex
– https://developers.google.com/glass/develop/gdk/index
Q&A
Download