从可穿戴设备访问应用内容提供商

时间:2016-02-08 22:19:35

标签: android wear-os android-wear-data-api

我正在研究udacity可穿戴课程,无法让我的可穿戴模拟器将dataEvents发送到可穿戴设备。

在掌上电脑和可穿戴设备上,我都有扩展WearableListenerService(WLS)的服务。手持设备版本目前通过活动中的startService呼叫启动,可穿戴服务也通过startService在表盘服务中启动,两种服务都可以看作已启动。

设备WLS成功调用内容提供程序并尝试将数据发送到可穿戴设备,但永远不会调用putDataItem resultCallback。

可穿戴设备似乎与我的手机配对,因为我从手机上收到了各种通知,所以设置很好。手持式和可穿戴式模块都将服务添加到清单中,并带有所需的intent-filter,并且通过日志记录,我可以看到它们都按预期启动。

我关注的是docs,但我必须遗漏一些东西。

感谢您的帮助。

手持服务

public class WeatherDataService extends WearableListenerService implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    private static final String TAG = "HandheldService";
    private GoogleApiClient mGoogleClientApi;

    @Override
    public void onCreate() {
        super.onCreate();

        Log.d(TAG, "initializing");
        mGoogleClientApi = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        mGoogleClientApi.connect();
    }

    @Override
    public void onPeerConnected(Node peer) {
        super.onPeerConnected(peer);
        Log.d(TAG, "onPeerConnected: " + peer.getDisplayName());

        String[] temps = getCurrentTemps();

        if (temps != null && temps.length == 2) {
            Log.d(TAG, String.format("onPeerConnected: temps %s %s", temps[0], temps[1]));
            notifyWearables(mGoogleClientApi, temps[0], temps[1]);
        }
    }

    private void notifyWearables(GoogleApiClient client, String low, String high) {
        Log.d(TAG, String.format("notifyWearables: %s %s", low, high));
        PutDataMapRequest map = PutDataMapRequest.create("/weather");
        map.getDataMap().putString("tempLow", low);
        map.getDataMap().putString("tempHigh", high);

        PutDataRequest request = map.asPutDataRequest();
        Wearable.DataApi.putDataItem(client, request).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
            @Override
            public void onResult(DataApi.DataItemResult result) {
                Log.d(TAG, String.format("onResult, %s", result.getStatus().getStatusMessage()));
                if (!result.getStatus().isSuccess()) {
                    Log.d(TAG, "onResult: Failed to send data");
                }
            }
        });



    ...
}

可穿戴服务

public class WeatherDataService extends WearableListenerService {

    private static final String TAG = "Wearable:Service";

    @Override
    public void onCreate() {
        super.onCreate();
        // this is called
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        // NEVER makes it here
        Log.d(TAG, "onDataChanged: ");
        for (DataEvent dataEvent : dataEvents) {
            Log.d(TAG, "onDataChanged: " + dataEvent.getDataItem().getUri().getPath());
            if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
                Log.d(TAG, "onDataChanged: TYPE_CHANGED");
                DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
                String path = dataEvent.getDataItem().getUri().getPath();
                if (path.equals("/weather")) {
                    Log.d(TAG, "onDataChanged: /weather");
                    String tempLow = dataMap.getString("tempLow");
                    String tempHigh = dataMap.getString("tempHigh");

                    Log.d(TAG, "onDataChanged: " + tempLow + " " + tempHigh);
                }
            }
        }
    }
}

更新

我错过了mGoogleApiClient.connect()方法调用。现在正在调用putDataItem resultCallback,不幸的是,没有调用可穿戴设备的onDataChanged事件。

2 个答案:

答案 0 :(得分:0)

onDataChanged

不会调用,因为您不会更改每次发送的任何数据(只有在数据确实发生变化时才会调用),尝试发送不同的数据并且它会起作用,并确保连接您的mGoogleClientApi 在onStrart();

答案 1 :(得分:0)

事实证明,事情有些不对劲。

第一个是@mahmoud提到的,虽然我第一次读它时错过了它,因为需要调用mGoogleClientApi.connect()。当@mahmoud表示在onStart()中连接到客户端时,我没有读取它作为调用.connect()方法。

错误的第二件事是清单package属性与每个模块不匹配。我认为他们需要相同的父命名空间。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.sunshine.app">