B4A Library Wearable DataLayer

What is it?
Not so recently a new branch of the Android platform was released for wearables (Watches and things) know simply as Android Wear. Wearables running Android Wear are made to be an extension for your existing mobile Android device. They bring notifications and app information / interaction out of your pocket and onto your wrist (and maybe other places if other wearable devices are released). I believe notifications will account for about 80% of the usage of these wearable devices. Wearable notification support has been possible for a while with the Notification Builder library, and the possibility to make apps that run on Android Wear has also been possible Tutorial. There was still a little issue; your mobile device and your wearable device couldn't talk to each other.

So, here is the Wearable DataLayer library. It allows you to communicate between the 2 devices. There are a couple of ways this works. There are:
  • Messages - these are 'send and forget' one way messages for small amounts of information (<100 KB)
  • DataMaps (Google call them DataItems, externally, but DataMaps internally o_O) - These are maps of data that are kept in sync on the Wear Network (a virtual connection between the devices). This data can be changed from either side and the data will sync to all other devices. DataMaps can hold Strings, Ints, Booleans, etc.
  • Assets - These are technically part of DataMaps but it is easier to explain them separately and you create them like so. Assets are basically used to transfer larger (anything > 100 KB) blocks of information as a File or Bitmaps. Assets are added to DataMaps and the system takes care of the transfer over bluetooth and caching, avoiding re-transmission.
This library has literally taken me an lifetime to make and I can only apologize for that, I hoped it would have been waaaaaay before now but sometimes life gets in the way of hobbies.

How To Install

First of all, copy the .jar and .xml to your additional libraries folder like any other library.

The use of this library requires the inclusion of Google Play Services. Similar to the Android-Support libraries, you have to download this with sdk manager and copy the library file(s) over to your additional libraries folder. A typical place for this would be

C:\Program Files\Android\sdk\extras\google\google_play_services\libproject\google-play-services_lib\libs

Although this path may be different depending on your installation.

It also requires 'AdditionalRes'. Again the path may vary. This is just for the Version ID of Play Services.
#AdditionalRes: C:\Program Files\Android\sdk\extras\google\google_play_services\libproject\google-play-services_lib\res, com.google.android.gms

I will update that post a little in the future and also create / post a few simple examples to help you all out.

Note: I have edited a few bits since my last BIG testing session, hopefully it won't have broken anything. I've run a few tests but thought it was about time I got this online so I will fix any issues as they come up. Also, a lot has changed since the BETA so the examples for that won't work, though the principles are the same so you should be able to get the idea from it.

Documentation

WearableDataLayer
Author:
BarxDroid
Version: 1

  • Methods:
    • AddDynamicListener
      Adds a dynamic listener to receive message events.
      A dynamic listener is create at runtime and will be removed once the process is stopped or once RemoveListener is called.
    • Info
      NOTE: This method doesn't do anything and is to provide information only.
      A Message is used to 'Send and forget' small amounts (<100KB) of data.
      You can receive the messages either with dynamic or static receivers.
      Dynamic - Will only be received while the listener is registered.
      Register with .AddDynamicReceiver.
      You must also unregister once done using .RemoveDynamicReceiver
      static - More complex but means you can receive messages at any time
      Add the following text to the Manifest Editor
      <code>AddApplicationText(
      <service android:name="barxdroid.wearabledatalayer.ListenerService"
      android:label="Wearable Listener">
      <intent-filter>
      <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
      </intent-filter>
      </service>)
      </code>
      Then add a service called 'WearListenerService to your project and in the service module, use code like this.
      <code>
      Sub Process_Globals
      Dim WL As WearableListener
      End Sub
      Sub Service_Start (StartingIntent As Intent)
      WL.Initialize("WL")
      WL.HandleIntent(StartingIntent)
      End Sub
      Sub WL_MessageReceived(SourceNodeID As String, RequestID As Int, msgPath As String, Data As String)
      ToastMessageShow(Data, False)
      End Sub
      </code>
    • IsInitialized As Boolean
    • RemoveListener
      Removes the dynamic listener so no more messages will be received
    • Send (NodeID As String, Timeout As Long, msgPath As String, Data As String)
      Sends a message to a specified node
      NodeID - The ID of the node to connect to.
      Timeout - The timeout before the message sending will fail in milliseconds.
      Path - Denotes a path identifier to specify a particular endpoint at the receiving node.
      Data - A ByteArray of data to pass. Do not pass >100KB. Pass Null if not required.
  • WearableAsset
    Methods:
    • CreateFromBitmap (bitmap As Bitmap) As Asset
      Creates an Asset to use from a Bitmap
    • CreateFromFile (Dir As String, Filename As String) As Asset
      Creates an Asset to use from a File
    • Info
      This method doesn't do anything, it is here purely for informational purposes.
      An asset is used to send a binary blob of data such as an image.
      You attach an asset to a DataItem.
      The system takes care of conserving bluetooth by caching large assets to avoid re-transmission.
  • WearableDataLayer
    Events:
    • BitmapResult (Tag As String, Result As Bitmap)
    • Connected ( As )
    • ConnectionFailed (ErrorCode As Int, Reason As String)
    • ConnectionSuspended (Reason As String)
    • DataChanged (ChangedItems As Map, DeletedItems As Map)
    • DataMapAdded (Success As Boolean)
    • DataMapDeleted (Path as string As , Success As Boolean)
    • DataMapResults (Success As Boolean, Results As Map)
    • FileResult (Tag As String, Dir As String, Filename As String, Success As Boolean)
    • LocalNodeIDResult (Success As Boolean, NodeID As String, NodeDisplayName As String)
    • MessageReceived (SourceNodeID As String, RequestID As Int, msgPath As String, Data As String)
    • MessageSent (Success As Boolean)
    • NodeResults (Results As List)
    • PeerConnected (ID As Int, DisplayName As String)
    Fields:
    • message As Message
    Methods:
    • AddDataMap (Path As String, dataMap As DataMap)
      Adds a Data Map to the Client to sync across the Wearable Data connection.
      DataMaps are synchronized across all devices
      Path - The path to store the DataMap under. e.g "/User"
      DataMap - The DataMap object to add
      Will call DatamapAdded() once complete returning the path for Identification and the success
      Also triggers DataChanged() event if new information is added
    • ClearCallingIdentity
    • Connect
      Connects the Google Play services client (required for the Data Layer to work)
      The _onConnected event will raise once the connection is successful.
      Do NOT attempt to use the Data Layer until the connection is successful
      Make sure you disconnect the client once done (probably best to do this in Activity_Pause()
    • DeleteDataMap (Path As String)
      Deletes a DataMap
      Path - The path which the DataMap resides.
      Calls DataMapDeleted() Event if present, with the success of the action
    • Disconnect
      Disconnects the Google Play services client
      Should always be called once you have finished with the Data Layer e.g. when the app closes or is paused.
    • GetAllDataMaps
      Returns all the present DataMaps as a Map.
      Each Map Key-Value pair is as follows
      Key - The path that the DataMap resides
      Value - The DataMap object

      The results will be returned in the DataLayer_DataMapResults() event
    • GetBitmapFromAsset (tag As String, asset As Asset)
      Gets a Bitmap from an Asset
      Tag - a Tag used to identify the request in the resulting callback
      Asset - the Asset object to extract the File from
      Result returned in BitmapResult() callback
    • GetConnectedNodes
      Get a list of the connected Nodes (Devices)
      The returned List will contains a Map for each node.
      The map will then contains 3 Key-Value pairs:
      ID - The ID of the node, this is used to reference the node when sending messages etc
      DisplayName - A HumanReadable name for the device (on my Samsung Gear Live this matched the ID so was of no use)
      ToString - A string representation of the full Node object, used mainly for my testing

      Result returned in NodeResults() Event
    • GetDataMap (Path As String, Tag As String)
      Gets an existing DataMap
      Path - the path that the DataMap resides
      Tag - a tag that is passed through to the results to make the result set identifiable
      If there is more than one DataMap with the same Path present on the Wear network. e.g. from different Nodes.
      All the DataMaps with that name will be returned.
      Use GetDataMap2 to specify a Node to narrow down a specific DataMap.
      Results are returned in DatamapResults() Event
    • GetDataMap2 (NodeID As String, Path As String, Tag As String)
      Similar to GetDataMap but allows you to specify a NodeID.
    • GetFileFromAsset (tag As String, asset As Asset, TargetDir As String, TargetFilename As String)
      Gets a File from an Asset
      Tag - A tag used to identify the request in the resulting callback
      Asset - The Asset object to extract the File from.
      TargetDir - The directory where the File will be created
      TargetFilename - The filename that the extracted File will be named
      Result returned in FileResult() callback
    • Initialize (Eventname As String)
      Initializes the object.
      Note: this library requires Android 4.3 (API18) or above
    • LocalNodeID
      Gets the NodeID of the local Device
      Result returned in LocalNodeIDResult() event
    • RestoreCallingIdentity
  • WearableDataMap
    Methods:
    • Clear
      Clears all previously added data items from the DataMap
    • ContainsKey (Key As String) As Boolean
      Checks if the given key is contained in the DataMap.
      Returns True if the key is present
    • Get (Key As String) As Object
      Returns the DataMap entry with the given Key as an Object
    • GetAsset (Key As String) As Asset
      Gets an Asset data item from the DataMap
      Key - The reference as set in in the PutAsset() method
    • GetBoolean (Key As String) As Boolean
      Gets a Boolean data item from the DataMap
      Key - The reference as set in in the PutBoolean() method
    • GetByte (Key As String) As Byte
      Gets a Byte data item from the DataMap
      Key - The reference as set in in the PutByte() method
    • GetByteArray (Key As String) As Byte[]
      Gets a Byte Array data item from the DataMap
      Key - The reference as set in in the PutByteArray() method
    • GetDouble (Key As String) As Double
      Gets a Double data item from the DataMap
      Key - The reference as set in in the PutDouble() method
    • GetFloat (Key As String) As Float
      Gets a Float data item from the DataMap
      Key - The reference as set in in the PutFloat() method
    • GetFloatArray (Key As String) As Float[]
      Gets a Float Array data item from the DataMap
      Key - The reference as set in in the PutFloatArray() method
    • GetInt (Key As String) As Int
      Gets an Int data item from the DataMap
      Key - The reference as set in in the PutInt() method
    • GetLong (Key As String) As Long
      Gets a Long data item from the DataMap
      Key - The reference as set in in the PutLong() method
    • GetLongArray (Key As String) As Long[]
      Gets a Long Array data item from the DataMap
      Key - The reference as set in in the PutLongArray() method
    • GetString (Key As String) As String
      Gets a String data item from the DataMap
      Key - The reference as set in in the PutString() method
    • GetStringArray (Key As String) As String[]
      Gets a StringArray data item from the DataMap
      Key - The reference as set in in the PutStringArray method
    • Initialize
      Initializes the object.
      No Eventname is required. The DataLayer Eventname is used.
    • IsInitialized As Boolean
    • PutAsset (Key As String, Asset As Asset)
      Adds an Asset data item to the DataMap
      Key - a key used to reference the data item
      Asset - the Asset object to pass.
    • PutBoolean (Key As String, Val As Boolean)
      Adds a Boolean data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutByte (Key As String, Val As Byte)
      Adds a Byte data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutByteArray (Key As String, Val() As Byte)
      Adds a Byte Array data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutDouble (Key As String, Val As Double)
      Adds a Double data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutFloat (Key As String, Val As Float)
      Adds a Float data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutFloatArray (Key As String, Val() As Float)
      Adds a Float Array data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutInt (Key As String, Val As Int)
      Adds an Int data item to the DataMap.
      Key - a key use to reference the data item
      Val - the value to set to.
    • PutLong (Key As String, Val As Long)
      Adds a Long data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutLongArray (Key As String, Val() As Long)
      Adds a Long Array data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutString (Key As String, Val As String)
      Adds a String data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • PutStringArray (Key As String, Val() As String)
      Adds a String Array data item to the DataMap
      Key - a key used to reference the data item
      Val - the value to set to.
    • Remove (Key As String)
      Removes an item from the DataMap with the given Key
    • Size As Int
      Returns the number of Key-Value pairs currently in the DataMap
    • isEmpty As Boolean
      Return True if the DataMap is currently empty
    • toByteArray As Byte[]
      Returns the DataMap as a ByteArray
    • toString As String
      Returns a string representation of the DataMap
  • WearableListener
    Events:
    • DataChanged (ChangedItems As Map, DeletedItems As Map)
    • MessageReceived (SourceNodeID As String, RequestID As Int, msgPath As String, Data As String)
    Methods:
    • HandleIntent (StartingIntent As IntentWrapper) As Boolean
      Used to handle the starting intent when using static listeners.
      Will call the following events:
      _MessageReceived - When a message is received
      _DataChanged - When a DataMap is changed on the Wear Network
    • Initialize (EventName As String)
      initilizes the object and set the EventName for callback events

To Be Continued.............
 

Attachments

  • WearableDataLayer.zip
    30.8 KB · Views: 612

postasat

Active Member
Licensed User
Longtime User
Hi,
it would be very nice if someone could update this library.
Do You know other possibility of using Android wear with B4A ?
 

touchsquid

Active Member
Licensed User
Longtime User
Is it possible to use this library with B4A 6.30? I have not found a way to do so. Google Play Services jar is not on my system.
 

barx

Well-Known Member
Licensed User
Longtime User
If i'm honest, I have no idea how to use git properly. I tried to update the repo, but nothing seemed to happen, so attached is the project for source.
 

Attachments

  • Project.zip
    40.7 KB · Views: 285

tpakis

Active Member
Licensed User
Longtime User
I think i MAY have done it. I tweaked a little the "imports", and the "dependson" of the wearabledatalayer and it compiles and runs without any error. I need someone to check if the dynamic listener works ok on both handheld and wear device because my pc emulator suddenly refuses to work and drives me nuts!! I compiled the library with SLC and in the libs folder i inculded opt.jar and stan.jar created from a dummy project.

Of course you need to change the additionalres to
#AdditionalJar: com.google.android.gms:play-services-wearable

I upload the library and the full slc project folder (to dropbox because it's a big file)

https://www.dropbox.com/sh/qeznvi63x6atb1d/AACrMCYVBJuLDn7YCFx5ShZta?dl=0
 

Attachments

  • wearablelib.zip
    27.2 KB · Views: 312

postasat

Active Member
Licensed User
Longtime User
Great Work !
It is working, I can communicate from phone to watch!
Android 6 and LG watch.

Thank you.
 

NeoTechni

Well-Known Member
Licensed User
Longtime User
I tried and I got this:

main_activity_create (java line: 359)
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/util/ArrayMap;
at com.google.android.gms.common.api.GoogleApiClient$Builder.<init>(Unknown Source)
at barxdroid.wearabledatalayer.WearableDataLayer.Initialize(WearableDataLayer.java:77)
at barxdroid.wearable_app.main._activity_create(main.java:359)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
at barxdroid.wearable_app.main.afterFirstLayout(main.java:102)
at barxdroid.wearable_app.main.access$000(main.java:17)
at barxdroid.wearable_app.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.util.ArrayMap" on path: DexPathList[[zip file "/data/app/barxdroid.wearable_app-2/base.apk"],nativeLibraryDirectories=[/data/app/barxdroid.wearable_app-2/lib/arm, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
... 15 more
Suppressed: java.lang.ClassNotFoundException: android.support.v4.util.ArrayMap
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 16 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
main_activity_create (java line: 359)
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/util/ArrayMap;
at com.google.android.gms.common.api.GoogleApiClient$Builder.<init>(Unknown Source)
at barxdroid.wearabledatalayer.WearableDataLayer.Initialize(WearableDataLayer.java:77)
at barxdroid.wearable_app.main._activity_create(main.java:359)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
at barxdroid.wearable_app.main.afterFirstLayout(main.java:102)
at barxdroid.wearable_app.main.access$000(main.java:17)
at barxdroid.wearable_app.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.util.ArrayMap" on path: DexPathList[[zip file "/data/app/barxdroid.wearable_app-2/base.apk"],nativeLibraryDirectories=[/data/app/barxdroid.wearable_app-2/lib/arm, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
... 15 more
Suppressed: java.lang.ClassNotFoundException: android.support.v4.util.ArrayMap
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 16 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
 

DonManfred

Expert
Licensed User
Longtime User
Try to add
B4X:
#additionaljar: com.android.support:support-v4
to your code to add a maven-dependency
 

ltrebuchet

Member
Licensed User
Longtime User
It worked to extend my app to wearables use. Many thanks to BarXdroid and tpakis, as well as Erel and Don :)
 

Dave O

Well-Known Member
Licensed User
Longtime User
DataMapAdded (Success As Boolean)

Small correction to the docs: the DataMapAdded event returns the same arguments as DataMapDeleted:

B4X:
DataMapAdded(Path as string, Success As Boolean)
 

Dave O

Well-Known Member
Licensed User
Longtime User
Is there a working example of exchanging data using datamaps?

I'm trying to get a simple test working, and have so far got a datamap on the phone added to the Wear network, and detected as changed on the watch.

But when I try to get the changed datamap on the watch (using the DataChanged event), it comes back as null. Not a surprise, because there are a few things I don't quite understand yet, like what the Tag parameter is used for.

It's made harder by not having a real debug system on the watch. (I am debugging using the Bridge for the phone, but on the watch side I'm just using occasional toast messages.) Is there a better way?

In case it's useful, here is the relevant part of the watch code:

B4X:
Sub Globals
    Private const PATH_MASTER As String = "/masterList"
    Private WDL As WearableDataLayer
    Private masterWDM As WearableDataMap
    Private currentNode As Map                     'Holds the last connected node so we can send to it
End Sub

Sub Activity_Create(FirstTime As Boolean)
    WDL.Initialize("WDL")
    masterWDM.Initialize
End Sub

Sub WDL_Connected
    WDL.GetConnectedNodes                                    'Get Connected nodes to send a msg
End Sub

Sub WDL_NodeResults(Results As List)
    For i = 0 To Results.Size - 1
        currentNode = Results.Get(i)
    Next
End Sub

Sub WDL_DataChanged(ChangedItems As Map, DeletedItems As Map)
    WDL.GetDataMap2(currentNode.Get("ID"), PATH_MASTER, "/masterList")   'not sure what I should supply for the Tag string
End Sub

Sub WDL_DataMapResults(Success As Boolean, Results As Map)
'    ToastMessageShow("WDL_DataMapResults: " & Success, False)
    masterWDM = Results.Get(PATH_MASTER)        'returns null
    etc.
End Sub
 
Last edited:

barx

Well-Known Member
Licensed User
Longtime User
Is there a working example of exchanging data using datamaps?

I'm trying to get a simple test working, and have so far got a datamap on the phone added to the Wear network, and detected as changed on the watch.

But when I try to get the changed datamap on the watch (using the DataChanged event), it comes back as null. Not a surprise, because there are a few things I don't quite understand yet, like what the Tag parameter is used for.

It's made harder by not having a real debug system on the watch. (I am debugging using the Bridge for the phone, but on the watch side I'm just using occasional toast messages.) Is there a better way?

In case it's useful, here is the relevant part of the watch code:

B4X:
Sub Globals
    Private const PATH_MASTER As String = "/masterList"
    Private WDL As WearableDataLayer
    Private masterWDM As WearableDataMap
    Private currentNode As Map                     'Holds the last connected node so we can send to it
End Sub

Sub Activity_Create(FirstTime As Boolean)
    WDL.Initialize("WDL")
    masterWDM.Initialize
End Sub

Sub WDL_Connected
    WDL.GetConnectedNodes                                    'Get Connected nodes to send a msg
End Sub

Sub WDL_NodeResults(Results As List)
    For i = 0 To Results.Size - 1
        currentNode = Results.Get(i)
    Next
End Sub

Sub WDL_DataChanged(ChangedItems As Map, DeletedItems As Map)
    WDL.GetDataMap2(currentNode.Get("ID"), PATH_MASTER, "/masterList")   'not sure what I should supply for the Tag string
End Sub

Sub WDL_DataMapResults(Success As Boolean, Results As Map)
'    ToastMessageShow("WDL_DataMapResults: " & Success, False)
    masterWDM = Results.Get(PATH_MASTER)        'returns null
    etc.
End Sub


Hi Dave

I haven't looked at this for a while. I have had a look at my code and indeed had a project that uses a datamap and although I cannot vouch for it's xompletness, it should give you a good idea.

I seem to remember it working.

https://db.tt/52WtEwGyvj

I will be working away from home through the week but I will try to help a little more next weekend if you don't get any joy. Sorry I cannot help much more at the moment.
 

Dave O

Well-Known Member
Licensed User
Longtime User
Hi @barx, thanks for that. I've already found a few ideas in there that I can explore.

One quick note:

Your example shows this event: DataMapResult(Success As Boolean, DataMap As WearableDataMap)

...which is different from the documented event: DataMapResults(Success As Boolean, Results As Map)

I tried your event signature, but it didn't respond, whereas the documented one does.

I couldn't get this example to run properly, but I haven't spent much time on it yet. Stay tuned.

Thanks again!
 

Dave O

Well-Known Member
Licensed User
Longtime User
Update: I finally got my datamaps working using WearableListener and WearableDataLayer. Woohoo!

One tip is to be careful where you define your event handlers (e.g. MessageReceived).

Because I was using 2 activities on the watch, I found it was easiest to define a separate WearableDataLayer for each activity. This made it clear which event handler would be called in which activity.

Will post some example code soon, but it was good to figure out some of the basics beyond the examples given so far. :)
 

rkwan

Member
Licensed User
Hello All,
I am a newbie in this B4X community as I just purchased the tool yesterday even though I used the trial version a bit.
And so I find that the works here are very interesting and thanks for all the great works for me to try!
I have a Samsung S5 phone with Android 4.4.2 and Moto360 1st Gen.
After using the new .lib from post #147, I can build the phone wearable dynamice message app ok
and can see that it got the node from Moto360.
However, when I am trying to compile for the Moto360 side, it takes a much longer time to download/install now...not sure if correct behavior or not?!
And then, it would fail at the end with the log:-

upload_2017-3-14_11-53-59.png


Any suggestion on what may be wrong please?!

I know that my Android SDK environment may have become messy after all the trials and errors to get to this point now!

P.S. Corresponding Phone side log here:-

upload_2017-3-14_12-1-2.png


Thanks & Best Regards,
Robert
 
Last edited:

mfstuart

Active Member
Licensed User
Longtime User
Examples

Each app that is made for Android Wear essentially contains 2 apps. One for the Wearable and one for the Mobile. the examples will come with both apps and the wearable pre-embedded in the mobile app.

Unfortunately it appears the examples will be too large to upload here so for now I will add them to my DropBox account and post links. If anybody knows a better solution........

Example 1: Simple messages with static listener

Very simple example show one way messages from mobile to wearable. the wearable uses a static listener so messages are received even if the app is closed. This example simply creates a ToastMessageShow() to show the message.

Download Link

Example 2: Simple messages with dynamic listener

Similar to example 1 but this one uses dynamic listener. This means that the messages will only be received on the wearable when the app is active. For anyone that doesn't know yet, to start an app: tap the screen, scroll down to bottom and pat 'Start', find the app and tap it to launch...

Download Link
Tried downloading the examples from Dropbox, but the "box" doesn't exist.
Where can I get the examples for this?

Thanx,
Mark Stuart
 
Top