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: 607

Raywingit

Member
Licensed User
Longtime User
To answer my own question, yes the environment is broken. Finally got caught in the Android quicksand.
Plan A: Abandon this computer, try again on a new one. Back in a week.
 

canalrun

Well-Known Member
Licensed User
Longtime User
Hello,
I'm the one who posted the example in post #80. Unfortunately I have not looked at Wearables in about a year. I'm also still using version 4.30 of B4A so I am not able to tell if it's a compiler or Google Services incompatibility. I do remember that there were some things that had to be "just so" for the Wearable stuff to work.

Have you gotten any of the other examples, from barx for example, to work?

Someone who is still involved with Wearables and is up-to-date on B4A would be in a much better position to offer assistance.

Barry.
 

Raywingit

Member
Licensed User
Longtime User
Thanks for the responses, I was busy playing with my latest HP.

Success: First I got computer 2 loaded with Java, Studio, B4A, and went through all the setting up. My original app loaded OK on computer 2.
Second, I attacked computer 1 with all the suggestions for a Packaging Files Error, to try and fix it.
Try different Android.jar files - no luck
Clean the project - no luck
Get rid of unwanted files hanging about - no luck
Finally I downloaded the new B4A version 6 - and it works again. No progress yet on example # 80.

On the wearables, in case someone wants to help, I have an app that shows a new screen image every 10 minutes or so, and I would like to
extend it to a square watch. My plan is to modify the CRWear example to do an image transfer, then marry the 2 apps together.
 

canalrun

Well-Known Member
Licensed User
Longtime User
...
My plan is to modify the CRWear example to do an image transfer, then marry the 2 apps together.

Glad you got things working.
You mentioned doing an image transfer.
After getting the CRWear example to work, you may want to take a look at the DMWear example in post #88. This example does a file transfer. It uses a data structure that was intended for larger transfers, such as an image file.

Barry.
 

techknight

Well-Known 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 the Dynamic listener, Soon as the app starts on the tablet I get this twice:

** Activity (main) Create, isFirst = true **
main_activity_create (java line: 338)
java.lang.NoClassDefFoundError: android.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.example.dynamicmessage.main._activity_create(main.java:338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
at barxdroid.wearable.example.dynamicmessage.main.afterFirstLayout(main.java:102)
at barxdroid.wearable.example.dynamicmessage.main.access$000(main.java:17)
at barxdroid.wearable.example.dynamicmessage.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
main_activity_create (java line: 338)
java.lang.NoClassDefFoundError: android.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.example.dynamicmessage.main._activity_create(main.java:338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
at barxdroid.wearable.example.dynamicmessage.main.afterFirstLayout(main.java:102)
at barxdroid.wearable.example.dynamicmessage.main.access$000(main.java:17)
at barxdroid.wearable.example.dynamicmessage.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
** Activity (main) Create, isFirst = true **
main_activity_create (java line: 338)
java.lang.NoClassDefFoundError: android.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.example.dynamicmessage.main._activity_create(main.java:338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
at barxdroid.wearable.example.dynamicmessage.main.afterFirstLayout(main.java:102)
at barxdroid.wearable.example.dynamicmessage.main.access$000(main.java:17)
at barxdroid.wearable.example.dynamicmessage.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
main_activity_create (java line: 338)
java.lang.NoClassDefFoundError: android.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.example.dynamicmessage.main._activity_create(main.java:338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
at barxdroid.wearable.example.dynamicmessage.main.afterFirstLayout(main.java:102)
at barxdroid.wearable.example.dynamicmessage.main.access$000(main.java:17)
at barxdroid.wearable.example.dynamicmessage.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
 

techknight

Well-Known Member
Licensed User
Longtime User
I copied the android support v4 jar from the SDK folder to the B4A Library folder, the one for B4A was 2012. Wow, OLD.. .Why I dunno. anyways. that fixed that.

However every time I start the App, I get a new crash:

java.lang.NoSuchMethodError: com.google.android.gms.common.api.GoogleApiClient.connect
at barxdroid.wearabledatalayer.WearableDataLayer.Connect(WearableDataLayer.java:94)
at barxdroid.wearable.example.dynamicmessage.main._activity_resume(main.java:352)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
blah blah blah


The Wearable app used to run saying "Listening" But as soon as I recompiled it (basically to change it to my key) It now crashes too! WTF

Watch crash:
java.lang.IncompatibleClassChangeError: The method 'void com.google.android.gms.common.api.GoogleApiClient.connect()' was expected to be of type interface but instead was found to be of type virtual (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)
at barxdroid.wearabledatalayer.WearableDataLayer.Connect(WearableDataLayer.java:94)
at barxdroid.wearable.example.dynamicmessage.main._activity_resume(main.java:352)
at java.lang.reflect.Method.invoke(Native Method)
 

techknight

Well-Known Member
Licensed User
Longtime User
I had to go back to a REALLY OLD version of google play services r21 instead of r29. So this library needs a serious update to keep up :-(
 

postasat

Active Member
Licensed User
Longtime User
Hi,
I'm trying to use the example in the post #2 but I have a problem.
Im using BA6, Java 1.8, Android.jar 21 and Play services 21.

When I launch the app after install, on the smartphone and on the watch (LG W100) I have this message:
androidmanifest.xml does not have the right value
There is a diference between play services.

How can I solve it ? where I'm wrong ?

Thank you.
 

barx

Well-Known Member
Licensed User
Longtime User
Hi,
I'm trying to use the example in the post #2 but I have a problem.
Im using BA6, Java 1.8, Android.jar 21 and Play services 21.

When I launch the app after install, on the smartphone and on the watch (LG W100) I have this message:
androidmanifest.xml does not have the right value
There is a diference between play services.

How can I solve it ? where I'm wrong ?

Thank you.
it is likely that the version in your additional libraries and the version pointed to in the manifest are different.
 

barx

Well-Known Member
Licensed User
Longtime User
I had to go back to a REALLY OLD version of google play services r21 instead of r29. So this library needs a serious update to keep up :-(
I will be looking into this. GPS is supposed to be backwards compatible and so nothing should break.
 

techknight

Well-Known Member
Licensed User
Longtime User
So far I havent had any issues since rolling back google play services. R29 crashes with what I had posted above, and r30 has a totally different file layout not compatible with anything here. which has been documented in other threads.

From what I gathered in r29, the "com.google.android.gms.common.api.GoogleApiClient.connect" method is gone, doesnt exist anymore. likely replaced by something else. r30 I couldnt even begin to fathom.

Read this:
https://www.reddit.com/r/androiddev/comments/3mehbb/breaking_changes_in_google_play_services_81/
 
Last edited:

Raywingit

Member
Licensed User
Longtime User
An update for my post 124. No progress yet.
My situation is that I travel for work, randomly, word-wide, so my dev. environment only exists for short periods.
This cycle, I am on google-play-services 31. Posts elsewhere suggest google-play-services is not an issue if using
B4A version 6.0, which I also have. However, it is an issue for me in this case.
Where I seem to be stuck, is the example of CR Wear seems to have several references to google-play-services and
I can't untangle those or substitute alternatives. It might be I don't have the library configure paths sorted?
Something like an updated test app using B4A 6.0 and the (latest?) GPS would be really useful.
By the way, I got my first App onto the play store: DarkSide - Ray Wells
Without B4A it would still be stuck in Excel and I'd be fighting with Studio.
 

Raywingit

Member
Licensed User
Longtime User
Update 2: While working to get SOMETHING transferring to my LG watch, it decided to update itself,
and the new OS appears to have google play services available:
Settings - Permissions - Google Play Services - 8 items listed
Settings - Permissions - System Permissions - Google Services Framework and Package Access Helper.
 

postasat

Active Member
Licensed User
Longtime User
Hi,
I tried to use google play services 31 following the new Erel instruction, but I have this error when compile mobile app:

Compiling generated Java code. Error
B4A line: 41
DL.Initialize(\
javac 1.8.0_60
src\barxdroid\wearable\example\dynamicmessage\main.java:338: error: cannot access DataApi
mostCurrent._dl.Initialize(processBA,"DL");
^
class file for com.google.android.gms.wearable.DataApi not found
1 error

There is a solution ?
 

tpakis

Active Member
Licensed User
Longtime User
Hello @barx , any news about updating this library to work with r31 google play services? Because with the latest firebase updates, we are forced to use the latest version.
 

barx

Well-Known Member
Licensed User
Longtime User
Hi people, Sorry I haven't replied to this for a good while. I have been trying to figure out what is going on.

Anyway, it turns out that google changed the google-pplay-services.jar file from version 30 onwards. The google-play-services.jar file that this lib depends on is now split up into multiple .aar files. I have no idea how to utilize these. From what bit I have read, the option is to stick to earlier versions when using eclipse environment, which is what it typically used for b4a libs.

Again I have no idea how to create libs in android studio. Sorry to be such a let down, It was not intensional.
 

DonManfred

Expert
Licensed User
Longtime User
If you want you can share your java code with me. Maybe private message.
I ll check it and see to get it compiled with SLC and the new maven repository
 

tpakis

Active Member
Licensed User
Longtime User
Hi people, Sorry I haven't replied to this for a good while. I have been trying to figure out what is going on.

Anyway, it turns out that google changed the google-pplay-services.jar file from version 30 onwards. The google-play-services.jar file that this lib depends on is now split up into multiple .aar files. I have no idea how to utilize these. From what bit I have read, the option is to stick to earlier versions when using eclipse environment, which is what it typically used for b4a libs.

Again I have no idea how to create libs in android studio. Sorry to be such a let down, It was not intensional.

We thank you for the excellent library and the time invested in it! :) I hope another member can help in its update-development.
 
Top