在移动设备和磨损之间同步数据项

时间:2018-02-22 06:43:13

标签: android

我正在尝试在我的移动设备和我的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();

    }
}

也许我必须为清单文件添加权限,但我在网上找不到任何内容。如果你们中的一个人可以帮助我,那会非常酷。感谢。

1 个答案:

答案 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):

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