开发环境搭建
连接手持设备与穿戴设备模拟器到开发环境
创建Android Wear项目
手持设备与穿戴设备的通知同步
支持语音输入的通知
多条通知
Android Wear 开发环境与Android的开发环境一样,都是基于Android SDK的,但是官方建议使用 Android Studio作为IDE(集成开发环境)。使用AndroidStudio 可以非常方便的来创建、开发、打包Android Wear 应用。
开发环境需要在Android 开发环境的基础上搭建,主要从以下几个步骤开始:
1. 下载Android Wear SDK
2. 创建穿戴设备模拟器
3. 连接手持设备与穿戴设备模拟器到开发环境
4. 创建Android Wear 项目,运行
下载Android Wear SDK
下载穿戴设备SDK需要使用SDK Manager来进行下载,打开Android Studio后,点击工具栏上的 图标,打开SDK Manager。勾选需要下载的包,点击下载即可。SDK更新建议使用这种方法更新或者直接百度 “SDK更新”,下载速度很快。
注意:如果后期SDK推出更高版本,建议下载最高版的前一个版本。既保证了使用新技术又可以避免最新版本带来的问题
创建设备模拟器
由于Android Wear设备是没有USB接口的,而且很多功能必须依赖手机才能实现,如果要对穿戴设备设备进行开发调试的话,就必须要通过连接手机才能进行进行。连接穿戴设备模拟器的具体步骤如下:
1. 在手机上安装Google Play,从Google Play上下载Android Wear应用,安装到手机。
Android Wear 是Google推出的,专门用于通过蓝牙连接 AndroidWear设备的应用。
2. 通过USB连接手机到开发环境。
3. 设置 AVD的通信端口到 连接的手机上,且每次连接手机都要重新设置。
adb -d forward tcp:5601 tcp:5601
4. 打开手机上的AndroidWear APP,连接手机端模拟器。
具体的连接模式,如下图所示:
注意:由于目前国内不能使用Google服务,所以手机上大多没有安装GooglePlay。如果要安装GooglePlay,需要将手机Root后,通过”谷歌安装器”来安装GooglePlay,或者通过安装第三方Recovery之后再把相应的zip包刷进去。具体的操作需要读者自己来解决,因为每一款手机的安装操作都可能不太一样。GooglePlay安装后,需要登录Google服务器进行下载操作,但是目前Google网站被墙,建议使用 fqroute 后再登录 GooglePlay,下载Android Wear 。如果在GooglePlay上找不到Android Wear ,可以到国内的软件市场下载,目前只有360安全市场可以下载。但是需要注意,Android Wear 是依赖GooglePlay的,所以只安装Android Wear 是不行的。
如果开发者持有穿戴设备设备,同样可以通过蓝牙来进行调试。主要步骤如下:
1. 打开手机的USB调试
2. 在穿戴设备启动蓝牙调试(Android Wear 系统界面目前不支持中文)
a) 点击屏幕,打开 Wear Menu
b) 滑动到底部,点击 Settings
c) 滑动到底部,如果没Developer Options,点击About,多次点击 Build number,开启开发者模式
d) 右划回到上一界面,点击 Developer Options
e) 开启 Debug over Bluetooth,ADB debugging
3. 启动手机的AndroidWear应用,点击右上角的设置图标,打开设置
4. 在 Settings 界面底部,勾选 Debug over Bluetooth后,会有提示
Host: disconnected //主机 未连接
Target: connected //Android Wear 已连接
5. 手机通过USB连接电脑,执行命名
adb forward tcp:4444 localabstract:/adb-hub
adb connect localhost:4444
6. 在手机的AndroidWear应用上,可以看到连接状态已经变为
Host: connected
Target: connected
AndroidWear 应用程序直接在穿戴设备设备上运行,可以访问其上的传感器与GPU。这些应用程序与其他设备的程序一样使用Android SDK开发,但是在UI设计商上、使用的功能上有很大的区别。以下是穿戴设备应用程序与手持设备应用程序的最大区别:
1. 系统执行超时时间。如果穿戴设备应用展示了一个Activity,并且用户没有与Activity进行交互,设备就会进入睡眠。当设备被唤醒,
穿戴设备显示的是 Home界面而不是 Activity界面。如果需要持续的显示一些内容,可以创建一个通知在Context Stream显示。
2. 穿戴设备应用相对手持设备应用来说,安装包体积较小,功能较少。他们仅仅显示一些主要的UI界面,相当于是手持设备APP的子集。
通常,应该尽可能的将执行操作的功能放在手持设备应用上,然后返回操作的结果到 穿戴设备应用。
3. 用户不能直接下载穿戴设备应用,而是要将穿戴设备应用绑定到手持设备应用上。当用户安装手持设备应用,系统会
自动安装穿戴设备应用到穿戴设备。如果是开发调试,可以直接安装穿戴设备应用。
4. 穿戴设备应用支持大多数的API,但是,不支持以下API:
android.webkit; android.print; android.app.back; android.appwidget; android.hardware.usb;
一个包含穿戴设备应用的组合手持设备应用同样需要发布到 Googleplay。Android Wear不支持 GooglePlay ,所以用户下载组合手持设备应用,会自动同步 穿戴设备应用到穿戴设备设备上。手持设备应用可以用来做繁重计算的操作、网络操作、或者其他操作,最后将结果返回到穿戴设备应用上。
创建穿戴设备应用项目与普通Android项目一样,运行AndroidStudio后点击start a new Android Stuidio project,然后会打开创建应用的向导,一步步next完成即可。但是需要注意,创建时同时勾选 Phone and Tablet与Wear,如图:
当创建操作完成后,AndroidStudio创建一个新的项目包含2个模块,mobile 与wear如图 24.11。现在的这个项目就包含穿戴设备与手持设备的APP,可以创建 Activity、Service、自定义布局、等等。在手持设备,主要用来做大部分的繁重操作,例如 网络通信、进程间通信、大量的用户交互等。当这些操作完成,可以使用Notification或同步数据到穿戴设备上。
在开发过程中,可以像以前一样,直接安装应用到穿戴设备,使用 adb install 或者 AndroidStudio上的Play按钮。当项目完成、准备发布应用给用户,应该将穿戴设备应用嵌入到手持设备应用。当用户在GooglePlay上下载、安装应用后,连接手机的穿戴设备设备会自动安装穿戴设备应用。
注意:在平常开发中使用的是 Debug 签名,穿戴设备应用不会自动安装到手表上,只有通过签名后才可以自动安装。点击Studio的菜单 Build,选择Generate Signed APK…进行签名。
运行后的效果如图所示,至此,开发环境就搭建好了。
一个Android的手持设备(平板或手机)与AndroidWear设备连接后,手持设备会自动将通知发送到穿戴设备上。通知会以卡片的形式显示在穿戴设备的ContextStream上。然而,为了给用户最好的体验,开发者应该添加穿戴设备特定的功能到通知上。从以下几点来看下如何同时为穿戴设备与手持设备创建通知。
1. 创建通知
2. 支持语音输入的通知
3. 添加多页面到通知
4. 堆叠通知
创建通知
使用NotificationCompat.Builder来创建一个可以往手持设备与穿戴设备同时发出的通知。当使用这个类创建的通知,系统会自动的显示通知在不同的平台。使用NotificationCompat.Builder 类需要在 mobile 的 build.gradle文件中加上一行代码来引用 v4包,如下所示。
compile 'com.android.support:support-v4:21.0.3'
创建、显示的方式与之前Android中的方式无异,具体代码如下:
NotificationCompat.Builder builder = new
NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("标题");
builder.setContentText("内容");
Intent i = new Intent();
i.setClass(this, ReplayActivity.class);
PendingIntent intent =
PendingIntent.getActivity(MainActivity.this, 0, i,
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(intent);
NotificationManagerCompat mgr =
NotificationManagerCompat.from(this);
mgr.notify((int)(Math.random()*1000), builder.build());
当通知显示在手持设备上时,同时也会显示在穿戴设备上。在穿戴设备上向右滑动的时候,就会取消通知显示,同时,在手持设备上也会取消通知显示。在穿戴设备上左划,就会显示 ‘Open on phone’,点击后,则手持设备端会打开PendingIntent 所对应的组件,如下图所示
除了通过 setContentIntent() 定义主要的操作之外,还可以使用addAction()来添加其他的操作。在mgr.notify() 之前加入以下代码:
Intent actionIntent = new Intent();
i.setClass(this, ReplayActivity.class);
PendingIntent actionPendingIntent =
PendingIntent.getActivity(MainActivity.this, 0, i,
PendingIntent.FLAG_UPDATE_CURRENT);
//添加ActionButton
//参数分别为:1 图标;2 文字;3 点击跳转界面
builder.addAction(R.drawable.ic_launcher, "ActionButton",
actionPendingIntent);
在手持设备上,Action会以一个附加按钮的形式显示在Notification 上(展开通知可以看到),在穿戴设备上,当用户左划的划的时候,就能看到以大按钮的形式展示的Action,当用户点击按钮的时候,Action所指的Intent 会在手持设备上调用。效果如图所示
如果你需要与手持设备区分,Action操作只在穿戴设备上有效,则需要使用 WearableExtender.addAction() 方法。注意,一旦使用这种方法添加Action,穿戴设备就不会显示通过NotificationCompat.Builder.addAction()添加的Action。同样,使用这个方式添加的Action不会在手持设备上显示。
//创建 只在 Wearable 端显示的Action
NotificationCompat.Action action = new
NotificationCompat.Action.Builder(R.drawable.ic_launcher,
"Wearable Only Notification", intent).build();
//添加Action到通知上
builder.extend(new NotificationCompat
.WearableExtender().addAction(action));
可以使用 “Big View ”样式往通知中插入更多的附加文字内容。在手持设备上,用户展开通知才可以看到“Big View”内容。在穿戴设备上,“Big View”是默认显示出来的。可以通过调用 NotificationCompat.Builder对象的 setStyle()方法来设置扩展的内容,比如传递BigTextStyle或者InboxStyle的对象。具体代码如下:
//大视图样式 可以使用BigTextStyle InboxStyle
NotificationCompat.BigTextStyle style = new
NotificationCompat.BigTextStyle();
//内容太多的话,需要点击Wearable通知,下拉滚动显示
style.bigText("大视图内容-大视图内容-大视图内容-大视图内容-大视图内"
+"容-大视图内容-大视图内容-大视图内容-大视图内容-大视图内容-大视图"
+"内容-大视图内容-大视图内容-大视图内容-大视图内容-大视图内容");
builder.setContentIntent(intent);
builder.setStyle(style);
//设置Wearable 通知背景
builder.setLargeIcon(BitmapFactory.decodeResource(
getResources(), R.drawable.ic_launcher));
可以调用通知的setLargeIcon() 方法来添加一个大的图片到任意的通知上。这个图片会以背景图片的形式显示到穿戴设备上,运行效果如下图所示:
如果需要添加穿戴设备特有的属性到通知上,例如,指定附加内容的页数,让用户通过语音输入等,就需要使用NotificationCompat.WearableExtender类。具体的使用步骤如下:
1. 创建WearableExtender对象,设置穿戴设备通知特有的属性。
2. 创建NotificationCompat.Builder对象,设置一些属性。
3. 调用extend() 将WearableExtender对象传入,设置属性到通知上。
4. 调用build() 构建Notification
例如:如果要隐藏穿戴设备通知卡片上的图标,可以使用下面的代码:
NotificationCompat.WearableExtender extender = new
NotificationCompat.WearableExtender();
//设置背景
extender.setBackground(BitmapFactory.decodeResource(
getResources(), R.drawable.background));
//隐藏 小图标
extender.setHintHideIcon(true);
注意:使用setbackground() 设置背景图片时,如果背景不能滚动需要400x400像素的图片,如果背景能滚动则需要使用640*400 像素的图片。并将这些图片放入 drawable的nodpi 目录下。最后,必须使用 NotificationManagerCompat对象来发出通知,不然使用NotificationCompat.WearableExtender没有效果。
假如手持设备的通知上包含文字输入的功能,例如回复邮件,正常情况下手持设备上会启动一个Activity来输入文字。然而,当通知显示在穿戴设备上时,没有键盘输入,你可以使用RemoteInput让用户口述回复,或者使用提供预定义的文本消息回复。当用户以声音,或者预定义的文本信息作为回答,系统会将答复添加进通知的Intent中,然后在手持设备上打开Intent对应的组件。
创建支持语音输入的RemoteInput.Builder对象添加到通知中,这个类的构造器需要传递一个字符串作为作为语音输入的key,稍后用于检出输入的文字。除允许声音输入外,可以提供5个预定义的文本消息,让用户选择以快速回复。
代码如下:
private static final String EXTRA_VOICE_REPLY =
"extra_voice_reply";
String[] choices = {"吃过了", "还没吃", "你请我啊", "我要吃麻辣烫"};
//EXTRA_VOICE_REPLY 为检出语音输入文本的Key
RemoteInput input = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel("吃饭了么?") //设置 提问
.setChoices(choices) //设置 预定义文本作为快速回复
.build();
设置语音输入,可以使用addRemoteInput()方法添加RemoteInput对象到Action,让通知支持语音回复。
代码如下:
//创建Intent,用于接收回复
Intent actionIntent = new Intent();
i.setClass(this, ReplayActivity.class);
PendingIntent actionPendingIntent =
PendingIntent.getActivity(MainActivity.this, 0, i,
PendingIntent.FLAG_UPDATE_CURRENT);
//创建Action
NotificationCompat.Action actionRemoteInput = new
NotificationCompat.Action.Builder(R.drawable.background,
"语音回复", actionPendingIntent)
.addRemoteInput(input).build();
//添加Action到通知
builder.extend(new NotificationCompat.WearableExtender()
.setBackground(BitmapFactory.decodeResource(getResources() , R.drawable.background))
.addAction(actionRemoteInput));
在回复意图所对应的Activity中接收用户回复,调用getResultsFromIntent()方法,把含有回复内容的Intent传过去,这个方法的返回值是包含回复信息的Bundle对象,根据之前设置的语音输入文本的Key就可以取出所对应的文本内容。
代码如下:
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput =
RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(EXTRA_VOICE_REPLY);
}
return null;
}
运行效果如下图所示,最开始语音回复,说完语音后,系统会自动语音识别成字符串。或者也可可以选择预先定义好的文本,作为答复。当答复后,系统会显示“Sending”界面,让用户有时间来取消之前的选择。如果“Sending”界面进度完成后,系统会打开Action所对应的Intent,从该Activity的Intent中取出答复的文本。
语音输入的通知
注意:模拟器不支持语音输入,只能键盘输入。所以这个案例的语音功能只能在真机上测试。
当为手持设备创建通知时,一般会将相似的通知聚合到一个单独汇总通知上。例如,为接收到短信来创建通知,当同时收到多条短信时,不应该显示多条通知,而是显示一条通知,来提示 “2条信息”。
然而,汇总通知对于穿戴设备来说很少有用,因为用户并不能在穿戴设备上看到信息的详情(只能打开手持设备来看到更多的内容)。所以,对于穿戴设备,应该将多个通知汇总在一起,这个汇总的通知只显示一个卡片,用户可以展开卡片看到每个通知的详情。新setGroup()方法使之成为可能,同时允许只提供一个汇总的通知在手持设备上。
调用每个通知的setGroup()方法,可以将group key相同的通知放入指定的堆中。然后调用notify() 发送通知。具体代码如下:
//设置分组key 调用多次,就会发现相同Key的通知在同一组中
builder.setGroup("GroupKry");
builder.setGroupSummary(true);
NotificationCompat.WearableExtender bgextender=new
NotificationCompat.WearableExtender();
bgextender.setBackground(BitmapFactory.decodeResource(
getResources(),R.drawable.background));
builder.extend(bgextender);
当发出多条通知时,穿戴设备上会自动将分组key相同的通知放进通过一个汇总通知中,点击“more”才会展开看到每条通知。
整理自:https://me.csdn.net/Mr_WangGang