我正在尝试在我的移动设备和我的Wear之间同步数据。但没有任何成功。我认为我做了所有事情from the developer docs。
这是我的移动代码的MainActivity:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.wearable.DataClient;
import com.google.android.gms.wearable.DataItem;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
Button button;
private static final String COUNT_KEY = "com.example.torbengab.sendwatchmessage";
DataClient mDataClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendStuff();
}
});
}
private void sendStuff() {
mDataClient = Wearable.getDataClient(this);
PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/message").setUrgent();
putDataMapReq.getDataMap().putInt(COUNT_KEY, 123);
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest().setUrgent();
Task<DataItem> putDataTask = mDataClient.putDataItem(putDataReq);
putDataTask.addOnSuccessListener(new OnSuccessListener<DataItem>() {
@Override
public void onSuccess(DataItem dataItem) {
Toast.makeText(getApplicationContext(), "sending :)", Toast.LENGTH_LONG).show();
}
});
}
}
我正在获取putDataTask.addOnSuccessListener onSuccess回调。所以我认为这部分工作正常。 这是Wear Project MainActivity:
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.wearable.activity.WearableActivity;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.wearable.CapabilityClient;
import com.google.android.gms.wearable.CapabilityInfo;
import com.google.android.gms.wearable.DataClient;
import com.google.android.gms.wearable.DataEvent;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.DataItem;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.DataMapItem;
import com.google.android.gms.wearable.MessageClient;
import com.google.android.gms.wearable.MessageEvent;
import com.google.android.gms.wearable.Wearable;
public class MainActivity extends WearableActivity implements DataClient.OnDataChangedListener,
MessageClient.OnMessageReceivedListener,
CapabilityClient.OnCapabilityChangedListener {
private TextView mTextView;
private static final String COUNT_KEY = "com.example.torbengab.sendwatchmessage";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text);
// Enables Always-on
setAmbientEnabled();
}
@Override
protected void onResume() {
super.onResume();
// Instantiates clients without member variables, as clients are inexpensive to create and
// won't lose their listeners. (They are cached and shared between GoogleApi instances.)
Wearable.getDataClient(this).addListener(this);
Wearable.getMessageClient(this).addListener(this);
Wearable.getCapabilityClient(this)
.addListener(
this, Uri.parse("wear://"), CapabilityClient.FILTER_REACHABLE);
}
@Override
protected void onPause() {
super.onPause();
Wearable.getDataClient(this).removeListener(this);
Wearable.getMessageClient(this).removeListener(this);
Wearable.getCapabilityClient(this).removeListener(this);
}
@Override
public void onDataChanged(@NonNull DataEventBuffer dataEventBuffer) {
Toast.makeText(getApplicationContext(), "yey", Toast.LENGTH_LONG).show();
for (DataEvent event : dataEventBuffer) {
if (event.getType() == DataEvent.TYPE_CHANGED) {
// DataItem changed
DataItem item = event.getDataItem();
if (item.getUri().getPath().compareTo("/message") == 0) {
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
Toast.makeText(getApplicationContext(), String.valueOf(dataMap.getInt(COUNT_KEY)), Toast.LENGTH_LONG).show();
}
} else if (event.getType() == DataEvent.TYPE_DELETED) {
// DataItem deleted
}
}
}
@Override
public void onCapabilityChanged(@NonNull CapabilityInfo capabilityInfo) {
Toast.makeText(getApplicationContext(), "yey", Toast.LENGTH_LONG).show();
}
@Override
public void onMessageReceived(@NonNull MessageEvent messageEvent) {
Toast.makeText(getApplicationContext(), "yey", Toast.LENGTH_LONG).show();
}
}
也许我必须为清单文件添加权限,但我在网上找不到任何内容。如果你们中的一个人可以帮助我,那会非常酷。感谢。
答案 0 :(得分:1)
我设法通过以下三个步骤使其工作:
1。接收方实现CHANGE侦听器
因此putDataMapReq.getDataMap().putInt(COUNT_KEY, 123);
仅工作一次。
每次调用123
方法时,都需要更改值sendStuff()
。
2。移动和磨损这两个模块都必须在build.gradle文件中设置非常相同的应用程序ID
android { defaultConfig { applicationId "com.example.myapp" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } ... }
https://developer.android.com/studio/build/application-id
3。移动和穿戴这两个模块必须具有相同的签名
您需要
a)生成一个上传密钥和密钥库
在菜单栏中,单击构建>构建>生成签名包/ APK。
在“生成签名包或APK”对话框中,选择“ Android App Bundle”或“ APK”,然后单击“下一步”。
在“密钥存储路径”字段下,单击“新建”。
在“新密钥库”窗口中,提供有关密钥库和密钥的信息
b)用密钥签名您的应用
如果您当前尚未打开“生成签名包或APK”对话框,请单击“构建”>“生成签名包/ APK”。
在“生成已签名的捆绑包或APK”对话框中,选择“ Android App Bundle”或“ APK”,然后单击“下一步”。
从下拉菜单中选择一个模块。
指定密钥库的路径,密钥的别名,然后输入两者的密码。
并且因为一旦更改代码,签名就会失效
c)配置构建过程以自动对您的应用进行签名
在“项目”窗口中,右键单击您的应用,然后单击“打开模块设置”。
在“项目结构”窗口的左侧面板中的“模块”下,单击要签名的模块。
单击“签名”选项卡,然后单击“添加”。
选择密钥库文件,为此签名配置输入一个名称(您可能会创建多个),然后输入所需的信息。
单击“构建类型”选项卡。
单击发布版本。
在“签名配置”下,选择刚创建的签名配置。
最后您应该
d)从构建文件中删除签名信息
在这里有很好的记录(所有步骤a-d):