WearableListenerService doesn't receive data

885 views Asked by At

I'm trying to send sensor data from my wear device to the handheld. The problem is that the onMessageReceived function of my WearableListenerService is never called, even though it gets created. The package names of the wear and mobile apps are the same, also here's the entry for the service in the manifest file:

<service
    android:name=".WatchDataReceiver"
    android:enabled="true"
    android:exported="true" >
</service>

On my handheld in the MainActivity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        startService(new Intent(this, WatchDataReceiver.class));

        setContentView(R.layout.activity_fullscreen);
        ...
}

On my handheld, the service:

public class WatchDataReceiver extends WearableListenerService {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(WatchDataReceiver.class.getSimpleName(), "WEAR create");
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        Log.i(WatchDataReceiver.class.getSimpleName(), "WEAR Data changed " );
    }

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        Log.i(WatchDataReceiver.class.getSimpleName(), "WEAR Message " + messageEvent.getPath());
    }
}

On the watch/wear:

 public class MainActivity extends Activity implements SensorEventListener {

    private static final String LOG_TAG = "Watch: ";

    private SensorManager   sensorManager;
    private Sensor          accelerometer;

    private GoogleApiClient mGoogleApiClient;
    private String msg = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
        stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
            @Override
            public void onLayoutInflated(WatchViewStub stub) {
                mTextView = (TextView) stub.findViewById(R.id.text);
            }
        });

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);

        if (accelerometer != null) {
            Log.v(LOG_TAG, "Accelerometer registered!");
        }
        else {
            Log.v(LOG_TAG, "Accelerometer _not_ registered!");
        }

        mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(Wearable.API).build();
        mGoogleApiClient.connect();
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER && event.values.length > 0) {
            double value_x = event.values[0];
            double value_y = event.values[1];
            double value_z = event.values[2];

            msg = Double.toString(value_x) + ";" + Double.toString(value_y) + ";" + Double.toString(value_z);
            sendMessageToHandheld(msg);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        //TODO
    }

    private void sendMessageToHandheld(String msg) {
        if (mGoogleApiClient == null)
            return;

        final String message = msg;

        Log.d(LOG_TAG,"sending a message to handheld: "+message);

        // use the api client to send the heartbeat value to our handheld
        final PendingResult<NodeApi.GetConnectedNodesResult> nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient);
        nodes.setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
            @Override
            public void onResult(NodeApi.GetConnectedNodesResult result) {
                final List<Node> nodes = result.getNodes();
                if (nodes != null) {
                    for (int i=0; i<nodes.size(); i++) {
                        final Node node = nodes.get(i);
                        Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), message, null);
                    }
                }
            }
        });
    }
}

According to LogCat the correct handheld is found because in sendMessageToHandheld right after the actual sendMessage it do a Log.d with the name of the node. What am I missing?

1

There are 1 answers

3
Nicolas POMEPUY On BEST ANSWER

You have to add this IntentFilter to your service:

<intent-filter>
    <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>

It tells the system to take care of the Service lifecycle (ie starting it if needed).