B4A Library Google Plus SDK Wrapper + Native Google +1Button

Introduction

This is my second contribution to the discovery of the decade (#b4a-rocks) and the fun continues!

Used SocialApi classes:
  • GooglePlusProvider: A non activity object that must be declared in any Sub Process_Globals.
  • GooglePlusOneButton: A CustomView (implements DesignerCustomView) that can be used design-time.
  • SocialApiActivity: An activity object that can be only declared in a Sub Globals and is used to bind a GooglePlusProvider object to an activity through the GooglePlusProvider.SetActivity method.
Getting started
  1. Download the latest socialapi package, extract it anywhere on your hard disk and note the folder name.
  2. Copy the wrapper files (jar + xml) in the socialapi folder into your B4A Libraries folder.
  3. Each sample in the socialapi\googleplus\samples folder has AdditionalRes and AdditionalJar directives that have to be changed. Change the C:\b4a-dev folder to where you have extracted the socialapi archive.

The samples folder contains:
  • Sample1: Quick start sample that can be used as a bare-bone template for your new apps
Step-by-step new app tutorial (based on Sample1)

1. Add following code to your manifest:
B4X:
AddApplicationText(
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>)


2. Add following directives to your project's main file:
B4X:
#AdditionalRes: <your-installation-folder>\socialapi\googleplus\sdk\res, com.google.android.gms
#AdditionalJar: <your-installation-folder>\socialapi\googleplus\sdk\gplussdk.jar


3. Select the SocialApi library from the list of the available libraries in the IDE. Declare a GooglePlusProvider and a SocialApiActivity object in Sub Process_Globals and Sub Globals respectively
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

    Dim GooglePlus As GooglePlusProvider
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Dim ThisActivity As SocialApiActivity
End Sub


4. Drop a CustomView in the designer and set the CustomType property to GooglePlusOneButton. Then, Generate a Click handler.

upload_2014-7-2_19-50-26.png
upload_2014-7-2_19-50-35.png

B4X:
Sub BtnPlusOne_Click
    Log("+1 Clicked!")
End Sub


5. Call the GooglePlusProvider.SetActivity method in your Sub Activity_Resume in order to bind the GooglePlusProvider instance to the current activity passing the name of the event that will be raised every time the GooglePlus session changes. Also, call the BtnPlusOne.SetUrl to set the button's destination url.
B4X:
Sub Activity_Resume
    BtnPlusOne.SetUrl("http://www.b4x.com")
    GooglePlus.SetActivity(ThisActivity.Initialize("googleplus"))
End Sub


6. Create your event handlers
B4X:
Sub GooglePlus_Event (Provider as SocialApiProvider)
    BtnConnect.Enabled = Not(Provider.Connected)
    BtnDisconnect.Enabled = Provider.Connected
End Sub

Sub GooglePlust_Connected (Provider as SocialApiProvider)
    Msgbox(Provider.Me, "!")
End Sub

Sub GooglePlus_Disconnected (Provider as SocialApiProvider)
    Msgbox("Bye bye!", "JustDisconnected!")
End Sub

Sub GooglePlust_Failed (Provider as SocialApiProvider)
    If Msgbox2("Failed to actualize your details."&CRLF&CRLF&"Retry?", "Error", "Yes", "No", "", Null) = DialogResponse.POSITIVE Then
        Provider.Retry
    End If
End Sub


7. Create the login/logout handlers. The login and logout actions are performed asynchronously
B4X:
Sub BtnConnect_Click
    GooglePlus.Login
End Sub

Sub BtnDisconnect_Click
    GooglePlus.Logout
End Sub


8. Do something and evaluate the result
B4X:
Sub BtnGetPeopleVisible_Click
    GooglePlus.PleaseWaitText = "Getting people information"
    Dim Result As GooglePlusResult = GooglePlus.GetPeopleVisible
    Msgbox(Result, "Done")
End Sub

Sub BtnGetPeople_Click
    GooglePlus.PleaseWaitText = "Getting Erel's and Periklis' details"
    Dim Result As GooglePlusResult = GooglePlus.GetPeople(Array As String ("102781867331980802136", "+PeriklisKoutsogiannis"))
    Msgbox(Result, "Done")
End Sub

Done! Now we have to setup our app in our Google+ developer dashboard.

Setup our app in the Google+ developer dashboard (courtesy of androidhive.info)

1. Get your SHA1 fingerprint from B4A IDE

sha-jpg.26015


2. Open Google APIs console and on the left, under APIs & auth section, click on APIs and on the right enable Google+ API service.

google-console-api-google-plus.png


3. Now again on the left, click on Credentials and on the right, click on CREATE NEW CLIENT ID button. It will open a popup to configure a new client id.

google-console-creating-new-client-id.png


4. In the popup, select Installed application as Application type. Under Installed application type section select Android and give your project package name. This package name should be equal to your android project. For the sake of the example the package name is info.androidhive.gpluslogin. Enter your SHA1 fingerprint (from step 1) in Signing certificate fingerprint (SHA1) field and enable Deep Linking and click on Create Client ID button.

google-api-console-creating-new-client-id.png


5. Now you should see a new client created for your android application.

google-api-client-id.png


Done! You are ready to go! :D


Useful links

Please test and post any feedback, questions, comments you may have!
That's all for now folks!~


Version history until SocialApi 2.3

2.3
  • Restructured again into a single package (socialapi) after finding out how to properly use the #AdditionalRes directive to avoid conflict with other b4a libraries
2.2
  • Restructured due to a conflict with AdMod library and GooglePlusProvider has its own package
2.0
  • Now part of the SocialApi unified wrapper library
  • Major code refactoring
  • Renamed: GooglePlus -> GooglePlusProvider
  • Renamed: WrapperActivity -> SocialApiActivity
  • Renamed: WrapperActivity.Initialize -> SocialApiActivity.GetWithEvent
  • Added: Google +1 button custom view
1.2
  • Change: Complete code refactoring. Now using our SocialApiWrapper library that provides common functionality to our SDK wrappers
1.1
  • Added: GooglePlus.GetPeopleVisible
1.0
  • Initial version
 

Attachments

  • sample1-2.jpg
    sample1-2.jpg
    26.3 KB · Views: 701
  • sha.jpg
    sha.jpg
    91.5 KB · Views: 799
  • sample1-1.png
    sample1-1.png
    64.9 KB · Views: 489
  • sample1-3.png
    sample1-3.png
    82.3 KB · Views: 357
Last edited:

Douglas Farias

Expert
Licensed User
Longtime User
thx man + 1 lib social on b4a very very good.
now basic4android will increase their users even more.
 

Periklis Koutsogiannis

Active Member
Licensed User
Longtime User
Update: 1.1

Updated files: googleplus.zip [wrapper: YES samples: YES]

  • Added: GooglePlus.GetPeopleVisible
 
Last edited:

GMan

Well-Known Member
Licensed User
Longtime User
I get an error when compiling:
resource directory C:\b4a-dev\gplussdk\res does not exist

Solved

Works fine - thx for sharing
Δουλεύει μια χαρά - thx για την ανταλλαγή :)
 
Last edited:

Periklis Koutsogiannis

Active Member
Licensed User
Longtime User
You missed this from the initial thread:

All samples have 1 AdditionalRes and 2 AdditionalJar directives that have to be changed. Change the C:\b4a-dev folder to where you have placed the google+ sdk package.
 

Periklis Koutsogiannis

Active Member
Licensed User
Longtime User
B4X:
#AdditionalRes: <your-gplussdk-folder-here>\res

#AdditionalJar: <your-gplussdk-folder-here>\gplussdk.jar
#AdditionalJar: <your-gplussdk-folder-here>\android-support-v4.jar 'Remove this if already in your build path
 

GMan

Well-Known Member
Licensed User
Longtime User
Yo, complete reading something is often useful ;)
 

Periklis Koutsogiannis

Active Member
Licensed User
Longtime User
Update: 1.2

Updated files: googleplus.zip [wrapper: YES samples: YES]

  • Change: Complete code refactoring. Now using our SocialApiWrapper library that provides common functionality to all SDK wrappers

How to migrate from previous versions:
  1. Select the SocialApiWrapper library from the list of the available libraries in the IDE along with the GooglePlus library.
  2. Change all GooglePlusActivity types in your projects to WrapperActivity
Done!
 
Last edited:

Douglas Farias

Expert
Licensed User
Longtime User
hi @Periklis Koutsogiannis
i m trying to add facebook + google and i have this error
my manifest is = your sample example


i have error on this line
GP.SetActivity(CurrentActivity.Initialize("googleplus_statuschanged_event"))

here is the log
(Intent) Intent { act=android.intent.action.MAIN flg=0x20000000 cmp=click.fight.vallow/.main }
no extras
** Activity (main) Pause, UserClosed = false **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
[Facebook] new Session
Error occurred on line: 54 (main)
java.lang.IllegalStateException: The meta-data tag in your app's AndroidManifest.xml does not have the right value. Expected 4452000 but found 4323000. You must have the following declaration within the <application> element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
at com.google.android.gms.common.GooglePlayServicesUtil.t(Unknown Source)
at com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(Unknown Source)
at com.google.android.gms.internal.ff.connect(Unknown Source)
at com.google.android.gms.common.api.b.connect(Unknown Source)
at com.datasteam.b4a.googleplus.GooglePlus.internalLogin(GooglePlus.java:146)
at com.datasteam.b4a.googleplus.GooglePlus.SetActivity(GooglePlus.java:77)
at click.fight.vallow.main._activity_resume(main.java:341)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:636)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:305)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:238)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:121)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:158)
at click.fight.vallow.main.afterFirstLayout(main.java:104)
at click.fight.vallow.main.access$100(main.java:16)
at click.fight.vallow.main$WaitForLayout.run(main.java:76)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
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:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
** Activity (main) Resume **
 

GMan

Well-Known Member
Licensed User
Longtime User
Did you already create an APP, ID etc in Google+ or Facebook ?
 

Douglas Farias

Expert
Licensed User
Longtime User
facebook is working only google no
i have make all steps
my problem is here
#AdditionalRes: C:\b4a-dev\gplussdk\res
in the xml
 

GMan

Well-Known Member
Licensed User
Longtime User
The meta-data tag in your app's AndroidManifest.xml does not have the right value. Expected 4452000 but found 4323000. You must have the following declaration within the <application> element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
The error message is clear at all, but if you have the correct manifest i couldnt imagine, what this error means
 

Douglas Farias

Expert
Licensed User
Longtime User
yes i know
my app is = the sample

here is the my manifest editor
AddManifestText(
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14"/>
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
'End of default text.

AddApplicationText(
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/app_id"/>
<activity
android:name="com.facebook.LoginActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name"/>)

AddApplicationText(
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />)


here is the sample google manifest editor
AddManifestText(
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14"/>
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
'End of default text.

AddApplicationText(
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />)
 

GMan

Well-Known Member
Licensed User
Longtime User
Yo, i am using the same sample, only the targetSdk differes:
AddManifestText(
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="19"/>
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
'End of default text.

AddApplicationText(
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />)
 
Top