wear os - Wearable.MessageApi.sendMessage返回成功,但onmessagerrec



在Wear应用程序上工作,我创建了带有移动和Wear应用程序的Wear应用程序。通过"MessageApi"从移动应用程序发送数据。SendMessageResult",返回状态为SUCCESS,但在wear应用程序中未收到消息。请找到下面的代码,让我知道我错过了什么。

手机应用代码:

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 )
            .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() {
            //Previous code
           NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes( mApiClient ).await();
            Log.d("MessageAPI","nodes :: "+nodes);
            for(com.google.android.gms.wearable.Node node : nodes.getNodes()) {
                Log.d("MessageAPI","nodes for :: "+node);
                MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(
                        mApiClient, node.getId(), path, text.getBytes() ).await();
                Log.d("MessageAPI","node.getId() : "+node.getId());
                Log.d("MessageAPI","text.getBytes() : "+text.getBytes());
                Log.d("MessageAPI","path : "+path);
                Log.d("MessageAPI","nodes result Status:: "+result.getStatus().isSuccess());
            }
           /*PutDataMapRequest putDMR = PutDataMapRequest.create(path);
            putDMR.getDataMap().putAll(getDatMap());
            PutDataRequest request = putDMR.asPutDataRequest();
            DataApi.DataItemResult result = Wearable.DataApi.putDataItem(mApiClient, request).await();
            if (result.getStatus().isSuccess()) {
                Log.v("MessageAPI", "nodes DataMap: " + getDatMap() + " sent successfully to data layer ");
            } else {
                // Log an error
                Log.v("MessageAPI", "nodes ERROR: failed to send DataMap to data layer");
            }*/

            runOnUiThread( new Runnable() {
                @Override
                public void run() {
                    mEditText.setText( "" );
                }
            });
        }
    }).start();
}
@Override
public void onConnected(Bundle bundle) {
    sendMessage(START_ACTIVITY, "Wear my TEST MESSAGE");
}
@Override
public void onConnectionSuspended(int i) {
}
private DataMap getDatMap(){
    DataMap  dataMap = new DataMap();
    dataMap.putLong("time", new Date().getTime());
    dataMap.putString("hole", "1");
    dataMap.putString("front", "250");
    dataMap.putString("middle", "260");
    dataMap.putString("back", "270");
    return  dataMap;
}

}

Mobile App manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ptrprograms.wearmessageapi" >
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <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>
    </activity>
</application>

wearApp代码

public class WearMessageListenerService extends WearableListenerService {
private static final String START_ACTIVITY = "/start_activity";
@Override
public void onMessageReceived(MessageEvent messageEvent) {
    Log.d("MessageAPI","onMessageReceived :: "+ messageEvent.getPath());
   /* if( messageEvent.getPath().equalsIgnoreCase( START_ACTIVITY ) ) {
        Intent intent = new Intent( this, MainActivity.class );
        intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
        startActivity( intent );
    } else {
        super.onMessageReceived(messageEvent);
    }*/
    showToast("onMessageReceived:: "+messageEvent.getPath());
    Intent intent = new Intent( this, MainActivity.class );
    intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
    startActivity( intent );
}
private void showToast(String message) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
    super.onDataChanged(dataEventBuffer);
    Log.d("MessageAPI","onMessageReceived : onDataChanged: ");
}

}

wearApp清单:

<?xml version="1.0" encoding="utf-8"?>

<uses-feature android:name="android.hardware.type.watch" />
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    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>
    </activity>
   <!-- <service android:name=".WearMessageListenerService">
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </service>-->
    <service android:name=".WearMessageListenerService">
        <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="/prefix" />
        <!--<data android:scheme="wear" android:host="*"
        android:path="/start_activity" />-->
        <!--<action android:name="com.google.android.gms.wearable.CAPABILITY_CHANGED" />
        <action android:name="com.google.android.gms.wearable.CHANNEL_EVENT" />-->
       <!-- <data android:scheme="wear" android:host="*" android:path="/start_activity" />-->

    </service>
</application>

1)问题是在WearMessageListenerService中的wearApp。你不打电话 super.onMessageReceived(messageEvent); 也就是说,您使用所有消息。当你调用超级方法时,你传递消息给Wearable.MessageApi.addListener(...

2)我没有在你的wear应用程序中看到你注册了MessageApi监听器。

3)混合使用MessageApi和数据层api。

4)在主要活动的wear应用程序中,您也需要与google play服务连接。在onConnected方法中注册MessageApi监听器。

5)请查看https://github.com/mariopce/android-wear-bilateral-communication。这是使用MessageApi进行双向通信(mobile-wear-mobile)的示例

相关内容

  • 没有找到相关文章

最新更新