Отправка данных Android часам (wear) из Android приложения(Send data or notification from Android device to android wear)
Всю работу на отправку данных берет на себя объект GoogleApiClient из комплекта AndroidSDK. Сам процесс очень и очень прост:
1. инициализация GoogleApiClient
2. После инициализации, получаем список подключенных узлов. Теоретически у пользователя может быть больше 1-ого комплекта часов.
3. Отправка уведомления. Здесь считаю необходимым рассмотреть 2 нюанса:
– не вызывайте sendNotificationToWear после вызова getNodes, т.к. он асинхронный и вызов на самом деле не сработает, т.к. в 99% случаев sendNotificationToWear отработает раньше обратного вызова onResult() метода getNodes();
– третий параметр метода sendMessage – “/it-notepad.com_android”, Это путь вызываемого слушателя в часах(wear)
Полный исходный код клиента:
public class ... implements DataApi.DataListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{ private GoogleApiClient mGoogleApiClient; //подключаемый узел(девайс) private Node mNode; private void initialize(){ mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); mGoogleApiClient.connect(); } @Override public void onConnected(@Nullable Bundle bundle) { Wearable.DataApi.addListener(mGoogleApiClient, this); getNodes(); } @Override public void onConnectionSuspended(int i) { } @Override public void onDataChanged(DataEventBuffer dataEventBuffer) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } private void getNodes() { Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<nodeapi.getconnectednodesresult>() { @Override public void onResult(NodeApi.GetConnectedNodesResult nodes) { Logg.i(TAG,"onResult Node"); for (Node node : nodes.getNodes()) { mNode = node; } } }); } private void sendNotificationToWear(String name,String time){ byte[] arrayString = (name+";"+time).getBytes(); if (mNode != null && GoogleApiClient!=null && mGoogleApiClient.isConnected()) { Wearable.MessageApi.sendMessage(mGoogleApiClient, mNode.getId(), "/it-notepad.com_android", arrayString).setResultCallback( new ResultCallback<MessageApi.SendMessageResult>() { @Override public void onResult(MessageApi.SendMessageResult sendMessageResult) { if (!sendMessageResult.getStatus().isSuccess()) { Log.e("TAG", "Error send notification "+ sendMessageResult.getStatus().getStatusCode()); } }); } }
Теперь рассмотрим код принимающей стороны(Android wear)
Начнем с файла манифеста:
Публикуем сервис, который будет принимать сообщения от других девайсов, назовем его ListenerServiceromWear. параметр android:pathPrefix=”/it-notepad.com_android“ и параметр пути в методе sendMessage() клиента должны быть идентичными, в противном случае сервис – слушатель не сможет принять сообщение.
В самом сервисе слушателе, проверяем, чтобы путь в объекте MessageEvent соответствовал указанному нами и получаем переданные данные в виде массива байтов.
<service android:name=".ListenerServiceFromWear> <intent-filter> <action android:name="com.google.android.gms.wearable.DATA_CHANGED" /> <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" /> <data android:scheme="wear" android:host="*" android:pathPrefix="/it-notepad.com_android" /> </intent-filter> </service> public class ListenerServiceFromWear extends WearableListenerService { private static final String IT_WEAR_PATH = "/it-notepad.com_android"; private static final String TAG = ListenerServiceFromWear.class.getSimpleName(); public static final String NAME_SALAT = "NAME_SALAT"; public static final String TIME_SALAT = "TIME_SALAT"; @Override public void onMessageReceived(MessageEvent messageEvent) { Logg.i(TAG,"onMessageReceived"); /* * Receive the message from wear */ if (messageEvent.getPath().equals(IT_WEAR_PATH)) { byte[] arrayString = messageEvent.getData(); String string = new String(arrayString); String[] arraysString =string.split(";"); } } }
На всякий случай публикую добавленные зависимости в файле build.gradle
build.gradle:
compile 'com.google.android.gms:play-services:9.0.2' compile 'com.google.android.gms:play-services-ads:9.0.2'