Phone 未收到 Wear 消息(通过消息 api)

Phone to Wear message (via message api) not received

我一直在尝试通过消息 API 从我的 phone 向我的 androidWear 发送消息。到目前为止它没有用,我 运行 不知道为什么。

我有一个关于 phone 发送消息的简单应用程序,这里是代码:

public class MainActivity extends Activity 
implements GoogleApiClient.ConnectionCallbacks {

private static final String START_ACTIVITY = "/start_activity";
private static final String WEAR_MESSAGE_PATH = "/message";

private GoogleApiClient mApiClient;

private ArrayAdapter<String> mAdapter;

private ListView mListView;
private EditText mEditText;
private Button mSendButton;

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

    init();
    initGoogleApiClient();
}

private void initGoogleApiClient() {
    mApiClient = new GoogleApiClient.Builder( this )
            .addConnectionCallbacks(this)
            .addApi( Wearable.API )
            .build();

    mApiClient.connect();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mApiClient.disconnect();
}

private void init() {
    mListView = (ListView) findViewById( R.id.list_view );
    mEditText = (EditText) findViewById( R.id.input );
    mSendButton = (Button) findViewById( R.id.btn_send );

    mAdapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1 );
    mListView.setAdapter( mAdapter );

    mSendButton.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String text = mEditText.getText().toString();
            if (!TextUtils.isEmpty(text)) {
                mAdapter.add(text);
                mAdapter.notifyDataSetChanged();

                sendMessage(WEAR_MESSAGE_PATH, text);
            }
        }
    });
}

private void sendMessage( final String path, final String text ) {
    new Thread( new Runnable() {
        @Override
        public void run() {
            PutDataMapRequest pdmr = PutDataMapRequest.create(WEAR_MESSAGE_PATH);
            pdmr.getDataMap().putString("message", text);
            PutDataRequest dataRequest = pdmr.asPutDataRequest();
            dataRequest.setUrgent();
            PendingResult<DataApi.DataItemResult> result = Wearable.DataApi.putDataItem(mApiClient, dataRequest);

            result.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                @Override
                public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
                    if(dataItemResult.getStatus().isSuccess()){
                        Log.v("MESSAGE APP", "MESSAGE SENT");
                    }
                }
            });

            runOnUiThread( new Runnable() {
                @Override
                public void run() {
                    mEditText.setText( "" );
                }
            });
        }
    }).start();
}

@Override
public void onConnected(Bundle bundle) {
    sendMessage(START_ACTIVITY, "");
}

@Override
public void onConnectionSuspended(int i) {

}
}

当我点击发送按钮时,它发送消息,当我调试它时我可以看到它找到我的磨损(节点)并发送消息(回调returns成功)。

但是磨损什么也没收到: Activity代码:

public class MainActivity extends Activity 
implements MessageApi.MessageListener, GoogleApiClient.ConnectionCallbacks {

private static final String WEAR_MESSAGE_PATH = "/message";
private GoogleApiClient mApiClient;
private ArrayAdapter<String> mAdapter;

private ListView mListView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mListView = (ListView) findViewById(R.id.list);

    mAdapter = new ArrayAdapter<String>( this, R.layout.list_item );
    mListView.setAdapter( mAdapter );

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    initGoogleApiClient();
}

private void initGoogleApiClient() {
    mApiClient = new GoogleApiClient.Builder( this )
            .addApi( Wearable.API )
            .addConnectionCallbacks( this )
            .build();

    if( mApiClient != null && !( mApiClient.isConnected() || mApiClient.isConnecting() ) )
        mApiClient.connect();
}

@Override
protected void onResume() {
    super.onResume();
    if( mApiClient != null && !( mApiClient.isConnected() || mApiClient.isConnecting() ) )
        mApiClient.connect();
}

@Override
protected void onStart() {
    super.onStart();
}

@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
    Log.v("WEAR MESSAGE", "Data changed");

    for (DataEvent event : dataEventBuffer) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            // DataItem changed
            DataItem item = event.getDataItem();
            if (item.getUri().getPath().compareTo(WEAR_MESSAGE_PATH) == 0) {
                DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                final String msg = dataMap.getString("message");
                runOnUiThread( new Runnable() {
                    @Override
                    public void run() {
                        mAdapter.add(msg);
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        } else if (event.getType() == DataEvent.TYPE_DELETED) {
            // DataItem deleted
        }
    }
}

@Override
public void onConnected(Bundle bundle) {
    Wearable.DataApi.addListener( mApiClient, this );
    startService(new Intent(this, WearMessageListenerService.class));
}

@Override
protected void onStop() {
    if ( mApiClient != null ) {
        Wearable.DataApi.removeListener( mApiClient, this );
        if ( mApiClient.isConnected() ) {
            mApiClient.disconnect();
        }
    }
    super.onStop();
}

@Override
protected void onDestroy() {
    if( mApiClient != null )
        mApiClient.unregisterConnectionCallbacks( this );
    super.onDestroy();
}

@Override
public void onConnectionSuspended(int i) {
    Log.d("MESSAGE APP", "Connection suspended");
}
}

和清单(我想问题出在这里):

<uses-feature android:name="android.hardware.type.watch" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@android:style/Theme.DeviceDefault">
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

    <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>

        <intent-filter>
            <action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
            <action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
            <data android:scheme="wear" android:host="*"
                android:pathPattern=".*" />
        </intent-filter>

    </activity>
</application>

</manifest>

我试过使用 path="/message" 也没有用。

知道如何让它发挥作用

更新: 在看到使用消息 API 的成功响应并不意味着消息实际到达磨损后,我改变了一切以使用 DataApi。 (我相应地更改了上面的代码)。

仍然没有磨损....但我尝试了一些东西,我在我的 phone activity 上放了一个 DataApi 侦听器,它看到了变化(如果这有助于找出问题所在) .所以 phone activity 看到 DataCHange 而不是磨损 ... 这让我觉得我实际上没有正确设置我的硬件。

我认为这里存在设计问题。您正在尝试启动一个 Activity 以响应数据层事件,然后在此 activity 中响应此事件。这并不是数据 API 的真正设计用途。

你有几个选择。

  1. 您已经 Activity 运行 通过 Wearable.DataApi.addListenerWearable.MessageApi.addListener 等接收和处理数据层事件
  2. 您还没有 Activity 运行,您通过自己的 WearableListenerService 接收数据事件或消息,然后开始一个新的 activity从这个服务。只要有有趣的 "wearable" 事件(例如数据、消息或节点更改),系统就会为您启动此服务。您必须记住包含适当的清单条目,以使您的服务唤醒以响应每种类型的事件——请查看我上面链接的文档中的 "Example manifest entry" 部分以获得更多清晰度。

请参阅 WearableListenerService 文档。本质上,您应该根据要处理数据事件还是消息事件来覆盖 onDataChanged(DataEventBuffer)onMessageReceived(MessageEvent),然后从您的服务启动 activity(即使用 Intent.FLAG_ACTIVITY_NEW_TASK)

希望对您有所帮助

发现:两个应用程序(wear 和 phone)必须具有相同的 ApplicationId(packageName)。 感谢您的帮助。