Делитесь объектами с телефона на Android Wear

Я создал приложение. В этом приложении у вас есть объекты, которые содержат 2 строки (имя и возраст) и растровое изображение (аватар). Все сохраняется в базу данных sqlite.

Теперь я хочу, чтобы эти объекты были доступны на моих умных часах. Итак, я хочу добиться того, чтобы вы могли перейти к началу, запустить приложение и прокрутить влево и вправо, чтобы увидеть эти объекты.

Это означает, что я должен извлечь объекты из телефона и передать их на часы.

В настоящее время я задаюсь вопросом, все ли я сделал правильно, или что я должен сделать что-то по-другому. Всякий раз, когда вы запускаете приложение на своих часах, я отправляю на телефон запрос о том, что мне нужны объекты.

private void sendMessage() {
    if(mGoogleApiClient.isConnected()) {
        new Thread( new Runnable() {
            @Override
            public void run() {
                NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes( mGoogleApiClient ).await();
                for(Node node : nodes.getNodes()) {
                   Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), REQUEST_PET_RETRIEVAL_PATH, null).await();
                }
            }
        }).start();
    }
}

По телефону я получаю это сообщение и отправляю обратно сообщение с объектом.

public void onMessageReceived(MessageEvent messageEvent) {
    super.onMessageReceived(messageEvent);

    if (messageEvent.getPath().equals(REQUEST_PET_RETRIEVAL_PATH)) {


        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                    @Override
                    public void onConnected(Bundle connectionHint) {
                        final PutDataMapRequest putRequest = PutDataMapRequest.create("/send-pets");
                        final DataMap map = putRequest.getDataMap();

                        File imgFile = new File(obj.getAvatar());

                        Bitmap avatar;
                        if(imgFile.exists()) {
                            avatar = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                        } else {
                            avatar = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
                        }

                        Asset asset = createAssetFromBitmap(avatar);
                        map.putAsset("avatar", asset);
                        map.putString("name", obj.getName());
                        map.putString("age", obj.getDateOfBirth());
                        Wearable.DataApi.putDataItem(mGoogleApiClient, putRequest.asPutDataRequest());
                    }

                    @Override
                    public void onConnectionSuspended(int cause) {
                    }
                })
                .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult result) {
                    }
                })
                .addApi(Wearable.API)
                .build();
        mGoogleApiClient.connect();
    }

На часах я затем извлекаю объект.

public void onDataChanged(DataEventBuffer dataEvents) {
    final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
    for(DataEvent event : events) {
        final Uri uri = event.getDataItem().getUri();
        final String path = uri!=null ? uri.getPath() : null;
        if("/send-pets".equals(path)) {
            final DataMap map = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
            String name = map.getString("name");
            String age = map.getString("age");

            Asset avatar = map.getAsset("avatar");
            Bitmap bitmap = loadBitmapFromAsset(avatar);
        }
    }
}

Теперь я застрял с 2 вопросами:

1) Так ли это, или я должен решить это по-другому?

2) Можно ли отправить несколько объектов одновременно или мне просто нужно зациклить часть в методе «onConnected» и отправить каждый объект отдельно?


person P.T.    schedule 19.11.2014    source источник


Ответы (1)


Да, это хороший и правильный подход.

Да, можно отправить несколько, но вы должны знать, что они не «отправляются», они больше чем-то вроде совместного использования или синхронизации между телефоном и Wear, и могут быть изменены в любой момент времени (однако я бы рекомендовал сохранить их на SharedPreferences на Wear, чтобы иметь доступ к ним в автономном режиме.

Таким образом, Message API отправляет объекты (быстро и просто), а DataItem API более сложен, но используется для больших данных и обмена данными между часами и телефоном.

person Michał Tajchert    schedule 19.11.2014
comment
Спасибо за проверку :) - person P.T.; 25.11.2014
comment
Что произойдет, если я захочу отправить пользовательский объект, содержащий три других пользовательских объекта? Должен ли я размещать на карте каждое поле объекта отдельно? - person Juan José Melero Gómez; 05.08.2015
comment
@JuanJoséMeleroGómez, ты понял, как это сделать? - person pushandpop; 19.03.2019
comment
@pushandpop, если вы хотите отправлять целые объекты с некоторыми вложенными, я бы предложил преобразовать их в JSON и отправить в виде строки. - person Michał Tajchert; 20.03.2019
comment
@pushandpop Прошло так много времени, что я не знаю. Я думаю, что я отправил DataMap, содержащий вложенные DataMap, каждый из которых анализировал другой объект. Извиняюсь! Вы также можете сделать то, что предлагает Михал Тайчерт, или создать свой собственный класс картографа. - person Juan José Melero Gómez; 20.03.2019