0

我想将数据从我的 Wear 发送到 PhoneApp。我用这个 AndroidManifest.xml 创建了一个手机应用程序

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sh.evolutio.car">

    <uses-feature
        android:name="android.software.leanback"
        android:required="true" />

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <service android:name=".services.ListenerService" >
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
                <action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
                <!-- <data android:scheme="wear" android:host="*" android:pathPrefix="/updatecar" /> -->
            </intent-filter>
        </service>

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我的监听服务:

package sh.evolutio.car.services;

import android.content.Intent;
import android.util.Log;

import com.google.android.gms.wearable.MessageEvent;
import com.google.android.gms.wearable.WearableListenerService;

public class ListenerService extends WearableListenerService {
  private static final String TAG = "ListenerService";
  private static final String MESSAGE_PATH = "/updatecar";

  @Override
  public void onCreate() {
      Log.d(TAG, "ListenerService created");
  }

  @Override
  public void onMessageReceived(MessageEvent messageEvent) {
      Log.d(TAG, "onMessageReceived");

      if (messageEvent.getPath().equals(MESSAGE_PATH)) {
          Log.d(TAG, "good message");
      } else {
          Log.d(TAG, "bad message");
      }
  }
}

我的 MainActivity 与此 onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);

  startService(new Intent(MainActivity.this, ListenerService.class));
}

当我在手机上启动应用程序时,我进入了 Logcat:

26131-26131/sh.evolutio.car D/ListenerService: ListenerService created

当我使用 wearapp 向手机发送一些数据时,我的 ListenerService 没有触发 onMessageReceived 方法。

这是来自wearapp的我的AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="sh.evolutio.carwear">

  <uses-feature android:name="android.hardware.type.watch" />

  <uses-permission android:name="android.permission.WAKE_LOCK" />

  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@android:style/Theme.DeviceDefault">
    <uses-library
      android:name="com.google.android.wearable"
      android:required="true" />
    <meta-data
      android:name="com.google.android.wearable.standalone"
      android:value="false" />

    <activity
      android:name=".MainActivity"
      android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

wearapp 中的 MainActivity 如下所示:

package sh.evolutio.carwear;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.wearable.activity.WearableActivity;
import android.util.Log;
import android.view.View;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.Wearable;

public class MainActivity extends WearableActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
  private static String TAG = "MainActivity";
  private static final String MESSAGE_PATH = "/updatecar";

  Node mNode; // the connected device to send the message to
  GoogleApiClient mGoogleApiClient;
  private boolean mResolvingError = false;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Connect the GoogleApiClient
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    sendMessage("test");

    // Enables Always-on
    setAmbientEnabled();
  }

  @Override
  protected void onStart() {
    super.onStart();
    if (!mResolvingError) {
      mGoogleApiClient.connect();
    }
  }

  /**
    * Resolve the node = the connected device to send the message to
    */
  private void resolveNode() {
    Log.d(TAG, "resolveNode");

    Wearable.NodeApi.getConnectedNodes(mGoogleApiClient)
      .setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
        @Override
        public void onResult(NodeApi.GetConnectedNodesResult nodes) {
          for (Node node : nodes.getNodes()) {
            Log.d(TAG, "resolvedNode: " + node);
            mNode = node;
          }
        }
      });
  }

  @Override
  public void onConnected(Bundle bundle) {
    resolveNode();
  }

  @Override
  public void onConnectionSuspended(int i) {}

  @Override
  public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.d(TAG, "connectionResult: " + connectionResult);
  }

  /**
    * Send message to mobile handheld
    */
  private void sendMessage(String Key) {
    if (mNode != null && mGoogleApiClient!= null && mGoogleApiClient.isConnected()) {
      final String messageKey = Key;

      Log.d(TAG, "isConnected: " + mGoogleApiClient.isConnected());
      Log.d(TAG, "connected to: " + mNode.getId());

      Task<Integer> sendTask = Wearable.getMessageClient(MainActivity.this).sendMessage(mNode.getId(), MESSAGE_PATH, messageKey.getBytes());
      sendTask.addOnSuccessListener(new OnSuccessListener<Integer>() {
        @Override
        public void onSuccess(Integer integer) {
          Log.d(TAG, "onSuccess: " + integer);
        }
      });

      sendTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
          Log.d(TAG, "onFailure: " + e.getMessage());
        }
      });

      Wearable.MessageApi.sendMessage(mGoogleApiClient, mNode.getId(), MESSAGE_PATH, messageKey.getBytes()).setResultCallback(
        new ResultCallback<MessageApi.SendMessageResult>() {
          @Override
          public void onResult(@NonNull MessageApi.SendMessageResult sendMessageResult) {
            if (sendMessageResult.getStatus().isSuccess()) {
              Log.v(TAG, "Message: { " + messageKey + " } sent to: " + mNode.getDisplayName());
            } else {
              // Log an error
              Log.v(TAG, "ERROR: failed to send Message");
            }
          }
        }
      );
    }
  }
}

当我发送消息时,我从wearapp 的logcat 中得到了这个:

sh.evolutio.carwear D/MainActivity: isConnected: true
sh.evolutio.carwear D/MainActivity: connected to: 778d0d53
sh.evolutio.carwear V/MainActivity: Message: { forward } sent to: HUAWEI Mate 10 Pro
sh.evolutio.carwear D/MainActivity: onSuccess: 17282

所以消息被发送到我的 Mate 10 Pro。但是为什么我的 Mate 10 Pro App 收不到消息呢?我的错误在哪里?我没找到。

4

1 回答 1

0

在您的移动活动中,请勿手动启动服务。该服务将在收到消息后由 Android 自动启动。并且您需要在 AndroidManifest.xml 中取消注释您的数据路径前缀定义。

于 2018-04-10T15:51:10.247 回答