Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收
本节由介绍3种数据的发送接收:
1.Data Items : 比特类型数据,限制100KB以内
2.Assets : 资源类型数据,大小无上限
3.Message : 发送消息,触发指令
http://developer.android.com/training/wearables/data-layer/data-items.html
1.Syncing Data Items
DataItem定义了同步手机和手表的数据接口.一个DataItem对象一般包括下面2个部分:
- 负载 : 一个比特类型数组,支持任意实现了序列化接口的对象.负载最大是100KB.
- 路径 : 一个唯一的字符串,且必须以"/"斜杠作为开头,如"/path/to/data"
一般来说是不需要自己实现DataItem接口的,而是通过以下方式:
- 创建一个PutDataRequest对象,用一个唯一的字符串ID来定义.
- 调用setData()方法将负载数据传入
- 调用DataApi.putDataItem()请求系统来构建数据单元
- 当请求数据单元时,系统会返回实现了DataItem接口的对象
以上的方式并非最佳的选择,还可以通过DataMap的方式来实现,这类似于Bundle.
Sync Data with a Data Map
因为DataMap的方式是用Bundle实现的,所以它帮我们解决了序列化问题,并且可以使用键值对的方式来操控数据.
使用方法
- 构造一个PutDataMapRequest对象,设置唯一ID.
- 调用PutDataMapRequest.getDataMap()来获取一个数据map.
- 用put...()方法来设置所需的数据.
- 调用PutDataMapRequest.asPutDataRequest()来获取一个PutDataRequest对象.
- 调用DataApi.putDataItem()请求系统传递数据.
注意:此时手表和手机若未连接,则会缓存在发送端,待到两端连接时再进行同步.
代码样例
private void syncData() {
PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
dataMap.getDataMap().putInt(COUNT_KEY, count++);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
}
Listen for Data Item Events
当任意一端的数据发生变化时,这时候如果想通知到另外一端,可以通过监听数据改变接口来实现:
代码样例
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_DELETED) {
Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());
} else if (event.getType() == DataEvent.TYPE_CHANGED) {
Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri());
}
}
}
http://developer.android.com/training/wearables/data-layer/assets.html
2.Transferring Assets
若想通过蓝牙发送较大的二进制数据块,例如图片,则需要将数据绑定到Asset对象上.
Assets自动地处理了数据缓存的阻止重发和保存蓝牙数据带宽.一个通用模式来处理手机应用下载图片,再处理成适当的尺寸,最后转换成asset发送到手表.
注意:数据单元Data Item被限制在100KB以内,而Assets则是没有限制的.但是传输大数据量的Assets会影响到用户体验,所以若是迫不得已必须传较大的Assets,要多测试.
Transfer an Asset
构建好了Assets,则可以通过PutDataRequest或PutDataMapRequest的方式传递数据
PutDataRequest:
private void transferAsset{
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataRequest request = PutDataRequest.create("/image");
request.putAsset("profileImage", asset);
Wearable.DataApi.putDataItem(mGoogleApiClient, request);
}
PutDataMapRequest:
private void transferAsset{
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
dataMap.getDataMap().putAsset("profileImage", asset)
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
}
Receive assets
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_CHANGED &&
event.getDataItem().getUri().getPath().equals("/image")) {
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
Bitmap bitmap = loadBitmapFromAsset(profileAsset);
// Do something with the bitmap
}
}
} public Bitmap loadBitmapFromAsset(Asset asset) {
if (asset == null) {
throw new IllegalArgumentException("Asset must be non-null");
}
ConnectionResult result =
mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (!result.isSuccess()) {
return null;
}
// convert asset into a file descriptor and block until it's ready
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
mGoogleApiClient, asset).await().getInputStream();
mGoogleApiClient.disconnect(); if (assetInputStream == null) {
Log.w(TAG, "Requested an unknown Asset.");
return null;
}
// decode the stream into a bitmap
return BitmapFactory.decodeStream(assetInputStream);
}
http://developer.android.com/training/wearables/data-layer/messages.html
3.Sending and Receiving Messages
可以通过MessageApi来发送以下两种数据:
- 任意类型的数据
- 拥有唯一键值对的消息动作
与DataItem的双向同步不同,message是单向的.Message通过单向的连接发送到另一端,这有利于远程调用(RPC - remote procedure calls).
Send a Message
以下是一个发送消息启动Activity的样例,在发送消息时,会阻塞线程,直到消息送达或者超时.
Node node; // the connected device to send the message to
GoogleApiClient mGoogleApiClient;
public static final START_ACTIVITY_PATH = "/start/MainActivity";
... SendMessageResult result = Wearable.MessageApi.sendMessage(
mGoogleApiClient, node, START_ACTIVITY_PATH, null).await();
if (!result.getStatus().isSuccess()) {
Log.e(TAG, "ERROR: failed to send Message: " + result.getStatus());
}
以下是获取所有的和Android Wear应用相连接的节点.
private Collection<String> getNodes() {
HashSet <String>results = new HashSet<String>();
NodeApi.GetConnectedNodesResult nodes =
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
for (Node node : nodes.getNodes()) {
results.add(node.getId());
}
return results;
}
Receive a Message
以下是接收消息的例子,与上一个发送消息的例子对应.在处理接收到的消息之前,需要使用MessageApi.addListener()注册监听器.具体在其他章节中有讲述.
@Override
public void onMessageReceived(MessageEvent messageEvent) {
if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) {
Intent startIntent = new Intent(this, MainActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startIntent);
}
}
Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收的更多相关文章
- Android Wear开发 - 卡片通知 - 第二节 : 自定义Wear卡片样式
一.前言说明 在上一节添加Android Wear通知特性我们实现了简单的Android Wear卡片拓展,但是默认提供给我们的多张卡片只能实现简单的文字展示,如果想要自定义布局,添加图片等等,则需要 ...
- Android Wear开发 - 卡片通知 - 第一节 : 添加Android Wear通知特性
一. 前言说明 Android Wear大部分显示形式是卡片的形式,而最简单地支持Android Wear方式就是用通知**Notification**.而实现最简单的,非高度自定义的通知,则只需要在 ...
- Android Wear开发
Android Wear从2014年3月发布到现在已经从1.0发展到2.0(目前还没正式发布).其产品定位也发化了巨大变化,因为Android Wear 1.0通讯方式只有蓝牙,限定了系统,比较依赖手 ...
- Android Wear 开发入门
大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下An ...
- IDEA搭建Android wear开发环境,Android wear,I'm comming!
随着google公布了android wear这个东西.然后又有了三星的gear,LG的G watch以及moto 360,苹果由公布了apple watch.未来可能在智能手表行业又有一场战争. 当 ...
- Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)
之所以将打包这一特殊的内容作为数据通讯的第零节,是因为如果没有通过配置打包的一些信息,则没有办法将手机端应用和手表端应用连接起来,则无法继续进行接下来的数据通讯的开发. 以下依然只针对Eclipse平 ...
- Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)
一. 前言 背景 一开始笔者在研究数据发送与接收的时候,看到Wear数据类DataMap除了可以put基本类型外,还有个fromBundle方法来构建一个DataMap对象.所以一口气的将原本功能上的 ...
- Android Wear开发 - 数据通讯 - 第一节 : 连接数据层
http://developer.android.com/training/wearables/data-layer/accessing.html Accessing the Wearable Dat ...
- Android Wear开发 - 数据通讯 - 第三节 : 事件处理
http://developer.android.com/training/wearables/data-layer/events.html 以下是本人在学习官方开发文档时的笔记,主要是翻译为主,并在 ...
随机推荐
- [CodeForce]356D Bags and Coins
已知有n个包,和总共s个钱币. n,s<=70000. 每个包可以装钱币,还可以套别的包.每个包中的钱数等于 所有套的包的钱数 加上 自己装的钱. 所有的钱都在包内. 问给定每个包中的钱数,输出 ...
- Eclipse中文语言包下载
Kepler .Juno . Indigo语言包: http://www.eclipse.org/babel/downloads.php 其他低版本Eclipse语言包下载: http://archi ...
- win7、xp下Meclipse SVN用户名修改
Meclipse SVN用户名修改,在网上查找后发现如下方法: 1.查看你的Eclipse中使用的是什么SVNInterface windows>preference>Team>SV ...
- R cannot be resolved to a variable
1. 检查Android 的SDK是否丢失需要重新下载,检查build path,把需要导入的JAR包确认都导入成功 2. 确保class没有import Android.R,注意是不能有Androi ...
- 用JS实现AJAX
用JS实现AJAX 准备工作:新建网站,建立两个页面,index.aspx和backstage.aspx, 在工程目录下新建一个文件夹命名和image,在这里添加一个loading.gif,模拟提 ...
- one way WebService
WSDL支持4种消息交换方式: 1)单向(One-way):服务端接收消息: 2)请求响应(Request-response):服务端点接收请求消息,然后发送响应消息: 3)要求应答(So ...
- php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
本篇文章是对php输出echo.print.print_r.printf.sprintf.var_dump的区别进行了详细的分析介绍,需要的朋友参考下 用.net开发已经5年了,最近突然想接触 ...
- Linux命令:chmod命令
chmod命令:改变文件或目录的存取权限 #权限代号 -r 文件被读取 4 -w 文件被写入 2 -x 文件被执行 1 #权限范围 -u 文件所有者 -g 文件所有者所在组 -o 其他 -a 全部 # ...
- SpringMVC4+thymeleaf3的一个简单实例(篇五:页面和MySql的数据交互-展示以及存储)
这一篇将介绍怎样把页面数据保存的MySQL数据库,并将数据库内容展示到页面上.首先做一个基础工作,添加以下jar到lib:1: mysql-connector-Java-5.1.40-bin.jar ...
- hdoj 2602(背包)
Problem D Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...