Отправка данных 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 && mGoogleApiClient!=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'

Leave a Reply

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.