首页 > 代码库 > Android Wear之android穿戴式设备应用开发平台

Android Wear之android穿戴式设备应用开发平台

          Android Wear于2014年03月19日发布,并有Moto 360和LG watch两款产品。目前源码还没有开放,但是开发者可以下载它的Image及对应的开发SDK,这样开发者通过模拟器可以进行前期开发。其实,Android Wear包含两个部分,一部分是运行在穿戴式设备上的操作系统,一部分是给手持设备(手机,平板)程序使用的SDK,该SDK的主要目的是为可穿戴设备上应用开发提供了参考及规范,以引导用户开发出可同小屏幕设备协作操作的应用程序。这里使用“协作操作”是因为用户开发的这个程序永远不会在可穿戴式设备上运行,它只是定义UI界面,android wear的服务会将UI信息传递给可穿戴式设备,然后可穿戴式设备利用自身的UI机制显示出。从这个角度来看,Android wear的作用是在手持设备和可穿戴式设备提供一套显示标准,按照这个格式,就可实现跨设备显示。这个标准就是android的通知,当穿戴式设备和手持设备连接后,手持设备的通知就会传递到穿戴式设备,然后穿戴式设备将通知以适合自身的操作的方式显示处理,当然为了在穿戴式设备上有更好的显示,需要开发者做少量的修改,这个就是SDK的作用。目前Android Wear的信息还不够多,接下来几天的Google IO大会(6.25-6.27)上,Android Wear必将是热点话题,会释放更多信息。


Android Wear推出原因


       我们知道,android自打一出世,就一直引导用户一个程序同时支持不同屏幕设备的应用,这也是res目录下有layout, layout-land, layout-portrait, layout-sw600等目录的原因,即是为了让不同的设备使用不同的layout达到设备兼容。那为啥到了可穿戴设备上,android需要出一套独立的SDK呢?这是因为可穿戴设备和手机平板等设备太不一样了。具体体现在。

1)      屏幕太小,老的显示模式不再适合

相比手机和平板,可穿戴设备(手表)的屏幕不是小,而是特别小。因而在这个屏幕上,应用基本上是显示不出几个view的,因而原来的那个复杂的layout文件决定程序显示框架的机制太复杂了,也用不上。

2)      输入问题

我们知道,从PC切到手机,我们学会了从外接键盘切入软键盘,并乐享其中。那穿戴式设备呢?在手表等小的可怜的设备上弹出一个输入键盘,估计用户得拿放大镜来输入。

3)      设备的非独立性

我们知道,穿戴式设备体积小,自然硬件就不够强且配件也少(摄像头,上网模块等等),自然没法做比较复杂的操作,因此穿戴式设备往往需要借助手持设备来帮组其完成任务,比如拍照,上网。


Android Wear重点模块分析


       显示:

       屏幕小,因而尽量减少UI界面的元素,只显示重要内容,并且尽量方便用户交互。从这个角度来看,window8系统高瞻远瞩,卡片式的UI呈现天生适合任意分辨率的显示设备。尤其是Metro桌面的程序动态消息显示,很适合穿戴式设备。最开始的时候已经提到,穿戴式设备的显示主要就是通过显示通知来实现的,采用通知这一机制本身就避免了上面的一些不足,达到显示重点的目的,因为android的通知本身比较简约,也适合小屏幕操作。除了这个之外,还有其他的一些改动。比如,android wear扩展并新增了一些通知对象,比如action,分页显示。

 

//普通的android设备的notification对象
NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(mContext)
        .setContentTitle("New mail from " + sender.toString())
        .setContentText(subject)
        .setSmallIcon(R.drawable.new_mail);

//带action的notification,该action在可穿戴式设备是以一个单独的页面显示
//的,用户左滑即可进入action页面,这个就是下面我们要提到的交互
NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_event)
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent)
        .addAction(R.drawable.ic_map,
                getString(R.string.map), mapPendingIntent);

//下面的WearableNotifications是重点,这个就是专门针对可穿戴式设备新增的
//一类notification,这类notification允许有多个显示页面,用户通过左右滑动
//可以很自然的浏览更多内容
Notification notification =
        new WearableNotifications.Builder(notificationBuilder)
        .setHintHideIcon(true)
        .build();

//下面notification的发送逻辑和普通设备的notification是一样的
NotificationManagerCompat notificationManager =
        NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, notification);

         当这个notification发送完后,wear界面上就会有如下显示:

 

        交互:

        屏幕小,自然UI上没法提供太多的选择让用户去做,更没有空间以软键盘的方式输入。因为,android wear上的交互往往比较专注,就是每个界面只做一件事,这样可以简化交互方式。这样交互的模式可以简化为显示通知,用户回复这一简单的过程。同时用户回复也必须方便,尽量减少用户的手工输入,因为android wear提供了常用的两种,提供option列表和语音输入两种。同时android wear将这个回复的模式规范化了。这个交互在android wear叫做action,而输入只是交互的一种方式,在android wear里叫做RemoteInput,有remote字眼是因为往往这个输入并不会直接发送出去了,而是会先发送到手持设备上(手机,平板),然后手持设备才真正发送。具体代码逻辑如下:

        纯语音的输入:

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
        .setLabel(replyLabel)
        .build();

        带默认文本选项及语音的输入:

String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
        .setLabel(replyLabel)
        .setChoices(replyChoices)
        .build();

         将输入响应添加到通知中

Notification replyNotification =
        new WearableNotifications.Builder(replyNotificationBuilder)
        .addRemoteInputForContentIntent(remoteInput)
        .build();

         

         多设备连接

         由于多设备互联,数据传输等都是系统Framework和底层问题,而不是直接和设备的使用者打交道的,这个会在源码开放后,我将单独做一篇文章来分析。你可能会问了,为啥不开放,其实google目前正在弥补一个过错,就是由于android过于开放导致android碎片化,google对于android没啥控制里,国内厂商那就更加了。因而,在穿戴式设备的android上,google估计肯定想统一接口,增强用户体验的一致性。


Android wear体验环境搭建:


1.  下载SDK

1)      升级android-sdk-tool到22.6版本或者更高

2)      启动SDK Manager,然后选择如下勾选的内容:

然后选择如下勾选的内容并下载(重点是AndroidWear ARM EABI v7a System Image和Android Support Library两项)

itleaks@Itleaks:~/android-sdk-linux/tools$ ./android


2.  创建/启动android wear 模拟器

       这个应该很简单,只需在模拟器界面选择AndroidWearRound/Square即可。

        创建完后,点击start即可


3.  手机设备上安装android wear preivew程序

        该程序其实就是一个launcher,可穿戴式设备上的默认launcher就是这个。该程序同时还有一个后台service,该service负责接收系统的通知,然后在launcher上显示。对于可穿戴式设备,该service能够接收远程(手机)的通知,然后再在launcher上显示。安装完后,按home键,会弹出选择框,然后选择android wear就在手机上进入android wear launcher。然后需要开启允许接收通知选项。由于该应用处于preview的状态,google不希望将该应用开放,因为这里我就没有将该app上传了,感兴趣的可以在下面的网页注册成为测试者来体验

http://developer.android.com/wear/preview/signup.html

Hello Developer,


Thank you for signing up for the Android Wear Developer Preview.


To begin developing on Android Wear, you’ll need the Preview Support library and the Android Wear Preview app for your mobile device. Follow these steps:


  • Download the Preview Support library and samples.

  • Opt-in to become a tester of the Android Wear Preview app in the Google Play Store. After opt-in, it could take up to 24 hours for the Android Wear Preview app to be accessible to you in Google Play. Make sure the opt-in user account is the same user signed in to Google Play.


Refer to the Android Wear DeveloperGet Started page for details. Since this is a preview release, please do not publicly distribute apps built with the Preview library.Also note that the APIs are potentially subject to change and you will need to modify your apps when they are released out of preview.

           有消息后就会有类似如下的显示:

                

4.  连接手机和模拟器

        刚刚也提到了,模拟器是通过读取手机上的通知来显示的,自然需要有通信通道,对于模拟器来说,就是通过adb的tcp通道来的。通过如下命令实现:

         对于实际使用场景,智能手表等穿戴式设备一般是通过蓝牙或者Wifi-direct来和手机通信。

         

adb -d forward tcp:5601 tcp:5601

总结:

总的来说,android wear主要实现了两点:

1)  建立跨设备显示交互标准。通知从手持设备按照一定的标准透传到穿戴式设备,穿戴式设备根据通知信息,然后显示出来,用户的响应然后再返回到手持设备。

2)  改造了androidnotification显示机制,让notification成为设备显示标准,并允许通知以适合穿戴式设备显示交互的方式显示。


/********************************
* 本文来自博客  “爱踢门”
* 转载请标明出处:http://blog.csdn.net/itleaks
******************************************/