- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 Android Wear 构建一个表盘。表盘偶尔会向掌上电脑询问信息,这些信息将用于更新表盘。不幸的是,onDataChanged 和 onMessageReceived 只在表盘第一次加载时发生,再也不会发生(我可以切换到另一个表盘并返回,它会再次工作一次)
大部分样板文件都来 self 认为的例子。所以在表盘上我有
@Override
public void onCreate() {
Log.d(TAG, "onCreate - Creating service...");
super.onCreate();
initGoogleApiClient();
}
private void initGoogleApiClient() {
mApiClient = new GoogleApiClient.Builder(mContext)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
Log.d(TAG, "Calling connect on mApiClient...");
mApiClient.connect();
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
Log.d(TAG, "onMessageReceived: " + messageEvent.getPath() + " " + messageEvent.getData());
switch (messageEvent.getPath()) {
case "case 1":
Log.d(TAG,"some data was sent to us...");
if (!mApiClient.isConnected())
mApiClient.connect();
break;
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.d(TAG,"onConnected - adding Listeners");
Wearable.DataApi.addListener(mApiClient, this);
Wearable.MessageApi.addListener(mApiClient, this);
}
@Override
public void onConnectionSuspended(int i) {
Log.d(TAG,"onConnection suspended");
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.e(TAG,"onConnection failed");
}
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
Log.d(TAG, "onDataChanged");
for (DataEvent event : dataEventBuffer) {
if (event.getType() == DataEvent.TYPE_CHANGED && event.getDataItem().getUri().getPath().equals("/image")) {
Log.d(TAG, "Matched TYPE_CHANGED and /image");
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
Asset photoAsset = dataMapItem.getDataMap().getAsset("photo");
loadBitmapFromAsset(photoAsset);
}
}
}
在手持设备上,日志显示在加载表盘(它工作的地方)后的第一个实例和后续请求中,数据正在以相同的方式发送到可穿戴设备。不同之处在于后续请求,上面代码中没有任何日志记录发生,表明没有任何内容被触发。
关于如何发送数据的一些手持代码:
private void SendBitmap(final Bitmap bitmap) {
//snip - stuff to resize the bitmap
Log.d(TAG, "Resized image to " + cropped.getWidth() + "x" + cropped.getHeight());
final Bitmap croppedBitmap = cropped;
new Thread(new Runnable() {
@Override
public void run() {
if (!nodeConnected || !mGoogleApiClient.isConnected())
{
Log.d(TAG,"No node connected. Attempting connection for 5 seconds...");
mGoogleApiClient.blockingConnect(5, TimeUnit.SECONDS);
}
if (!nodeConnected)
{
Log.e(TAG, "Failed to connect to mGoogleApiClient within 5 seconds");
return;
}
if (mGoogleApiClient.isConnected()) {
Log.d(TAG, "Client is connected...");
Asset asset = createAssetFromBitmap(croppedBitmap);
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/image").setUrgent();
putDataMapRequest.getDataMap().clear(); //clear down current stuff
putDataMapRequest.getDataMap().putAsset("photo", asset);
putDataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis());
PutDataRequest request = putDataMapRequest.asPutDataRequest().setUrgent();
PendingResult<DataApi.DataItemResult> pendingResult =
Wearable.DataApi.putDataItem(mGoogleApiClient, request);
Log.d(TAG,"DataItem is put");
pendingResult.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
Log.d(TAG, "Sending task data: " + dataItemResult.getStatus().isSuccess());
}
});
}
else {
Log.w(TAG,"Client is NOT connected...");
}
}
}).start();
//send a message to trigger connection?
SendToDataLayerThread photoTrigger = new SendToDataLayerThread("case 1", "Photo sent...".getBytes());
photoTrigger.run();
Log.d(TAG, "Photo sent to the Google API");
}
private static Asset createAssetFromBitmap(Bitmap bitmap) {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
return Asset.createFromBytes(byteStream.toByteArray());
}
public class SendToDataLayerThread extends Thread {
String path;
byte[] message;
// Constructor to send a message to the data layer
SendToDataLayerThread(String p, byte[] msg) {
path = p;
message = msg;
}
public void run() {
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient)
.setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult nodes) {
for (final Node node : nodes.getNodes()) {
Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), path, message).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult) {
if (sendMessageResult.getStatus().isSuccess()) {
Log.d(TAG, "Message: {" + message + "} sent to: " + node.getDisplayName());
} else {
// Log an error
Log.d(TAG, "ERROR: failed to send Message");
}
}
});
}
}
});
}
}
我根据其他帖子尝试过的事情:
此时我很困惑。我确定我遗漏了一些明显的东西,但我不确定接下来要尝试什么......
最佳答案
经过一系列更改后,我最终让它工作了。在 wear 应用程序上,我得到了:
在 DataLayerListener.java 中:
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
Log.d(TAG, "onDataChanged");
GoogleApiClient mApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.build();
ConnectionResult result = mApiClient.blockingConnect(250, TimeUnit.MILLISECONDS);
if (!result.isSuccess()) {
Log.e(TAG, "Failed to connect to mApiClient when receiving image...");
}
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_CHANGED && event.getDataItem().getUri().getPath().equals("/myapp")) {
Log.d(TAG, "Matched TYPE_CHANGED and /myapp");
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
Asset photoAsset = dataMapItem.getDataMap().getAsset("photo");
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(mApiClient, photoAsset).await().getInputStream();
Bitmap background = BitmapFactory.decodeStream(assetInputStream);
Intent intent = new Intent("background");
intent.putExtra("message", background);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
}
}
}
在 list 中:
<service
android:name=".MyWatchFace"
android:label="@string/my_watch_face_name"
android:permission="android.permission.BIND_WALLPAPER">
<meta-data ... />
<meta-data ... />
<intent-filter>
<action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
<action android:name="android.service.wallpaper.WallpaperService" />
<category android:name="com.google.android.wearable.watchface.category.WATCH_FACE" />
</intent-filter>
</service>
<service android:name=".DataLayerListener">
<intent-filter>
<action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
<action android:name="com.google.android.gms.wearable.CAPABILITY_CHANGED" />
<action android:name="com.google.android.gms.wearable.CHANNEL_EVENT" />
<action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
<data
android:host="*"
android:path="/myapp"
android:pathPrefix="/myapp"
android:scheme="wear" />
</intent-filter>
</service>
表盘本身注册BroadcastReceivers来处理从DataLayerListener广播过来的消息。
我认为明显的变化才是最重要的一点……如果您遇到同样的问题,希望这能提供线索
关于android - onDataChanged 只调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38687501/
我正在尝试使用 Firebase 创建餐厅和酒吧的评级系统。到目前为止,我能够阅读和书写个人评分。我遇到的问题是,为了计算特定餐厅的平均评级,我需要获取存储的评级数量和存储的所有评级的总值(value
我正在为 Android Wear 构建一个表盘。表盘偶尔会向掌上电脑询问信息,这些信息将用于更新表盘。不幸的是,onDataChanged 和 onMessageReceived 只在表盘第一次加载
我使用这段代码来检查我的数据库中是否有特定数据: mDatabase.child("TempTransaction").child(MainActivity.User.getID()).addVa
这是我的代码: public ArrayList getArray() { final FirebaseDatabase database = FirebaseDatabase.getInst
我正在尝试数据项 APi,这是我的代码 mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionC
出于某种原因,当我在 fragment 中调用 getTitle() 时,它总是返回 null。似乎根本没有添加 ValueEventListener。 当我在监听器内调试或打印 title 的值时,
这个问题已经有答案了: Setting variable inside onDataChange in Firebase (singleValue Listener) (3 个回答) 已关闭 5 年前
这是我的ArrayAdapter: public class SackViewAdapter extends ArrayAdapter { private ArrayList postInfo
我正在尝试从用户帐户读取数据列表,如下所示: 但是 onDataChange 监听器没有被调用。 我想获取“checked”和“desc”的值;但是,当我添加如下所示的 ListenForSingle
尽管接收快照并在 onDataChange() 函数中将数据添加到 ArrayList 中,但该函数没有返回任何数据,但最终它返回 大小为 0 的 ArrayList。 List feed_data(
我正在我的 Android 应用中实现 Firebase。 我有两种方法可以执行一些同步操作。方法A:查询事物列表。方法B:执行写入和读取。 方法一: final Firebase ref = sFi
我正在尝试从我的 Firebase 数据库中获取数据我有两个 fragment ,一个用于注册,另一个用于登录我在将数据插入 Firebase 时没有问题,但不知何故我无法从中返回数据 这些是我登录
我正在努力使用 onDataChange 访问从数据库返回的信息。我知道这是由于其异步性质,但我需要将这些值存储在某处以便在代码完成后访问。 我在 Firebase 数据库中存储了一个 user 子级
我有一个用于测试 Firebase 的基本程序。我有 2 个按钮:第一个是写入 Firebase 数据库“a”,第二个是写入“b”,我正在使用服务检查它们: myRef.addValueEventLi
如果我的数据库仍在加载,则显示加载对话框。我想让我的聊天应用程序正常工作。我发现我的问题将通过覆盖 FirebaseRecyclerAdapter 中的 onDataChanged() 来解决,如下面
这个问题在这里已经有了答案: getContactsFromFirebase() method return an empty list (1 个回答) 关闭 4 年前。 我有一个 boolean
我想问问是否有人可以为我解决这个问题..因为我一直在搜索并尝试自己修复它但是..没有.. 这是我的 logcat 错误: E/AndroidRuntime: FATAL EXCEPTION: main
我有一个应用程序,我在其中使用 firebase 来存储我的数据。 我的数据在使用 OnDataChange 方法的 fragment 中检索,我在单独的 Activity 中将数据添加到我的 fir
关于 Firebase ValueEventListener,我遇到了一个非常奇怪的情况。 当手机连接到互联网时,它工作正常。但是当它离线时,它不会调用 onDataChange。 这段代码即使在离线
我正在尝试从 firebase 数据库检索数据,当您进入应用程序并且从不监听 OnDataChange 时调用此方法。如果我将新图像上传到 firebase,则会调用 OnDataChange 并显示
我是一名优秀的程序员,十分优秀!