Thoughts, stories and ideas.

Building location triggered notifications ๐Ÿ”” using GeoSpark Android SDK

Ekambaram

This article explains the methods to build an application that triggers notifications based on location using GeoSpark Android SDK.

Step 1: Install SDK

Open Android Studio, start a new Android Studio project and create a project.

Select minimum SDK Android 4.1.

Select Empty Activity and finish.

Install the SDK to your project via Gradle in Android Studio and add the dependencies below in your app build.gradle file.

android { 
         
         defaultConfig{ 
         targetSdkVersion 28 
         } 
         compileOptions { 
                 sourceCompatibility JavaVersion.VERSION_1_8 
                 targetCompatibility JavaVersion.VERSION_1_8 
         } 
         
 } 
 dependencies { 
         implementation 'com.geospark.android:geospark:1.5' 
 }

Step 2: Set DeviceToken

Set FCM DeviceToken to create a user. If you haven't set FCM DeviceToken already, then add Firebase to your Android project.

GeoSpark.setDeviceToken(this, "FCM DeviceToken");

Step 3: Initialize SDK

Sign up here to create an account with GeoSpark. Post signup, you can create your first project from the dashboard screen.

Once you have created your project, you can add App Name, Package Name and create Android applications. You can get the publishable key from your project settings page which has to be used while integrating the SDK with your application.

In onCreate method of your Application class, Initialize the SDK with your PublishableKey.

public class MainApplication extends Application {
	@Override
	public void onCreate() {
		super.onCreate();
        GeoSpark.initialize(this, "PUBLISHABLE_KEY");
    }
}   

Step 4: Create GetStartedActivity.java

Create getstartedactivity.xml and add a TextView.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/txt_getstarted"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="20dp"
        android:background="#303F9F"
        android:gravity="center"
        android:text="GetStarted"
        android:textColor="#FFF"
        android:textSize="16sp" />

</RelativeLayout>

Now create a GetStartedActivity.java ย and add GeoSpark createUser() method inside your onClickListener of the Button, to create a user which returns UserID. The SDK needs a UserID object to identify the device.

To enable location, call ย requestLocationPermissions and requestLocationServices method. For Android 6.0 and above, calling this method will trigger a location permission popup that the user has to allow and startTracking the user location.

TextView txt_GetStarted = findViewById(R.id.txt_notify_here);
txt_GetStarted.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
	 GeoSpark.createUser(GetStartedActivity.this, "Set Description", 
	  new GeoSparkCallBack() {
	  @Override
	  public void onSuccess(GeoSparkUser geoSparkUser) {
		if (!GeoSpark.checkLocationPermission(getApplicationContext())) {
				GeoSpark.requestLocationPermission(GetStartedActivity.this);
		} else 
			if(!GeoSpark.checkLocationServices(getApplicationContext())) {
               GeoSpark.requestLocationServices(GetStartedActivity.this);
		} else {
			GeoSpark.startTracking(getApplicationContext());
			startActivity(new Intent(getApplicationContext(),
										MainActivity.class));
        }
	 }
	 @Override
	 public void onFailure(GeoSparkError geoSparkError) {
				geoSparkError.getErrorCode();
				geoSparkError.getErrorMessage();
			}
	});
  }
});

Step 5: Create MainActivity.java

Add Google Map SDK in MainActivity.java. Add Marker Image in centre of Google Map in main_activity.xml to get location co-ordinates.

@Override
public void onCameraIdle() {
	if (mMap.getCameraPosition().target.latitude != 0.0 && mMap.getCameraPosition().target.longitude != 0.0) {
mMap.getCameraPosition().target.latitude//Get latitude from center of map
mMap.getCameraPosition().target.longitude//Get longitude from center of map
    }
}

Use GeoSpark's createGeofence, geofenceList and deleteGeofence method to manage geofence data like (Latitude, Longitude, ExpireTime and Radius) in GeoSpark server.

Create Geofence

Make sure radius should be (50 -1000 meters) and set expiry time less than 24hrs.

GeoSpark.createGeofence(this, latitude, longitude, radius, expireInSeconds,
  new GeoSparkGeofenceCallBack() {
     @Override
     public void onSuccess(GeoSparkGeofence geoSparkGeofence) {
                         geoSparkGeofence.getId();
                         geoSparkGeofence.getCreatedAt();
                         geoSparkGeofence.getExpiresAt();
                         geoSparkGeofence.getCoordinates();
                         geoSparkGeofence.getRadius();
     }
     @Override
     public void onFailure(GeoSparkError geoSparkError) {
                         geoSparkError.getErrorCode();
                         geoSparkError.getErrorMessage();
     }
});    

Geofence List

GeoSpark.geofenceList(this, new GeoSparkGeofenceCallBack() {
     @Override
     public void onSuccess(GeoSparkGeofence geoSparkGeofence) {
                  geoSparkGeofence.getGeofenceList();
     }
     @Override
     public void onFailure(GeoSparkError geoSparkError) {
                   geoSparkError.getErrorCode();
                   geoSparkError.getErrorMessage();
     }
});

Delete Geofence

GeoSpark.deleteGeofence(this, "GeofenceId", new GeoSparkGeofenceCallBack(){
      @Override
      public void onSuccess(GeoSparkGeofence geoSparkGeofence) {
          geoSparkGeofence.getId();
          geoSparkGeofence.getMessage();
      }
      @Override
      public void onFailure(GeoSparkError geoSparkError) {
          geoSparkError.getErrorCode();
          geoSparkError.getErrorMessage();
      }
});  

Step 6: Add Notification Message

Add a Local Notification message to notify when user reaches the geofence area.

Step 7: Trigger Notification

Get the user location from GeoSparkReceiver and compare it with the already created geofence Location. If user location is inside geofence radius, trigger a local Notification.

public class MyGeoSparkReceiver extends GeoSparkReceiver {
    @Override
    public void onLocationUpdated(Context context, Location location,
                GeoSparkUser geoSparkUser, String activity){
   // Compare created geofence location with user location to trigger 		    // notification.
  }
}

Now your application for location triggered notifications is successfully built.

Share โ€” twitter/ facebook/ copy link