Связь Android Wear с носимыми устройствами не работает

У меня есть приложение для смартфона, которое работает. Я теперь хочу его расширить, чтобы была еще и носимая часть. Я попытался собрать все вместе из нескольких источников (https://www.binpress.com/tutorial/a-guide-to-the-android-wear-message-api/152 и https://developer.android.com/training/building-wearables.html), но я не могу отправить свои данные на носимое .

Что я делаю не так?

Это код, который у меня есть до сих пор...

Моя основная деятельность на стороне телефона:

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks

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

    // Android wear support
    initGoogleApiClient();
}

// Android wear support
private void initGoogleApiClient() {
    mApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .build();
    mApiClient.isConnected());

    mApiClient.connect();
}

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

@Override
public void onConnectionSuspended(int i) {
}

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

private void sendMessage(final String path, final String text) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mApiClient).await();
            for (Node node : nodes.getNodes()) {
                MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(
                        mApiClient, node.getId(), path, text.getBytes()).await();
            }
        }
    }).start();
}
}

В моем носимом модуле внутри Android Studio у меня есть этот манифест:

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

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.DeviceDefault">
    <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="com.myapp.appname.wear.WearMessageListenerService">
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </service>
</application>

My WearMessageListenerService looks like this:

public class WearMessageListenerService extends WearableListenerService {
    private static final String START_ACTIVITY = "/start_activity";

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        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);
        }
    }
}

А это мой MainActivity.java из моего приложения для ношения:

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

private TextView mTextView;
private static final String WEAR_MESSAGE_PATH = "/start_activity";
GoogleApiClient mApiClient;

@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.textView);
        }
    });

    mApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .build();

    mApiClient.connect();
}

@Override
public void onConnected(Bundle bundle) {
    Wearable.MessageApi.addListener(mApiClient, this);
}

@Override
public void onConnectionSuspended(int i) {
}

@Override
public void onMessageReceived( final MessageEvent messageEvent ) {
    runOnUiThread( new Runnable() {
        @Override
        public void run() {
            if( messageEvent.getPath().equalsIgnoreCase( WEAR_MESSAGE_PATH ) ) {
                mTextView.setText( new String( messageEvent.getData() ));
            }
        }
    });
}

}

Также в моей конфигурации сборки приложения для смартфона я использую это:

wearApp project(':mywearapp')

person user754730    schedule 15.05.2015    source источник


Ответы (1)


Имя пакета вашего основного приложения и приложения Wear должно совпадать точно: похоже, имя вашего пакета установлено на com.myapp.appname.wear (хотя вы не включаете build.gradle, что может переопределить это).

Кроме того, убедитесь, что вы вызываете addConnectionCallbacks() при построении своего GoogleApiClient - без этого он не знает, кому звонить при подключении.

person ianhanniballake    schedule 15.05.2015
comment
Большое спасибо! Я сделал это, но все равно кажется, что onConnected() не вызывается на мобильной стороне... - person user754730; 16.05.2015
comment
Куда вы звоните initGoogleApiClient()? Вы не включили свой onCreate() или аналогичный метод - person ianhanniballake; 16.05.2015
comment
Нет, извините, я забыл включить это в свой пост, обновлю прямо сейчас. Я вызываю его из onCreate()... Это вызывается, а также создается экземпляр APIClient, но onConnected() не вызывается... - person user754730; 16.05.2015
comment
Ах, похоже, вы пропустили вызов addConnectionCallbacks() на вашем GoogleApiClient.Builder! Это сработает. - person ianhanniballake; 16.05.2015