Puis-je envoyer des objets personnalisés à Android Wear?

J'apprends simplement à développer pour Android Wear, j'ai créé une activité plein écran pour Smart Watches et dans ma partie mobile de l'application, j'obtiens des données JSON et crée une liste d'objets personnalisés à partir de cela.

Sur mon application mobile, je montre les informations de ces objets dans un ListView.

Sur le morceau Wear de mon application, je souhaite afficher une version limitée de cette liste, par exemple, les 3 premiers de la liste apparaîtront sur mon application plein écran sur Wearable.

Mon problème est qu'il n'y a pas moyen d'envoyer des objets partagés à Android Wear, il n'y a pas d'option de putParcelable dans DataItem.

Il semble que la seule option est d'envoyer un objet en octets, comme ceci:

public void sendWearableData(GoogleApiClient aGoogleApiClient, ArrayList<MyObject> myObjectList, String path) { googleApiClient = aGoogleApiClient; byte[] testBytes = new byte[0]; if (googleApiClient.isConnected()) { PutDataMapRequest dataMapRequest = PutDataMapRequest.create(path); try { testBytes = BytesUtils.toByteArray(myObjectList); } catch (IOException e) { e.printStackTrace(); } dataMapRequest.getDataMap().putByteArray(Constants.TEST_KEY, testBytes); PutDataRequest request = dataMapRequest.asPutDataRequest(); Wearable.DataApi.putDataItem(googleApiClient, request); } } 

Je dois donc convertir mon objet en octets, l'envoyer à Android Wear et le convertir en retour? Cela signifie que mes Objets sur lesquels j'ai implémenté Parcelable, afin de pouvoir les envoyer via les Intents, doivent également être mis en œuvre de manière sérieuse, est-ce correct ou y a-t-il une meilleure façon de le faire?

One Solution collect form web for “Puis-je envoyer des objets personnalisés à Android Wear?”

Solution similaire à celle du paquet:

Dans mon application, j'ai créé une classe légère, spécialement pour l'envoyer depuis le téléphone à regarder. Étant donné que le code est partagé entre les pièces mobiles et les pièces portables de l'application, il peut être facilement compressé et restauré sur les deux périphériques sans duplication de code. Il fournit un mécanisme DataMap Bundle , mais en utilisant DataMap .

Exemple de mise en œuvre:

 public class MyObject { public final long itemId; public final long sortOrder; public final String priceString; public MyObject(long itemId, long sortOrder, String priceString) { this.itemId = itemId; this.sortOrder = sortOrder; this.priceString = priceString; } public MyObject(DataMap map) { this(map.getLong("itemId"), map.getLong("sortOrder"), map.getString("priceString") ); } public DataMap putToDataMap(DataMap map) { map.putLong("itemId", itemId); map.putLong("sortOrder", sortOrder); map.putString("priceString", priceString); return map; } } 

L'écriture d'une telle classe vous permettra de considérer ce qu'il faut envoyer d'un appareil à l'autre pour envoyer le moins possible. Il ne se rompra pas non plus quand un champ sera ajouté ou supprimé (en opposition à la solution suivante).

Répondre à vos préoccupations partagées:

Si vous ne souhaitez pas écrire la nouvelle classe et que vous souhaitez réutiliser votre code existant, vous pouvez essayer d'utiliser le code ci-dessous. Il vous permettra de rester avec une seule interface Parcelable (sans avoir besoin d'implémenter une interface Serializable ). Je ne l'ai pas testé lors de l'envoi de périphériques, mais il réussit à marshall() et un unmarshall() à / from Parcel et à le stocker dans DataMap .

REMARQUE: Je ne sais pas exactement comment Google Play Services tient toutes ces données DataApi , mais je crains que quelque chose ne se brise lorsque ce type sera mis à jour.
Par exemple, la classe sera mise à jour sur Android Wear, l'utilisateur lancera l'application qui essayerait de lire les données actuelles de DataApi (qui a été "sérialisé" en utilisant l'ancienne version de cette classe) et essayez de la lire à partir de l' byte[] comme si C'était une version mise à jour. Ces problèmes devraient être testés, mais je ne pense pas qu'ils ont rendu DataApi si primitif "simplement parce que" ou pour rendre plus difficile le développement d'applications sur Wear.

Je recommande vivement d'utiliser la solution Bundle like et de ne pas utiliser la solution Parcelable .
Utilisez-le à vos risques et périls.

 import android.os.Parcel; import android.os.Parcelable; import com.google.android.gms.wearable.DataMap; /** * <p>Allows to put and get {@link Parcelable} objects into {@link DataMap}</p> * <b>USAGE:</b> * <p> * <b>Store object in DataMap:</b><br/> * DataMapParcelableUtils.putParcelable(dataMap, "KEY", myParcelableObject); * </p><p> * <b>Restore object from DataMap:</b><br/> * myParcelableObject = DataMapParcelableUtils.getParcelable(dataMap, "KEY", MyParcelableObject.CREATOR); * </p> * I do <b>not recommend</b> to use this method - it may fail when the class that implements {@link Parcelable} would be updated. Use it at your own risk. * @author Maciej Ciemięga */ public class DataMapParcelableUtils { public static void putParcelable(DataMap dataMap, String key, Parcelable parcelable) { final Parcel parcel = Parcel.obtain(); parcelable.writeToParcel(parcel, 0); parcel.setDataPosition(0); dataMap.putByteArray(key, parcel.marshall()); parcel.recycle(); } public static <T> T getParcelable(DataMap dataMap, String key, Parcelable.Creator<T> creator) { final byte[] byteArray = dataMap.getByteArray(key); final Parcel parcel = Parcel.obtain(); parcel.unmarshall(byteArray, 0, byteArray.length); parcel.setDataPosition(0); final T object = creator.createFromParcel(parcel); parcel.recycle(); return object; } } 

Le code est également disponible sur GitHub .

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.