移动设备和可穿戴设备之间如何同步数据项?

5
我正在尝试在我的移动设备和手表之间同步数据,但一直没有成功。我认为我已经按照开发者文档(链接)中的步骤进行了操作。
这是我移动端代码的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项目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();

    }
}

也许我需要在清单文件中添加权限,但我在网上找不到相关信息。如果你们中的任何一个人能帮助我,那就太棒了。谢谢。

你有什么解决办法吗? - jomin v george
1个回答

6
I managed to get it working with these 3 steps:
1. 接收方实现一个CHANGE监听器。
因此,putDataMapReq.getDataMap().putInt(COUNT_KEY, 123);只能工作一次。每次调用sendStuff()方法时,您需要更改123的值。
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) 生成上传密钥和密钥库

  • 在菜单栏中,单击“Build”>“Build”>“Generate Signed Bundle/APK”。

  • 在“Generate Signed Bundle or APK”对话框中,选择“Android App Bundle”或“APK”,然后单击“Next”。

  • 在“Key store path”字段下方,单击“Create new”。

  • 在“New Key Store”窗口中,提供密钥库和密钥的信息

b) 使用您的密钥签署应用程序

  • 如果您当前没有打开“Generate Signed Bundle or APK”对话框,请单击“Build”>“Generate Signed Bundle/APK”。

  • 在“Generate Signed Bundle or APK”对话框中,选择“Android App Bundle”或“APK”,然后单击“Next”。

  • 从下拉列表中选择一个模块。

  • 指定密钥库的路径、密钥的别名,并输入两者的密码。

因为只要代码被更改,签名就会失效。

c) 配置构建过程以自动签署您的应用程序

  • 在项目窗口中,右键单击您的应用程序,然后单击“打开模块设置”。

  • 在“项目结构”窗口中,在左侧面板的“模块”下,单击要签名的模块。

  • 单击“签名”选项卡,然后单击“添加”。

  • 选择密钥库文件,输入此签名配置的名称(因为您可能会创建多个),并输入所需信息。

  • 单击“生成类型”选项卡。

  • 单击“发布版本”。

  • 在“签名配置”下,选择刚刚创建的签名配置。

最后,您应该

d) 从您的构建文件中删除签名信息

这里有非常详细的文档(所有步骤 a-d):

https://developer.android.com/studio/publish/app-signing


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接