向Android Wear设备发送数据

5

我想将一个String数组从我的手机发送到我的手表, 我在手机上创建了一个服务,使用以下代码发送数据:

public class SendDataService extends Service {

private static final String TAG = "SendDataService";

@Override
public void onCreate(){
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.d(TAG, "onConnected: " + connectionHint);
                    // Now you can use the data layer API
                }
                @Override
                public void onConnectionSuspended(int cause) {
                    Log.d(TAG, "onConnectionSuspended: " + cause);
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult result) {
                    Log.d(TAG, "onConnectionFailed: " + result);
                }
            })
            .addApi(Wearable.API)
            .build();
    mGoogleApiClient.connect();
    String[] eventStrings = Events.eventsString(Events.readCalendarEvent(this));
    PutDataMapRequest dataMap = PutDataMapRequest.create("/events");
    dataMap.getDataMap().putStringArray("events", eventStrings);
    PutDataRequest request = dataMap.asPutDataRequest();
    PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
            .putDataItem(mGoogleApiClient, request);
    mGoogleApiClient.disconnect();
}

我试图通过以下代码在我的主活动中获取手表信息:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_agenda_wear);
    this.context = this;
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.d(TAG, "onConnected: " + connectionHint);
                    // Now you can use the data layer API
                }
                @Override
                public void onConnectionSuspended(int cause) {
                    Log.d(TAG, "onConnectionSuspended: " + cause);
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult result) {
                    Log.d(TAG, "onConnectionFailed: " + result);
                }
            })
            .addApi(Wearable.API)
            .build();
    mGoogleApiClient.connect();


    PendingResult<DataItemBuffer> results = Wearable.DataApi.getDataItems(mGoogleApiClient);
    results.setResultCallback(new ResultCallback<DataItemBuffer>() {
        @Override
        public void onResult(DataItemBuffer dataItems) {
            if (dataItems.getCount() != 0) {
                DataMapItem dataMapItem = DataMapItem.fromDataItem(dataItems.get(0));

                // This should read the correct value.
                AgendaWear.this.eventString = dataMapItem.getDataMap().getStringArray("events");
            }

            dataItems.release();
        }
    });
    mGoogleApiClient.disconnect();
    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            if (AgendaWear.this.eventString == null){
                Toast.makeText(AgendaWear.this, "No data",Toast.LENGTH_LONG).show();
                AgendaWear.this.eventString = new String[0];
            }
            AgendaWear.listItems = eventArray(AgendaWear.this.eventString);
            mListView = (WearableListView) stub.findViewById(R.id.listView);
            mListView.setAdapter(new MyAdapter(AgendaWear.this));
            mListView.setClickListener(AgendaWear.this);
        }
    });
}
很遗憾,我总是收到“没有数据”的提示,现在有点卡住了。我在应用程序的手表和移动部分都有这一行:<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> ,但似乎没有收到任何数据。非常感谢您的帮助。
1个回答

7
也许我能提供帮助。 这段代码对我有效,从设备发送一个字符串数组到可穿戴设备进行接收: 设备代码:
@Override
public void onCreate() {

    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Wearable.API)
            .build();

    googleApiClient.connect();
}    


@Override
public void onConnected(Bundle bundle) {

  String [] myData = new String[]{"data1", "data2", "data3"};
  new DataTask (getActivity(), myData, myListener).execute();
}


class DataTask  extends AsyncTask<Node, Void, Void> {

    private final String[] contents;
    private MyListener myListener;
    Context c;

    public DataTask (Context c, String [] contents, MyListener myListener) {
        this.c = c;
        this.contents = contents;
        this.myListener = myListener;
    }

    @Override
    protected Void doInBackground(Node... nodes) {

        PutDataMapRequest dataMap = PutDataMapRequest.create ("/myapp/myevent");
        dataMap.getDataMap().putStringArray("contents", contents);

        PutDataRequest request = dataMap.asPutDataRequest();

        DataApi.DataItemResult dataItemResult = Wearable.DataApi
                .putDataItem(googleApiClient, request).await();


        Log.d ("[DEBUG] SendDataCoolTask - doInBackground", "/myapp/myevent" status, "+getStatus());
        return null;
    }
}
可穿戴编码:
@Override
public void onConnected(Bundle bundle) {

    Wearable.DataApi.addListener(googleApiClient, this);
}

    @Override
public void onDataChanged(DataEventBuffer dataEvents) {

    for (DataEvent event: dataEvents) {

        Log.d("[DEBUG] DeviceService - onDataChanged",
                "Event received: " + event.getDataItem().getUri());

        String eventUri = event.getDataItem().getUri().toString();

        if (eventUri.contains ("/myapp/myevent")) {

            DataMapItem dataItem = DataMapItem.fromDataItem (event.getDataItem());
            String[] data = dataItem.getDataMap().getStringArray("contents");

            Log.d("[DEBUG] DeviceService - onDataChanged", "Sending timeline to the listener");

            myListener.onDataReceived(data);
        }
    }
}

谢谢您的回答,但我仍然有一些不明白的地方。在您的设备代码中,nodeListener和TIME_LINE_DATA是什么?当您将字符串数组放入内容中时,如何调用它? 在您的移动代码中,这应该像我一样在addconnectioncallback中吗? - Quentin Menini
我做了一些更改,关于_addConnectionCallbacks_,我的类正在实现该接口,当_onConnected_被调用时,在设备上会调用datatTask,在可穿戴设备上会订阅dataListener。 - saulmm
我还有几个问题,我需要创建一个名为MyListener的类吗?我需要在其中放什么?我应该把这个类放在手表上还是手机上?我该如何在手表端初始化它? 另外,在设备代码中有一个名为status的符号从未被初始化,你该如何初始化它? 非常感谢您的帮助,我觉得我离成功更近了。 - Quentin Menini
我已经成功地将它工作起来了,没有使用MyListener,非常感谢你的帮助。 - Quentin Menini
9
我尝试了一切但无法让这段代码起作用。手机客户端显示 "D/[DEBUG] SendDataCoolTask - doInBackground﹕ /myapp/myevent statusStatus{statusCode=SUCCESS, resolution=null}",但可穿戴设备未触发 onDataChanged 事件。我知道我已为此附加了监听器。 - Marc
@Marc,你确定GoogleApiClient已连接并添加了监听器吗——在你从手机发送数据的时候。当您的应用程序未运行且未连接和侦听时,似乎不会为从移动设备发送的事件调用onDataChanged()。请参阅我的答案:https://dev59.com/jofca4cB1Zd3GeqPdg39#32707248 - phreakhead

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