我一直在尝试将数据推送到android服装模拟器.但一切都是徒劳的.我在仿真器上的监听器没有收到任何呼叫.如果其他人尝试过磨损和推送数据,请帮助.
这是我的接收器代码的样子
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrcode_generation);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
ivQrImage = (ImageView) stub.findViewById(R.id.ivQRImage);
}
});
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_CHANGED &&
event.getDataItem().getUri().getPath().equals("/image")) {
final DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
final Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
final Bitmap bitmap = loadBitmapFromAsset(profileAsset);
Log.d(TAG, ""+bitmap);
if …Run Code Online (Sandbox Code Playgroud) 我正在测试可穿戴数据层Api,如Android教程中所述.
有一个低级API DataItem,它只能有一个字节数组作为有效负载,因此训练建议使用PutDataMapRequest,这似乎基本上等于Bundle使用Intents时的(即可序列化的映射).您基本上创建了此类的实例,然后填充值并发送它.
private final static String DATA_PATH = "/testdata";
PutDataMapRequest dataMap = PutDataMapRequest.create(DATA_PATH);
dataMap.getDataMap().putInt(...);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(mGoogleApiClient, request);
pendingResult.setResultCallback(...);
Run Code Online (Sandbox Code Playgroud)
现在,我想检查这些数据是否存储正确(对于测试,在掌上电脑本身,我现在不关心可穿戴设备).适当的方法是在DataApi课堂上,所以我可以打电话:
PendingResult<DataApi.DataItemResult> pending;
pending = Wearable.DataApi.getDataItem(mGoogleApiClient, uri);
pending.setResultCallback(...);
Run Code Online (Sandbox Code Playgroud)
然后DataMapItem.fromDataItem()在回调内部使用以获取值.
问题是:请求DataItemResult的实际Uri是什么?
存储数据,因为如果我使用Wearable.DataApi.getDataItems(mGoogleApiClient)迭代所有存储的数据,它确实存在,并且Uri是:
"wear://<some guid here>/testdata"
Run Code Online (Sandbox Code Playgroud)
并使用此Uri DataApi.getDataItem()返回正确的结果.但我对如何生成它一无所知,因为我只使用该/testdata部件来创建PutDataRequest...
或者我做错了什么?
我刚刚学习如何开发Android Wear,我已经为智能手表创建了一个全屏活动,在我的应用程序的移动部分,我获得了一些JSON数据,并从中创建了一个自定义对象列表.
在我的移动应用程序中,我在ListView中显示这些对象的信息.
在我的应用程序的Wear部分,我想显示此列表的限制版本,例如列表中的前3个将显示在Wearable上的全屏应用程序上.
我的问题是,似乎没有办法将Parcelable Objects发送到Android Wear,因此在DataItem中没有putParcelable选项.
看起来唯一的选择是以字节为单位发送对象,如下所示:
public void sendWearableData(GoogleApiClient aGoogleApiClient, ArrayList<MyObject> myObjectList, String path)
{
googleApiClient = aGoogleApiClient;
byte[] testBytes = new byte[0];
if (googleApiClient.isConnected()) {
PutDataMapRequest dataMapRequest = PutDataMapRequest.create(path);
try {
testBytes = BytesUtils.toByteArray(myObjectList);
} catch (IOException e) {
e.printStackTrace();
}
dataMapRequest.getDataMap().putByteArray(Constants.TEST_KEY, testBytes);
PutDataRequest request = dataMapRequest.asPutDataRequest();
Wearable.DataApi.putDataItem(googleApiClient, request);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我必须将我的对象转换为字节,将其发送到Android Wear并将其转换回来?这意味着我已经实现了Parcelable的对象,所以我现在可以通过Intents发送它们也需要实现Serializable,这是正确的还是有更好的方法呢?
android serializable parcelable android-wear-data-api wear-os
我开发了一个Android的应用程序.下面的代码解释了问题
if(mGoogleApiClient.isConnected()){
K.i("Always called!");
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult nodes) {
K.i("Never called :( ");
for (Node node : nodes.getNodes()) {
Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), message, null);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
UPD:我通过关闭来解决问题并再次开启我的手机(Nexus 5)可能有更简单的方法来解决问题吗?
试图添加.await()和AsyncTask,但结果是一样的
我今天一整天都在与Android Wear Message API作斗争,并且终于接受了我需要一些帮助.
我的应用程序非常简单.Mobile部分包含一个MainActivity(除了显示"Hello world"和一个扩展WearableListenerService的Service .)Wear部分只是一个带有单个Button的MainActivity,并实现了MessageApi.MessageListener.
这个想法很简单:按下Wear设备上的按钮,该按钮向Mobile发送消息.当移动设备收到消息时,它会显示带有发件人消息路径的Toast (例如/ mobile).执行此操作后,Mobile应立即使用我的reply()方法将消息发送回 Wear设备.我想做的就是记录这条消息.
我可以完美地完成第一部分.当按下按钮时,手机会弹出一个叫"/ mobile"的Toast.然而,答案似乎只是在以太中迷失了; 没有错误,但也没有消息.
有人可以帮我理解我做错了什么吗?我在下面粘贴了我的文件.
这是我关注的教程.干杯!
package org.thecosmicfrog.toastdroidmessageapitutorial;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.wearable.view.WatchViewStub;
import android.util.Log;
import android.view.View;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.MessageEvent;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.Wearable;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class MainActivity extends Activity implements MessageApi.MessageListener {
private final String LOG_TAG = MainActivity.class.getSimpleName();
private static final long CONNECTION_TIME_OUT_MS = 100; …Run Code Online (Sandbox Code Playgroud) 我想在手持设备和可穿戴设备之间同步偏好.我在手持app上实现了示例代码.
PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
dataMap.getDataMap().putInt(COUNT_KEY, count++);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
System.out.println(dataMap.getDataMap().getInt("COUNT_KEY"));//print 3
Run Code Online (Sandbox Code Playgroud)
然后在可穿戴应用上实现以下代码.但无法检索已保存的计数.
PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
int count = dataMap.getDataMap().getInt("COUNT_KEY");
System.out.println(count);//print 0
Run Code Online (Sandbox Code Playgroud)
我试过在Android的实际Android手持设备和模拟器中穿.我确认他们是通过使用Android Wear应用程序的演示卡连接的.
我需要什么或者我误解了什么?
我想在Android Wear和Handheld之间进行双向数据传输.除了在Handheld上触发onDataChanged之外,一切似乎都很好.它触发后才插入\拔出USB线,连接到PC.所以我不明白为什么会这样.
这是我的代码:
Handheld上的WearListenerService:
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataEvent;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.DataMapItem;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
import com.google.android.gms.wearable.WearableListenerService;
import java.util.List;
import ru.orangesoftware.financisto.db.DatabaseAdapter;
import ru.orangesoftware.financisto.model.Category;
import ru.orangesoftware.financisto.model.CategoryTree;
import ru.orangesoftware.financisto.utils.Log;
public class WearService extends WearableListenerService implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener
{
private static final String WEARABLE_DATA_PATH = "/wearable_data";
private static final String HANDHELD_DATA_PATH = "/handheld_data";
private SendToDataLayerThread s;
GoogleApiClient googleClient;
private DatabaseAdapter db;
@Override
public void …Run Code Online (Sandbox Code Playgroud) 当我尝试构建我的apk时,它给了我错误的说法
错误:(190)错误:不推荐使用com.google.android.gms.wearable.BIND_LISTENER操作.
这是我的AndroidManifest现在的样子
<service
android:name=".MyDeviceListenerService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action
android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
</intent-filter>
</service
Run Code Online (Sandbox Code Playgroud) 尝试从模拟的移动设备向模拟的佩戴设备发送消息.我可以通过Android Wear应用程序配对磨损设备,并验证onPeerConnected磨损设备是否被击中(onMessageReceived不是).
使用两个代码版本将node.getId()结果返回到磨损设备的两个不同ID.
运行这个:
new Thread(new Runnable() {
@Override
public void run() {
NodeApi.GetLocalNodeResult nodes = Wearable.NodeApi.getLocalNode(mGoogleApiClient).await();
Node node = nodes.getNode();
MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), "Hello Watch 1", null).await();
if (!result.getStatus().isSuccess()) {
Log.e(getPackageName(), "error");
} else {
Log.i(getPackageName(), "success!!!! sent to: " + node.getId());
}
}
}).start
Run Code Online (Sandbox Code Playgroud)
返回:08-09 10:24:33.106 17914-18007/com.wear.myapp I/com.wear.myapp:成功!!!! 发送至:223faf0e
运行这个:
new Thread(new Runnable() {
@Override
public void run() {
NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
for (Node node : nodes.getNodes()) …Run Code Online (Sandbox Code Playgroud) 我有一个WearableListenerService手机应用程序DataItem从手表接收(在onDataChanged).代码与文档中的代码基本相同(如果有用,我可以把它放在这里).
当一个新DataItem收到,我展示给手机上的用户的通知.
它适用于Android 5,无论应用程序是运行还是被杀死.如果应用程序正在运行/在内存中,它也可以在Android O API 26上运行,但如果我先杀掉应用程序(通过滑动),WearableListenerService它也不会运行:那么它不会运行.
我知道Android 8上的后台执行限制,但我不知道如何在这种情况下处理它们,因为它的Android应该在我的应用程序处于后台时启动服务,以便我可以对数据层更改做出反应.
在应用程序处于后台时,有没有办法在Android 8上侦听数据层事件?