SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Downloaden Sie, um offline zu lesen
+Peter Friese 
@peterfriese 
#AndroidWear
REAL LIFE 
GET 
PHONE 
LOST IN 
PHONE
Design Principles
Design Principles 
• Launched automatically
Design Principles 
• Launched automatically 
• Glanceable
Design Principles 
• Launched automatically 
• Glanceable 
• Suggest and Demand
Design Principles 
• Launched automatically 
• Glanceable 
• Suggest and Demand 
• Zero or low interaction
Developing for 
Android Wear
Simple Notifications 
Look, ma - no work required!
Simple Notifications 
sendNotification() 
Intent viewIntent = new Intent(context, DummyActivity.class); 
PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.setContentIntent(viewPendingIntent) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Can we do better?
Enhanced Notifications 
BigPictureStyle
BigPictureStyle 
sendNotification() 
Intent viewIntent = new Intent(context, DummyActivity.class); 
PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.setStyle( 
new NotificationCompat.BigPictureStyle() 
.bigPicture(BitmapFactory.decodeResource(context.getResources(), 
R.drawable.sanfrancisco)) 
.setBigContentTitle("Flight AW123 is ready to board.") 
.setSummaryText("Please proceed to gate C 17 to board. Have a nice flight!")) 
.setContentIntent(viewPendingIntent) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Enhanced Notifications 
Pages
Pages 
sendNotification() 
ArrayList<Notification> pages = new ArrayList<Notification>(); 
pages.add(new NotificationCompat.Builder(context) 
.setContentTitle("Your seat") 
.setContentText("17A") 
.extend(new NotificationCompat.WearableExtender() 
.setBackground(BitmapFactory.decodeResource(context.getResources(), 
R.drawable.a380_seat))) 
.build());
Background Only Pages 
sendNotification() 
pages.add(new NotificationCompat.Builder(context) 
.extend(new NotificationCompat.WearableExtender() 
.setHintShowBackgroundOnly(true) 
.setBackground(BitmapFactory.decodeResource(context.getResources(), 
R.drawable.qrcode))) 
.build());
Adding Pages to Notifications 
sendNotification() 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.setContentIntent(viewPendingIntent) 
.extend(new NotificationCompat.WearableExtender() 
.addPages(pages)) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Enhanced Notifications 
Voice Input
Voice Input 
sendNotification() 
// Feedback intent 
Intent replyIntent = new Intent(context, DummyActivity.class); 
PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); 
String replyLabel = context.getResources().getString(R.string.reply_label); 
String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses); 
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) 
.setLabel(replyLabel) 
.setChoices(cannedResponses) 
.build(); 
NotificationCompat.Action replyAction = 
new NotificationCompat.Action.Builder( 
R.drawable.chatbubble_working, 
replyLabel, 
replyPendingIntent) 
.addRemoteInput(remoteInput) 
.build();
Sending a Voice Input Notification 
sendNotification() 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.extend(new NotificationCompat.WearableExtender() 
.addPages(pages) 
.addAction(replyAction)) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Receiving Voice Input 
onCreate() 
Bundle remoteInputResults = RemoteInput.getResultsFromIntent(intent); 
if (remoteInputResults != null) { 
CharSequence utterance = remoteInputResults.getCharSequence(Constants.EXTRA_VOICE_REPLY); 
Toast.makeText(this, utterance, Toast.LENGTH_LONG).show(); 
}
Enhanced Notifications 
Actions
Actions 
sendNotification() 
Intent mapIntent = new Intent(Intent.ACTION_VIEW); 
Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); 
mapIntent.setData(geoUri); 
PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0); 
NotificationCompat.Action walkingDirectionsAction = 
new NotificationCompat.Action.Builder( 
R.drawable.ic_full_directions_walking, "Directions to gate", mapPendingIntent) 
.build(); 
! 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.addAction(walkingDirectionsAction) 
.extend(new NotificationCompat.WearableExtender() 
.addPages(pages) 
.addAction(replyAction) 
.addAction(walkingDirectionsAction)) 
.build();
Wearable apps 
Launching 
Using app-provided 
voice actions 
Using the start 
menu
Launching 
AndroidManifest.xml 
<application 
android:icon="@drawable/greenlinelogo" 
android:label="@string/app_name" 
android:theme="@android:style/Theme.DeviceDefault" > 
<activity 
android:name="de.peterfriese.weartravel.MainActivity" 
android:label="@string/app_name_voice" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
</application>
Wearable Apps 
Custom Layouts
Layout - List 
activity_checkin.xml 
<android.support.wearable.view.BoxInsetLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_height="match_parent" 
android:layout_width="match_parent"> 
<FrameLayout 
android:id="@+id/frame_layout" 
android:layout_height="match_parent" 
android:layout_width="match_parent" 
app:layout_box="left|bottom|right"> 
<android.support.wearable.view.WearableListView 
android:id="@+id/checkin_list" 
android:layout_height="match_parent" 
android:layout_width="match_parent"> 
</android.support.wearable.view.WearableListView> 
</FrameLayout> 
</android.support.wearable.view.BoxInsetLayout>
Layout - Item 
checkin_listview_item.xml 
<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<android.support.wearable.view.CircledImageView 
android:id="@+id/image" 
android:alpha="0.5" 
android:layout_height="52dp" 
android:layout_marginLeft="16dp" 
android:layout_width="52dp" 
app:circle_border_color="#FFFFFFFF" 
app:circle_border_width="2dp" 
app:circle_color="#00000000" 
/> 
<TextView 
android:id="@+id/text" 
android:alpha="0.5" 
android:fontFamily="sans-serif-condensed-light" 
android:gravity="center_vertical" 
android:layout_height="52dp" 
android:layout_marginLeft="72dp" 
android:layout_marginRight="16dp"
<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
Layout - Item 
checkin_listview_item.xml 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<android.support.wearable.view.CircledImageView 
android:id="@+id/image" 
android:alpha="0.5" 
android:layout_height="52dp" 
android:layout_marginLeft="16dp" 
android:layout_width="52dp" 
app:circle_border_color="#FFFFFFFF" 
app:circle_border_width="2dp" 
app:circle_color="#00000000" 
/> 
<TextView 
android:id="@+id/text" 
android:alpha="0.5" 
android:fontFamily="sans-serif-condensed-light" 
android:gravity="center_vertical" 
android:layout_height="52dp" 
android:layout_marginLeft="72dp" 
android:layout_marginRight="16dp" 
android:layout_width="wrap_content" 
android:textColor="@color/white" 
android:textSize="14sp" 
/> 
</merge>
MyViewItem 
CheckInActivity.java 
private final class MyItemView extends FrameLayout implements WearableListView.Item { 
final CircledImageView image; 
final TextView text; 
private float mScale; 
public MyItemView(Context context) { 
super(context); 
View.inflate(context, R.layout.checkin_listview_item, this); 
image = (CircledImageView) findViewById(R.id.image); 
text = (TextView) findViewById(R.id.text); 
} 
@Override 
public float getProximityMinValue() { 
return mDefaultCircleRadius; 
} 
@Override 
public float getProximityMaxValue() { 
return mSelectedCircleRadius; 
}
private float mScale; 
public MyItemView(Context context) { 
MyViewItem 
super(context); 
View.inflate(context, R.layout.checkin_listview_item, this); 
image = (CircledImageView) findViewById(R.id.image); 
text = (TextView) findViewById(R.id.text); 
CheckInActivity.java 
} 
@Override 
public float getProximityMinValue() { 
return mDefaultCircleRadius; 
} 
@Override 
public float getProximityMaxValue() { 
return mSelectedCircleRadius; 
} 
@Override 
public float getCurrentProximityValue() { 
return mScale; 
} 
@Override 
public void setScalingAnimatorValue(float value) { 
mScale = value; 
image.setCircleRadius(mScale); 
image.setCircleRadiusPressed(mScale); 
} 
@Override
@Override 
public float getProximityMaxValue() { 
MyViewItem 
return mSelectedCircleRadius; 
} 
@Override 
public float getCurrentProximityValue() { 
CheckInActivity.java 
return mScale; 
} 
@Override 
public void setScalingAnimatorValue(float value) { 
mScale = value; 
image.setCircleRadius(mScale); 
image.setCircleRadiusPressed(mScale); 
} 
@Override 
public void onScaleUpStart() { 
image.setAlpha(1f); 
text.setAlpha(1f); 
} 
@Override 
public void onScaleDownStart() { 
image.setAlpha(0.5f); 
text.setAlpha(0.5f); 
} 
}
Adapter - Bind ViewHolder 
CheckInActivity.java 
public class MyListAdapter extends WearableListView.Adapter { 
@Override 
public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); 
} 
@Override 
public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { 
MyItemView myItemView = (MyItemView) viewHolder.itemView; 
TextView textView = (TextView) myItemView.findViewById(R.id.text); 
textView.setText(String.format("Seat %d", i)); 
Integer resourceId = R.drawable.ic_action_done; 
CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); 
imageView.setImageResource(resourceId); 
} 
@Override 
public int getItemCount() { 
return 17; 
}
Adapter - Bind ViewHolder 
public class MyListAdapter extends WearableListView.Adapter { 
CheckInActivity.java 
@Override 
public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); 
} 
@Override 
public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { 
MyItemView myItemView = (MyItemView) viewHolder.itemView; 
TextView textView = (TextView) myItemView.findViewById(R.id.text); 
textView.setText(String.format("Seat %d", i)); 
Integer resourceId = R.drawable.ic_action_done; 
CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); 
imageView.setImageResource(resourceId); 
} 
@Override 
public int getItemCount() { 
return 17; 
} 
}
Activity 
CheckInActivity.java 
public class CheckInActivity extends Activity implements WearableListView.ClickListener { 
private WearableListView mListView; 
private MyListAdapter mAdapter; 
private float mDefaultCircleRadius; 
private float mSelectedCircleRadius; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_checkin); 
mDefaultCircleRadius = 
getResources().getDimension(R.dimen.default_settings_circle_radius); 
mSelectedCircleRadius = 
getResources().getDimension(R.dimen.selected_settings_circle_radius); 
mAdapter = new MyListAdapter(); 
mListView = (WearableListView) findViewById(R.id.checkin_list); 
mListView.setAdapter(mAdapter); 
mListView.setClickListener(CheckInActivity.this); 
}
private float mDefaultCircleRadius; 
private float mSelectedCircleRadius; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
Activity 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_checkin); 
mDefaultCircleRadius = 
CheckInActivity.java 
getResources().getDimension(R.dimen.default_settings_circle_radius); 
mSelectedCircleRadius = 
getResources().getDimension(R.dimen.selected_settings_circle_radius); 
mAdapter = new MyListAdapter(); 
mListView = (WearableListView) findViewById(R.id.checkin_list); 
mListView.setAdapter(mAdapter); 
mListView.setClickListener(CheckInActivity.this); 
} 
@Override 
public void onClick(WearableListView.ViewHolder viewHolder) { 
Toast.makeText(this, String.format("You selected item #%s”, 
viewHolder.getPosition()), Toast.LENGTH_SHORT).show(); 
} 
@Override 
public void onTopEmptyRegionClick() { 
Toast.makeText(this, "You tapped into the empty area above the list”, 
Toast.LENGTH_SHORT).show(); 
}
Data Layer 
Performing a Check-In on Your Watch
Transferring Assets 
sendDataToWearable() 
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); 
Asset asset = Asset.createFromBytes(byteStream.toByteArray()); 
PutDataMapRequest dataMap = 
PutDataMapRequest.create(Constants.FLIGHT_PATH + "/" + Uri.encode("SFO")); 
dataMap.getDataMap().putString(Constants.EXTRA_FLIGHTNUMBER, "AC123"); 
dataMap.getDataMap().putString(Constants.EXTRA_GATE, "C 17"); 
dataMap.getDataMap().putAsset(Constants.EXTRA_DESTINATION, imageAssetDestination); 
PutDataRequest request = dataMap.asPutDataRequest(); 
// Send the data over 
DataApi.DataItemResult result = 
Wearable.DataApi.putDataItem(googleApiClient, request).await();
Sending Messages 
sendDataToWearable() 
// If successful store the data path 
// Construct an array of all successfully sent data paths 
DataMap itemPathMap = new DataMap(); 
itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, 
result.getDataItem().getUri().toString()); 
// Convert to bytes to be send with the message 
byte[] dataMapBytes = itemPathMap.toByteArray();
Sending Messages 
sendDataToWearable() 
// If successful store the data path 
// Construct an array of all successfully sent data paths 
DataMap itemPathMap = new DataMap(); 
itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, 
result.getDataItem().getUri().toString()); 
// Convert to bytes to be send with the message 
byte[] dataMapBytes = itemPathMap.toByteArray(); 
Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); 
while (itr.hasNext()) { 
// Notify all nodes to "start", providing the data paths of all 
// transmitted tourist attractions. What "start" does will be up 
// to the wearable. 
! 
}
Sending Messages 
sendDataToWearable() 
// If successful store the data path 
// Construct an array of all successfully sent data paths 
DataMap itemPathMap = new DataMap(); 
itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, 
result.getDataItem().getUri().toString()); 
// Convert to bytes to be send with the message 
byte[] dataMapBytes = itemPathMap.toByteArray(); 
Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); 
while (itr.hasNext()) { 
// Notify all nodes to "start", providing the data paths of all 
// transmitted tourist attractions. What "start" does will be up 
// to the wearable. 
Wearable.MessageApi.sendMessage(googleApiClient, itr.next(), 
Constants.START_PATH, dataMapBytes); 
}
Receiving Data 
AndroidManifest.xml (wearable) 
<service 
android:name="de.peterfriese.weartravel.ListenerService"> 
<intent-filter> 
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> 
</intent-filter> 
</service>
Receiving Data 
ListenerService.java 
public class ListenerService extends WearableListenerService { 
@Override 
public void onDataChanged(DataEventBuffer dataEvents) { 
Log.d(TAG, "onDataChanged: " + dataEvents); 
final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents); 
for (DataEvent event : events) { 
if (event.getType() == DataEvent.TYPE_CHANGED) { 
// Not doing anything here but logging 
Uri uri = event.getDataItem().getUri(); 
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); 
String title = dataMapItem.getDataMap().getString("extra_flightnumber"); 
Log.v(TAG, "Data changed: " + uri + ", " + title); 
} 
} 
} 
@Override 
public void onMessageReceived(MessageEvent messageEvent) { 
Log.v(TAG, "onMessageReceived: " + messageEvent);
if (event.getType() == DataEvent.TYPE_CHANGED) { 
// Not doing anything here but logging 
Uri uri = event.getDataItem().getUri(); 
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); 
String title = dataMapItem.getDataMap().getString("extra_flightnumber"); 
Log.v(TAG, "Data changed: " + uri + ", " + title); 
Receiving Data 
} 
ListenerService.} 
java 
} 
@Override 
public void onMessageReceived(MessageEvent messageEvent) { 
Log.v(TAG, "onMessageReceived: " + messageEvent); 
if (Constants.START_PATH.equals(messageEvent.getPath())) { 
DataMap dataMap = DataMap.fromByteArray(messageEvent.getData()); 
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) 
.addApi(Wearable.API) 
.build(); 
ConnectionResult connectionResult = googleApiClient.blockingConnect( 
Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); 
if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { 
Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); 
return; 
} 
String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS);
ConnectionResult connectionResult = googleApiClient.blockingConnect( 
Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); 
Receiving Data 
if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { 
Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); 
return; 
} 
String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS); 
Uri uri = Uri.parse(flightUri); 
DataApi.DataItemResult dataItemResult = 
ListenerService.java 
Wearable.DataApi.getDataItem(googleApiClient, uri).await(); 
DataItem dataItem = dataItemResult.getDataItem(); 
if (dataItem != null) { 
DataMap flightDataMap = 
DataMapItem.fromDataItem(dataItem).getDataMap(); 
String flightNumber = flightDataMap.getString(Constants.EXTRA_FLIGHTNUMBER); 
String gate = flightDataMap.getString(Constants.EXTRA_GATE); 
Bitmap destinationBitmap = Utilities.loadBitmapFromAsset( 
googleApiClient, 
flightDataMap.getAsset(Constants.EXTRA_DESTINATION)); 
sendNotification(flightNumber, gate, destinationBitmap); 
} 
googleApiClient.disconnect(); 
} 
}
Demo
Thank you! 
+PeterFriese 
@ 
#AndroidWear
Q & A 
+PeterFriese 
@ 
#AndroidWear
Introduction to Android Wear

Weitere ähnliche Inhalte

Was ist angesagt?

Titanium appcelerator sdk
Titanium appcelerator sdkTitanium appcelerator sdk
Titanium appcelerator sdkAlessio Ricco
 
Break Timer: Android-wear introduction and application case-study
Break Timer: Android-wear introduction and application case-studyBreak Timer: Android-wear introduction and application case-study
Break Timer: Android-wear introduction and application case-studyUmair Vatao
 
android level 3
android level 3android level 3
android level 3DevMix
 
Android Tutorials - Powering with Selection Widget
Android Tutorials - Powering with Selection WidgetAndroid Tutorials - Powering with Selection Widget
Android Tutorials - Powering with Selection WidgetPrajyot Mainkar
 
Android Workshop
Android WorkshopAndroid Workshop
Android WorkshopJunda Ong
 
Android appwidget
Android appwidgetAndroid appwidget
Android appwidgetKrazy Koder
 
Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5Chris Griffith
 
21 android2 updated
21 android2 updated21 android2 updated
21 android2 updatedGhanaGTUG
 
Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5Chris Griffith
 
Android Wear: A Developer's Perspective
Android Wear: A Developer's PerspectiveAndroid Wear: A Developer's Perspective
Android Wear: A Developer's PerspectiveVin Lim
 
Android TV: Building apps with Google’s Leanback Library
Android TV: Building apps with  Google’s Leanback LibraryAndroid TV: Building apps with  Google’s Leanback Library
Android TV: Building apps with Google’s Leanback LibraryJoe Birch
 
Making Money with Adobe AIR
Making Money with Adobe AIRMaking Money with Adobe AIR
Making Money with Adobe AIRAlmog Koren
 
The unconventional devices for the Android video streaming
The unconventional devices for the Android video streamingThe unconventional devices for the Android video streaming
The unconventional devices for the Android video streamingMatteo Bonifazi
 
Developing AIR for Mobile with Flash Professional CS5.5
Developing AIR for Mobile with Flash Professional CS5.5Developing AIR for Mobile with Flash Professional CS5.5
Developing AIR for Mobile with Flash Professional CS5.5Chris Griffith
 
Android tv get started
Android tv get startedAndroid tv get started
Android tv get startedAscii Huang
 
Exercises broadcast receiver,incoming phone call
Exercises broadcast receiver,incoming phone callExercises broadcast receiver,incoming phone call
Exercises broadcast receiver,incoming phone callmaamir farooq
 

Was ist angesagt? (20)

Titanium appcelerator sdk
Titanium appcelerator sdkTitanium appcelerator sdk
Titanium appcelerator sdk
 
Break Timer: Android-wear introduction and application case-study
Break Timer: Android-wear introduction and application case-studyBreak Timer: Android-wear introduction and application case-study
Break Timer: Android-wear introduction and application case-study
 
android level 3
android level 3android level 3
android level 3
 
Android Tutorials - Powering with Selection Widget
Android Tutorials - Powering with Selection WidgetAndroid Tutorials - Powering with Selection Widget
Android Tutorials - Powering with Selection Widget
 
Android Workshop
Android WorkshopAndroid Workshop
Android Workshop
 
Android appwidget
Android appwidgetAndroid appwidget
Android appwidget
 
Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5
 
21 android2 updated
21 android2 updated21 android2 updated
21 android2 updated
 
Intro to appcelerator
Intro to appceleratorIntro to appcelerator
Intro to appcelerator
 
Android Widget
Android WidgetAndroid Widget
Android Widget
 
Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5Developing AIR for Android with Flash Professional CS5
Developing AIR for Android with Flash Professional CS5
 
Android Intro
Android IntroAndroid Intro
Android Intro
 
Android Wear: A Developer's Perspective
Android Wear: A Developer's PerspectiveAndroid Wear: A Developer's Perspective
Android Wear: A Developer's Perspective
 
Android TV: Building apps with Google’s Leanback Library
Android TV: Building apps with  Google’s Leanback LibraryAndroid TV: Building apps with  Google’s Leanback Library
Android TV: Building apps with Google’s Leanback Library
 
Making Money with Adobe AIR
Making Money with Adobe AIRMaking Money with Adobe AIR
Making Money with Adobe AIR
 
Your First Adobe Flash Application for Android
Your First Adobe Flash Application for AndroidYour First Adobe Flash Application for Android
Your First Adobe Flash Application for Android
 
The unconventional devices for the Android video streaming
The unconventional devices for the Android video streamingThe unconventional devices for the Android video streaming
The unconventional devices for the Android video streaming
 
Developing AIR for Mobile with Flash Professional CS5.5
Developing AIR for Mobile with Flash Professional CS5.5Developing AIR for Mobile with Flash Professional CS5.5
Developing AIR for Mobile with Flash Professional CS5.5
 
Android tv get started
Android tv get startedAndroid tv get started
Android tv get started
 
Exercises broadcast receiver,incoming phone call
Exercises broadcast receiver,incoming phone callExercises broadcast receiver,incoming phone call
Exercises broadcast receiver,incoming phone call
 

Ähnlich wie Introduction to Android Wear

Introduction to Android Wear - Peter Friese
Introduction to Android Wear - Peter FrieseIntroduction to Android Wear - Peter Friese
Introduction to Android Wear - Peter FrieseJAXLondon2014
 
Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Alfredo Morresi
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...mharkus
 
Developing for android wear
Developing for android wearDeveloping for android wear
Developing for android wearThomas Oldervoll
 
What's New in Android
What's New in AndroidWhat's New in Android
What's New in AndroidRobert Cooper
 
Session #8 adding magic to your app
Session #8  adding magic to your appSession #8  adding magic to your app
Session #8 adding magic to your appVitali Pekelis
 
Getting Ready For Android Wear
Getting Ready For Android WearGetting Ready For Android Wear
Getting Ready For Android WearRaveesh Bhalla
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentanistar sung
 
Android activity, service, and broadcast recievers
Android activity, service, and broadcast recieversAndroid activity, service, and broadcast recievers
Android activity, service, and broadcast recieversUtkarsh Mankad
 
Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)Fafadia Tech
 
Implementing cast in android
Implementing cast in androidImplementing cast in android
Implementing cast in androidAngelo Rüggeberg
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best PracticesYekmer Simsek
 
Design Patterns for Tablets and Smartphones
Design Patterns for Tablets and SmartphonesDesign Patterns for Tablets and Smartphones
Design Patterns for Tablets and SmartphonesMichael Galpin
 
Developing AIR for Android with Flash Professional
Developing AIR for Android with Flash ProfessionalDeveloping AIR for Android with Flash Professional
Developing AIR for Android with Flash ProfessionalChris Griffith
 

Ähnlich wie Introduction to Android Wear (20)

Introduction to Android Wear - Peter Friese
Introduction to Android Wear - Peter FrieseIntroduction to Android Wear - Peter Friese
Introduction to Android Wear - Peter Friese
 
Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
 
Android For All The Things
Android For All The ThingsAndroid For All The Things
Android For All The Things
 
Developing for android wear
Developing for android wearDeveloping for android wear
Developing for android wear
 
Android Froyo
Android FroyoAndroid Froyo
Android Froyo
 
What's New in Android
What's New in AndroidWhat's New in Android
What's New in Android
 
Session #8 adding magic to your app
Session #8  adding magic to your appSession #8  adding magic to your app
Session #8 adding magic to your app
 
Android 3
Android 3Android 3
Android 3
 
Getting Ready For Android Wear
Getting Ready For Android WearGetting Ready For Android Wear
Getting Ready For Android Wear
 
Compose In Practice
Compose In PracticeCompose In Practice
Compose In Practice
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
 
Android activity, service, and broadcast recievers
Android activity, service, and broadcast recieversAndroid activity, service, and broadcast recievers
Android activity, service, and broadcast recievers
 
mobl
moblmobl
mobl
 
Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)
 
Implementing cast in android
Implementing cast in androidImplementing cast in android
Implementing cast in android
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
 
Android
AndroidAndroid
Android
 
Design Patterns for Tablets and Smartphones
Design Patterns for Tablets and SmartphonesDesign Patterns for Tablets and Smartphones
Design Patterns for Tablets and Smartphones
 
Developing AIR for Android with Flash Professional
Developing AIR for Android with Flash ProfessionalDeveloping AIR for Android with Flash Professional
Developing AIR for Android with Flash Professional
 

Mehr von Peter Friese

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsPeter Friese
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopPeter Friese
 
Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsPeter Friese
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesPeter Friese
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift LeedsPeter Friese
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in SwiftPeter Friese
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple DevelopersPeter Friese
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebasePeter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase AuthPeter Friese
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthPeter Friese
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantPeter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Peter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GooglePeter Friese
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinPeter Friese
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services RockPeter Friese
 
Google+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and AndroidGoogle+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and AndroidPeter Friese
 
Cross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-InCross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-InPeter Friese
 
Bring Back the Fun to Testing Android Apps with Robolectric
Bring Back the Fun to Testing Android Apps with RobolectricBring Back the Fun to Testing Android Apps with Robolectric
Bring Back the Fun to Testing Android Apps with RobolectricPeter Friese
 

Mehr von Peter Friese (20)

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI Workshop
 
Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroes
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in Swift
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple Developers
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase Auth
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google Assistant
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services Rock
 
Google+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and AndroidGoogle+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and Android
 
Cross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-InCross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-In
 
Bring Back the Fun to Testing Android Apps with Robolectric
Bring Back the Fun to Testing Android Apps with RobolectricBring Back the Fun to Testing Android Apps with Robolectric
Bring Back the Fun to Testing Android Apps with Robolectric
 

Kürzlich hochgeladen

Vip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best Services
Vip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best ServicesVip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best Services
Vip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best Servicesnajka9823
 
《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》
《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》
《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》o8wvnojp
 
Call Girls In Munirka>༒9599632723 Incall_OutCall Available
Call Girls In Munirka>༒9599632723 Incall_OutCall AvailableCall Girls In Munirka>༒9599632723 Incall_OutCall Available
Call Girls In Munirka>༒9599632723 Incall_OutCall AvailableCall Girls in Delhi
 
RBS学位证,鹿特丹商学院毕业证书1:1制作
RBS学位证,鹿特丹商学院毕业证书1:1制作RBS学位证,鹿特丹商学院毕业证书1:1制作
RBS学位证,鹿特丹商学院毕业证书1:1制作f3774p8b
 
existing product research b2 Sunderland Culture
existing product research b2 Sunderland Cultureexisting product research b2 Sunderland Culture
existing product research b2 Sunderland CultureChloeMeadows1
 
Gaya Call Girls #9907093804 Contact Number Escorts Service Gaya
Gaya Call Girls #9907093804 Contact Number Escorts Service GayaGaya Call Girls #9907093804 Contact Number Escorts Service Gaya
Gaya Call Girls #9907093804 Contact Number Escorts Service Gayasrsj9000
 
(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一
(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一
(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一Fi sss
 
NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...
NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...
NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...Amil baba
 
Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...
Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...
Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...srsj9000
 
定制(UI学位证)爱达荷大学毕业证成绩单原版一比一
定制(UI学位证)爱达荷大学毕业证成绩单原版一比一定制(UI学位证)爱达荷大学毕业证成绩单原版一比一
定制(UI学位证)爱达荷大学毕业证成绩单原版一比一ss ss
 
Beautiful Sapna Call Girls CP 9711199012 ☎ Call /Whatsapps
Beautiful Sapna Call Girls CP 9711199012 ☎ Call /WhatsappsBeautiful Sapna Call Girls CP 9711199012 ☎ Call /Whatsapps
Beautiful Sapna Call Girls CP 9711199012 ☎ Call /Whatsappssapnasaifi408
 
毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree 毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree z zzz
 
原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证
原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证
原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证gwhohjj
 
the cOMPUTER SYSTEM - computer hardware servicing.pptx
the cOMPUTER SYSTEM - computer hardware servicing.pptxthe cOMPUTER SYSTEM - computer hardware servicing.pptx
the cOMPUTER SYSTEM - computer hardware servicing.pptxLeaMaePahinagGarciaV
 
Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝
Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝
Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝soniya singh
 
(办理学位证)多伦多大学毕业证成绩单原版一比一
(办理学位证)多伦多大学毕业证成绩单原版一比一(办理学位证)多伦多大学毕业证成绩单原版一比一
(办理学位证)多伦多大学毕业证成绩单原版一比一C SSS
 
专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degree
专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degree专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degree
专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degreeyuu sss
 

Kürzlich hochgeladen (20)

Vip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best Services
Vip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best ServicesVip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best Services
Vip Udupi Call Girls 7001305949 WhatsApp Number 24x7 Best Services
 
《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》
《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》
《1:1仿制麦克马斯特大学毕业证|订制麦克马斯特大学文凭》
 
young call girls in Gtb Nagar,🔝 9953056974 🔝 escort Service
young call girls in Gtb Nagar,🔝 9953056974 🔝 escort Serviceyoung call girls in Gtb Nagar,🔝 9953056974 🔝 escort Service
young call girls in Gtb Nagar,🔝 9953056974 🔝 escort Service
 
Call Girls In Munirka>༒9599632723 Incall_OutCall Available
Call Girls In Munirka>༒9599632723 Incall_OutCall AvailableCall Girls In Munirka>༒9599632723 Incall_OutCall Available
Call Girls In Munirka>༒9599632723 Incall_OutCall Available
 
RBS学位证,鹿特丹商学院毕业证书1:1制作
RBS学位证,鹿特丹商学院毕业证书1:1制作RBS学位证,鹿特丹商学院毕业证书1:1制作
RBS学位证,鹿特丹商学院毕业证书1:1制作
 
existing product research b2 Sunderland Culture
existing product research b2 Sunderland Cultureexisting product research b2 Sunderland Culture
existing product research b2 Sunderland Culture
 
young call girls in Khanpur,🔝 9953056974 🔝 escort Service
young call girls in  Khanpur,🔝 9953056974 🔝 escort Serviceyoung call girls in  Khanpur,🔝 9953056974 🔝 escort Service
young call girls in Khanpur,🔝 9953056974 🔝 escort Service
 
Gaya Call Girls #9907093804 Contact Number Escorts Service Gaya
Gaya Call Girls #9907093804 Contact Number Escorts Service GayaGaya Call Girls #9907093804 Contact Number Escorts Service Gaya
Gaya Call Girls #9907093804 Contact Number Escorts Service Gaya
 
(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一
(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一
(办理学位证)加州州立大学北岭分校毕业证成绩单原版一比一
 
NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...
NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...
NO1 Qualified Best Black Magic Specialist Near Me Spiritual Healer Powerful L...
 
Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...
Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...
Hifi Defence Colony Call Girls Service WhatsApp -> 9999965857 Available 24x7 ...
 
定制(UI学位证)爱达荷大学毕业证成绩单原版一比一
定制(UI学位证)爱达荷大学毕业证成绩单原版一比一定制(UI学位证)爱达荷大学毕业证成绩单原版一比一
定制(UI学位证)爱达荷大学毕业证成绩单原版一比一
 
Beautiful Sapna Call Girls CP 9711199012 ☎ Call /Whatsapps
Beautiful Sapna Call Girls CP 9711199012 ☎ Call /WhatsappsBeautiful Sapna Call Girls CP 9711199012 ☎ Call /Whatsapps
Beautiful Sapna Call Girls CP 9711199012 ☎ Call /Whatsapps
 
毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree 毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree加拿大瑞尔森大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
 
原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证
原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证
原版1:1复刻斯坦福大学毕业证Stanford毕业证留信学历认证
 
CIVIL ENGINEERING
CIVIL ENGINEERINGCIVIL ENGINEERING
CIVIL ENGINEERING
 
the cOMPUTER SYSTEM - computer hardware servicing.pptx
the cOMPUTER SYSTEM - computer hardware servicing.pptxthe cOMPUTER SYSTEM - computer hardware servicing.pptx
the cOMPUTER SYSTEM - computer hardware servicing.pptx
 
Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝
Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝
Call Girls in Dwarka Sub City 💯Call Us 🔝8264348440🔝
 
(办理学位证)多伦多大学毕业证成绩单原版一比一
(办理学位证)多伦多大学毕业证成绩单原版一比一(办理学位证)多伦多大学毕业证成绩单原版一比一
(办理学位证)多伦多大学毕业证成绩单原版一比一
 
专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degree
专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degree专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degree
专业一比一美国加州州立大学东湾分校毕业证成绩单pdf电子版制作修改#真实工艺展示#真实防伪#diploma#degree
 

Introduction to Android Wear

  • 2.
  • 3.
  • 4. REAL LIFE GET PHONE LOST IN PHONE
  • 5.
  • 7. Design Principles • Launched automatically
  • 8. Design Principles • Launched automatically • Glanceable
  • 9. Design Principles • Launched automatically • Glanceable • Suggest and Demand
  • 10. Design Principles • Launched automatically • Glanceable • Suggest and Demand • Zero or low interaction
  • 12. Simple Notifications Look, ma - no work required!
  • 13. Simple Notifications sendNotification() Intent viewIntent = new Intent(context, DummyActivity.class); PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .setContentIntent(viewPendingIntent) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 14. Can we do better?
  • 15.
  • 17. BigPictureStyle sendNotification() Intent viewIntent = new Intent(context, DummyActivity.class); PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .setStyle( new NotificationCompat.BigPictureStyle() .bigPicture(BitmapFactory.decodeResource(context.getResources(), R.drawable.sanfrancisco)) .setBigContentTitle("Flight AW123 is ready to board.") .setSummaryText("Please proceed to gate C 17 to board. Have a nice flight!")) .setContentIntent(viewPendingIntent) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 19. Pages sendNotification() ArrayList<Notification> pages = new ArrayList<Notification>(); pages.add(new NotificationCompat.Builder(context) .setContentTitle("Your seat") .setContentText("17A") .extend(new NotificationCompat.WearableExtender() .setBackground(BitmapFactory.decodeResource(context.getResources(), R.drawable.a380_seat))) .build());
  • 20. Background Only Pages sendNotification() pages.add(new NotificationCompat.Builder(context) .extend(new NotificationCompat.WearableExtender() .setHintShowBackgroundOnly(true) .setBackground(BitmapFactory.decodeResource(context.getResources(), R.drawable.qrcode))) .build());
  • 21. Adding Pages to Notifications sendNotification() Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .setContentIntent(viewPendingIntent) .extend(new NotificationCompat.WearableExtender() .addPages(pages)) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 23. Voice Input sendNotification() // Feedback intent Intent replyIntent = new Intent(context, DummyActivity.class); PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); String replyLabel = context.getResources().getString(R.string.reply_label); String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses); RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) .setLabel(replyLabel) .setChoices(cannedResponses) .build(); NotificationCompat.Action replyAction = new NotificationCompat.Action.Builder( R.drawable.chatbubble_working, replyLabel, replyPendingIntent) .addRemoteInput(remoteInput) .build();
  • 24. Sending a Voice Input Notification sendNotification() Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .extend(new NotificationCompat.WearableExtender() .addPages(pages) .addAction(replyAction)) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 25. Receiving Voice Input onCreate() Bundle remoteInputResults = RemoteInput.getResultsFromIntent(intent); if (remoteInputResults != null) { CharSequence utterance = remoteInputResults.getCharSequence(Constants.EXTRA_VOICE_REPLY); Toast.makeText(this, utterance, Toast.LENGTH_LONG).show(); }
  • 27. Actions sendNotification() Intent mapIntent = new Intent(Intent.ACTION_VIEW); Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); mapIntent.setData(geoUri); PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0); NotificationCompat.Action walkingDirectionsAction = new NotificationCompat.Action.Builder( R.drawable.ic_full_directions_walking, "Directions to gate", mapPendingIntent) .build(); ! Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .addAction(walkingDirectionsAction) .extend(new NotificationCompat.WearableExtender() .addPages(pages) .addAction(replyAction) .addAction(walkingDirectionsAction)) .build();
  • 28. Wearable apps Launching Using app-provided voice actions Using the start menu
  • 29. Launching AndroidManifest.xml <application android:icon="@drawable/greenlinelogo" android:label="@string/app_name" android:theme="@android:style/Theme.DeviceDefault" > <activity android:name="de.peterfriese.weartravel.MainActivity" android:label="@string/app_name_voice" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
  • 31. Layout - List activity_checkin.xml <android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_height="match_parent" android:layout_width="match_parent"> <FrameLayout android:id="@+id/frame_layout" android:layout_height="match_parent" android:layout_width="match_parent" app:layout_box="left|bottom|right"> <android.support.wearable.view.WearableListView android:id="@+id/checkin_list" android:layout_height="match_parent" android:layout_width="match_parent"> </android.support.wearable.view.WearableListView> </FrameLayout> </android.support.wearable.view.BoxInsetLayout>
  • 32. Layout - Item checkin_listview_item.xml <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.wearable.view.CircledImageView android:id="@+id/image" android:alpha="0.5" android:layout_height="52dp" android:layout_marginLeft="16dp" android:layout_width="52dp" app:circle_border_color="#FFFFFFFF" app:circle_border_width="2dp" app:circle_color="#00000000" /> <TextView android:id="@+id/text" android:alpha="0.5" android:fontFamily="sans-serif-condensed-light" android:gravity="center_vertical" android:layout_height="52dp" android:layout_marginLeft="72dp" android:layout_marginRight="16dp"
  • 33. <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" Layout - Item checkin_listview_item.xml xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.wearable.view.CircledImageView android:id="@+id/image" android:alpha="0.5" android:layout_height="52dp" android:layout_marginLeft="16dp" android:layout_width="52dp" app:circle_border_color="#FFFFFFFF" app:circle_border_width="2dp" app:circle_color="#00000000" /> <TextView android:id="@+id/text" android:alpha="0.5" android:fontFamily="sans-serif-condensed-light" android:gravity="center_vertical" android:layout_height="52dp" android:layout_marginLeft="72dp" android:layout_marginRight="16dp" android:layout_width="wrap_content" android:textColor="@color/white" android:textSize="14sp" /> </merge>
  • 34. MyViewItem CheckInActivity.java private final class MyItemView extends FrameLayout implements WearableListView.Item { final CircledImageView image; final TextView text; private float mScale; public MyItemView(Context context) { super(context); View.inflate(context, R.layout.checkin_listview_item, this); image = (CircledImageView) findViewById(R.id.image); text = (TextView) findViewById(R.id.text); } @Override public float getProximityMinValue() { return mDefaultCircleRadius; } @Override public float getProximityMaxValue() { return mSelectedCircleRadius; }
  • 35. private float mScale; public MyItemView(Context context) { MyViewItem super(context); View.inflate(context, R.layout.checkin_listview_item, this); image = (CircledImageView) findViewById(R.id.image); text = (TextView) findViewById(R.id.text); CheckInActivity.java } @Override public float getProximityMinValue() { return mDefaultCircleRadius; } @Override public float getProximityMaxValue() { return mSelectedCircleRadius; } @Override public float getCurrentProximityValue() { return mScale; } @Override public void setScalingAnimatorValue(float value) { mScale = value; image.setCircleRadius(mScale); image.setCircleRadiusPressed(mScale); } @Override
  • 36. @Override public float getProximityMaxValue() { MyViewItem return mSelectedCircleRadius; } @Override public float getCurrentProximityValue() { CheckInActivity.java return mScale; } @Override public void setScalingAnimatorValue(float value) { mScale = value; image.setCircleRadius(mScale); image.setCircleRadiusPressed(mScale); } @Override public void onScaleUpStart() { image.setAlpha(1f); text.setAlpha(1f); } @Override public void onScaleDownStart() { image.setAlpha(0.5f); text.setAlpha(0.5f); } }
  • 37. Adapter - Bind ViewHolder CheckInActivity.java public class MyListAdapter extends WearableListView.Adapter { @Override public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); } @Override public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { MyItemView myItemView = (MyItemView) viewHolder.itemView; TextView textView = (TextView) myItemView.findViewById(R.id.text); textView.setText(String.format("Seat %d", i)); Integer resourceId = R.drawable.ic_action_done; CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); imageView.setImageResource(resourceId); } @Override public int getItemCount() { return 17; }
  • 38. Adapter - Bind ViewHolder public class MyListAdapter extends WearableListView.Adapter { CheckInActivity.java @Override public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); } @Override public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { MyItemView myItemView = (MyItemView) viewHolder.itemView; TextView textView = (TextView) myItemView.findViewById(R.id.text); textView.setText(String.format("Seat %d", i)); Integer resourceId = R.drawable.ic_action_done; CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); imageView.setImageResource(resourceId); } @Override public int getItemCount() { return 17; } }
  • 39. Activity CheckInActivity.java public class CheckInActivity extends Activity implements WearableListView.ClickListener { private WearableListView mListView; private MyListAdapter mAdapter; private float mDefaultCircleRadius; private float mSelectedCircleRadius; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_checkin); mDefaultCircleRadius = getResources().getDimension(R.dimen.default_settings_circle_radius); mSelectedCircleRadius = getResources().getDimension(R.dimen.selected_settings_circle_radius); mAdapter = new MyListAdapter(); mListView = (WearableListView) findViewById(R.id.checkin_list); mListView.setAdapter(mAdapter); mListView.setClickListener(CheckInActivity.this); }
  • 40. private float mDefaultCircleRadius; private float mSelectedCircleRadius; @Override protected void onCreate(Bundle savedInstanceState) { Activity super.onCreate(savedInstanceState); setContentView(R.layout.activity_checkin); mDefaultCircleRadius = CheckInActivity.java getResources().getDimension(R.dimen.default_settings_circle_radius); mSelectedCircleRadius = getResources().getDimension(R.dimen.selected_settings_circle_radius); mAdapter = new MyListAdapter(); mListView = (WearableListView) findViewById(R.id.checkin_list); mListView.setAdapter(mAdapter); mListView.setClickListener(CheckInActivity.this); } @Override public void onClick(WearableListView.ViewHolder viewHolder) { Toast.makeText(this, String.format("You selected item #%s”, viewHolder.getPosition()), Toast.LENGTH_SHORT).show(); } @Override public void onTopEmptyRegionClick() { Toast.makeText(this, "You tapped into the empty area above the list”, Toast.LENGTH_SHORT).show(); }
  • 41. Data Layer Performing a Check-In on Your Watch
  • 42. Transferring Assets sendDataToWearable() final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); Asset asset = Asset.createFromBytes(byteStream.toByteArray()); PutDataMapRequest dataMap = PutDataMapRequest.create(Constants.FLIGHT_PATH + "/" + Uri.encode("SFO")); dataMap.getDataMap().putString(Constants.EXTRA_FLIGHTNUMBER, "AC123"); dataMap.getDataMap().putString(Constants.EXTRA_GATE, "C 17"); dataMap.getDataMap().putAsset(Constants.EXTRA_DESTINATION, imageAssetDestination); PutDataRequest request = dataMap.asPutDataRequest(); // Send the data over DataApi.DataItemResult result = Wearable.DataApi.putDataItem(googleApiClient, request).await();
  • 43. Sending Messages sendDataToWearable() // If successful store the data path // Construct an array of all successfully sent data paths DataMap itemPathMap = new DataMap(); itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, result.getDataItem().getUri().toString()); // Convert to bytes to be send with the message byte[] dataMapBytes = itemPathMap.toByteArray();
  • 44. Sending Messages sendDataToWearable() // If successful store the data path // Construct an array of all successfully sent data paths DataMap itemPathMap = new DataMap(); itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, result.getDataItem().getUri().toString()); // Convert to bytes to be send with the message byte[] dataMapBytes = itemPathMap.toByteArray(); Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); while (itr.hasNext()) { // Notify all nodes to "start", providing the data paths of all // transmitted tourist attractions. What "start" does will be up // to the wearable. ! }
  • 45. Sending Messages sendDataToWearable() // If successful store the data path // Construct an array of all successfully sent data paths DataMap itemPathMap = new DataMap(); itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, result.getDataItem().getUri().toString()); // Convert to bytes to be send with the message byte[] dataMapBytes = itemPathMap.toByteArray(); Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); while (itr.hasNext()) { // Notify all nodes to "start", providing the data paths of all // transmitted tourist attractions. What "start" does will be up // to the wearable. Wearable.MessageApi.sendMessage(googleApiClient, itr.next(), Constants.START_PATH, dataMapBytes); }
  • 46. Receiving Data AndroidManifest.xml (wearable) <service android:name="de.peterfriese.weartravel.ListenerService"> <intent-filter> <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service>
  • 47. Receiving Data ListenerService.java public class ListenerService extends WearableListenerService { @Override public void onDataChanged(DataEventBuffer dataEvents) { Log.d(TAG, "onDataChanged: " + dataEvents); final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents); for (DataEvent event : events) { if (event.getType() == DataEvent.TYPE_CHANGED) { // Not doing anything here but logging Uri uri = event.getDataItem().getUri(); DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); String title = dataMapItem.getDataMap().getString("extra_flightnumber"); Log.v(TAG, "Data changed: " + uri + ", " + title); } } } @Override public void onMessageReceived(MessageEvent messageEvent) { Log.v(TAG, "onMessageReceived: " + messageEvent);
  • 48. if (event.getType() == DataEvent.TYPE_CHANGED) { // Not doing anything here but logging Uri uri = event.getDataItem().getUri(); DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); String title = dataMapItem.getDataMap().getString("extra_flightnumber"); Log.v(TAG, "Data changed: " + uri + ", " + title); Receiving Data } ListenerService.} java } @Override public void onMessageReceived(MessageEvent messageEvent) { Log.v(TAG, "onMessageReceived: " + messageEvent); if (Constants.START_PATH.equals(messageEvent.getPath())) { DataMap dataMap = DataMap.fromByteArray(messageEvent.getData()); GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .build(); ConnectionResult connectionResult = googleApiClient.blockingConnect( Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); return; } String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS);
  • 49. ConnectionResult connectionResult = googleApiClient.blockingConnect( Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); Receiving Data if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); return; } String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS); Uri uri = Uri.parse(flightUri); DataApi.DataItemResult dataItemResult = ListenerService.java Wearable.DataApi.getDataItem(googleApiClient, uri).await(); DataItem dataItem = dataItemResult.getDataItem(); if (dataItem != null) { DataMap flightDataMap = DataMapItem.fromDataItem(dataItem).getDataMap(); String flightNumber = flightDataMap.getString(Constants.EXTRA_FLIGHTNUMBER); String gate = flightDataMap.getString(Constants.EXTRA_GATE); Bitmap destinationBitmap = Utilities.loadBitmapFromAsset( googleApiClient, flightDataMap.getAsset(Constants.EXTRA_DESTINATION)); sendNotification(flightNumber, gate, destinationBitmap); } googleApiClient.disconnect(); } }
  • 50. Demo
  • 51. Thank you! +PeterFriese @ #AndroidWear
  • 52. Q & A +PeterFriese @ #AndroidWear