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>
Мой WearMessageListenerService выглядит так:
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')
1 ответ
Имя пакета вашего основного приложения и приложения Wear должно точно совпадать: похоже, имя вашего пакета установлено на com.myapp.appname.wear
(хотя вы не включаете ваш build.gradle
, что может переопределить это).
Кроме того, убедитесь, что вы вызываете addConnectionCallbacks() при создании GoogleApiClient
- без этого он не знает, кому звонить при подключении.