Android SDK
The Radar SDK abstracts away cross-platform differences between location services, allowing you to add geofencing, location tracking, trip tracking, geocoding, and search to your apps with just a few lines of code.
Learn how to integrate the Android SDK below. You can also see the source and a detailed SDK reference on GitHub.
#
Install SDKThe best way to add the SDK to your project is via Gradle in Android Studio.
The SDK is small and typically adds less than 500 KB to your compiled app.
#
Gradle (recommended)The SDK is distributed using Maven Central.
Add the SDK to the dependencies
section of your app's build.gradle
file:
dependencies { implementation 'io.radar:sdk:3.18.+'}
#
Add manuallyYou can also add the SDK to your project manually. Download the current release and unzip the package. The package contains an aar
file. In Android Studio, add the SDK as a module using File > New Module > Import .JAR/.AAR Package.
#
DependenciesThe SDK depends on Google Play Services Location version 21.0.1
and higher, which will be automatically included as a transitive dependency by Gradle. Learn more about managing dependencies in Gradle here.
If you haven't already configured your project for Google Play Services, follow the instructions here.
As of version 3.8.0
, the SDK uses play-services-location:21.0.1
. If another dependency that depends on play-services-location
is causing version conflicts, you can exclude the transitive dependencies and include the play-services-location
dependency at the project level instead. We strongly recommend using 21.0.1
or higher.
As an alternative to Google Play Services, the SDK also optionally supports Huawei Mobile Services.
The SDK currently supports API level 16
or above.
#
Initialize SDKWhen your app starts, in application onCreate()
, initialize the SDK with your publishable API key, found on the Settings page.
Use your Test Publishable
key for testing and non-production environments. Use your Live Publishable
key for production environments.
- Java
- Kotlin
import io.radar.sdk.Radar;
public class MyApplication extends Application {
@Override public void onCreate() { super.onCreate();
Radar.initialize(this, "prj_test_pk_..."); }
}
import io.radar.sdk.Radar
class MyApplication : Application() {
override fun onCreate() { super.onCreate()
Radar.initialize(this, "prj_test_pk_...") }
}
#
Request permissionsRadar respects standard Android location permissions.
For foreground tracking or trip tracking with continuous mode, Radar requires the ACCESS_FINE_LOCATION
permission for precise location and/or the ACCESS_COARSE_LOCATION
permission for approximate location. These permissions are automatically added by the SDK manifest along with the INTERNET
, ACCESS_NETWORK_STATE
, FOREGROUND_SERVICE
, and RECEIVE_BOOT_COMPLETED
permissions.
For background tracking or geofencing with responsive mode, and if targeting API level 29
or above, Radar also requires the new ACCESS_BACKGROUND_LOCATION
permission. You must add the ACCESS_BACKGROUND_LOCATION
permission to your manifest manually. To start a foreground service or use the continuous
tracking preset, you must add the FOREGROUND_SERVICE_LOCATION
permission:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
</manifest>
To request foreground and background permissions:
- Java
- Kotlin
import android.Manifest;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.pm.PackageManager;import android.os.Build;
import androidx.core.app.ActivityCompat;
import io.radar.sdk.Radar;
public class MainActivity extends AppCompatActivity { private final int FOREGROUND_LOCATION_PERMISSION_CODE = 1; private final int BACKGROUND_LOCATION_PERMISSION_CODE = 2;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Radar.initialize(this, "prj_test_pk_.."); requestLocationPermissions(); }
private void requestLocationPermissions() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION}, BACKGROUND_LOCATION_PERMISSION_CODE); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, FOREGROUND_LOCATION_PERMISSION_CODE); } } }
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == FOREGROUND_LOCATION_PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { askPermissionForBackgroundUsage(); } return; } }
private void askPermissionForBackgroundUsage() { if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)) { new AlertDialog.Builder(this) .setTitle("Background location permissions needed") .setMessage("Background location permissions needed, tap \"Allow all the time\" on the next screen") .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, BACKGROUND_LOCATION_PERMISSION_CODE); } }) .create() .show(); } }}
import android.Manifestimport android.app.AlertDialogimport android.content.pm.PackageManagerimport android.os.Build
import androidx.core.app.ActivityCompat
import io.radar.sdk.Radar
class MainActivity : AppCompatActivity() { private val foregroundLocationPermissionsRequestCode = 1 private val backgroundLocationPermissionsRequestCode = 2
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Radar.initialize(this, "prj_test_pk_...") requestLocationPermissions() }
private fun requestLocationPermissions() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION), backgroundLocationPermissionsRequestCode) } else { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION), foregroundLocationPermissionsRequestCode) } } }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == foregroundLocationPermissionsRequestCode && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)) { AlertDialog.Builder(this) .setTitle("Background location permissions needed") .setMessage("Background location permission needed, tap \"Allow all the time\" on the next screen") .setPositiveButton( "OK" ) { _, _ -> ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), backgroundLocationPermissionsRequestCode) } .create() .show() } } }}
#
Foreground trackingOnce the user has granted foreground permissions, you can track the user's location in the foreground.
To track the user's location in the foreground, call:
- Java
- Kotlin
Radar.trackOnce(new RadarTrackCallback() { @Override public void onComplete(RadarStatus status, Location location, RadarEvent[] events, RadarUser user) { // do something with location, events, user }});
Radar.trackOnce { status, location, events, user -> // do something with location, events, user}
You may provide an optional instance of RadarTrackCallback
with an implementation of onComplete()
that receives the request status, the user's location, the events generated, if any, and the user. The request status can be:
RadarStatus.SUCCESS
: successRadarStatus.ERROR_PUBLISHABLE_KEY
: SDK not initializedRadarStatus.ERROR_PERMISSIONS
: location permissions not grantedRadarStatus.ERROR_LOCATION
: location services error or timeout (10 seconds)RadarStatus.ERROR_NETWORK
: network error or timeout (10 seconds)RadarStatus.ERROR_BAD_REQUEST
: bad request (missing or invalid params)RadarStatus.ERROR_UNAUTHORIZED
: unauthorized (invalid API key)RadarStatus.ERROR_PAYMENT_REQUIRED
: payment required (organization disabled or usage exceeded)RadarStatus.ERROR_FORBIDDEN
: forbidden (insufficient permissions)RadarStatus.ERROR_NOT_FOUND
: not foundRadarStatus.ERROR_RATE_LIMIT
: too many requests (rate limit exceeded)RadarStatus.ERROR_SERVER
: internal server errorRadarStatus.ERROR_UNKNOWN
: unknown error
status
in the callback to see what went wrong.#
Background tracking for geofencingOnce you have initialized the SDK and the user has authorized background permissions, you can start tracking the user's location in the background.
The SDK supports custom tracking options as well as three presets.
For geofencing, we recommend using RadarTrackingOptions.RESPONSIVE
. This preset detects whether the device is stopped or moving. When moving, it tells the SDK to send location updates to the server every 2-3 minutes. When stopped, it tells the SDK to shut down to save battery. Once stopped, the device will need to move more than 100 meters to wake up and start moving again.
Assuming the user has authorized background permissions, background tracking will work even if the app has been backgrounded or killed, as Android location services will wake up the app to deliver events and the SDK uses JobScheduler
to schedule network requests.
To start tracking for geofencing, call:
- Java
- Kotlin
Radar.startTracking(RadarTrackingOptions.RESPONSIVE);
Radar.startTracking(RadarTrackingOptions.RESPONSIVE)
To determine whether tracking has been started, call:
- Java
- Kotlin
Radar.isTracking();
Radar.isTracking()
To stop tracking (e.g., when the user logs out), call:
- Java
- Kotlin
Radar.stopTracking();
Radar.stopTracking()
You only need to call these methods once, as these settings will be persisted across app sessions.
#
Background tracking for tripsFor trips, we recommend using RadarTrackingOptions.continuous
. This preset tells the SDK to send location updates to the server every 30 seconds, regardless of whether the device is moving.
Tracking for the duration of a trip is started or updated by including tracking options in the startTrip
call:
- Java
- Kotlin
Radar.startTrip(tripOptions, RadarTrackingOptions.CONTINUOUS, new Radar.RadarTripCallback() { @Override public void onComplete(@NonNull Radar.RadarStatus status, @Nullable RadarTrip trip, @Nullable RadarEvent[] events) { if (status == Radar.RadarStatus.SUCCESS) { // do something } else { // handle error } } });
Radar.startTrip(tripOptions, RadarTrackingOptions.CONTINUOUS) { status, trip, events -> if (status == Radar.RadarStatus.SUCCESS) { // do something } else { // handle error }}
If tracking was disabled before the trip started, it will stop after the trip ends. Otherwise, it will revert to the tracking options in use before the trip started:
- Java
- Kotlin
// Complete tripRadar.completeTrip(new Radar.RadarTripCallback() { @Override public void onComplete(Radar.RadarStatus radarStatus, RadarTrip radarTrip, RadarEvent[] radarEvents) { // do something }});
// Cancel tripRadar.cancelTrip(new Radar.RadarTripCallback() { @Override public void onComplete(Radar.RadarStatus radarStatus, RadarTrip radarTrip, RadarEvent[] radarEvents) { // do something }});
// Complete tripRadar.completeTrip { status, trip, events -> // do something}
// Cancel tripRadar.cancelTrip { status, trip, events -> // do something}
Learn more about starting, completing, and canceling trips in the trip tracking documentation.
#
Mock tracking for testingCan't go for a walk or a drive? You can simulate a sequence of location updates. For example, to simulate a sequence of 10 location updates every 3 seconds by car from an origin to a destination, call:
- Java
- Kotlin
Location origin = new Location("mock");origin.setLatitude(40.78382);origin.setLongitude(-73.97536);
Location destination = new Location("mock");destination.setLatitude(40.70390);destination.setLongitude(-73.98670);
Radar.mockTracking( origin, destination, Radar.RadarRouteMode.CAR, 10, 3, new RadarTrackCallback() { @Override public void onComplete(RadarStatus status, Location location, RadarEvent[] events, RadarUser user) { // do something with location, events, user } });
val origin = Location("mock")origin.latitude = 40.78382origin.longitude = -73.97536
val destination = Location("mock")destination.latitude = 40.70390destination.longitude = -73.98670
Radar.mockTracking( origin, destination, Radar.RadarRouteMode.CAR, 10, 3) { status, location, events, user -> // do something with location, events, user}
#
Location metadataThe SDK can also pass along information like motion activity detection, speed and heading via the location metadata field. Turn on useLocationMetadata
in your sdkConfiguration
to enable this feature.
Include permissions for motion activity detection in your manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /></manifest>
You will need to manually prompt for motion permissions with
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACTIVITY_RECOGNITION), 3)
- Java
- Kotlin
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, ACTIVITY_RECOGNITION_PERMISSION_CODE);
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACTIVITY_RECOGNITION), ACTIVITY_RECOGNITION_PERMISSION_CODE)
#
Listening for events with a receiverTo listen for events, location updates, and errors client-side, create a class that extends RadarReceiver
. Then, pass in an instance of your receiver when initializing the SDK in application onCreate()
.
- Java
- Kotlin
import io.radar.sdk.Radar;
public class MyApplication extends Application {
@Override public void onCreate() { super.onCreate();
MyRadarReceiver receiver = new MyRadarReceiver(); Radar.initialize(this, "prj_test_pk_...", receiver, Radar.RadarLocationServicesProvider.GOOGLE); }
}
import io.radar.sdk.Radar
class MyApplication : Application() {
override fun onCreate() { super.onCreate()
val receiver = MyRadarReceiver() Radar.initialize(this, "prj_test_pk_...", receiver, Radar.RadarLocationServicesProvider.GOOGLE) }
}
Your receiver should implement the following:
- Java
- Kotlin
public class MyRadarReceiver extends RadarReceiver {
@Override public void onEventsReceived(Context context, RadarEvent[] events, RadarUser user) { // do something with events, user }
@Override public void onLocationUpdated(Context context, Location location, RadarUser user) { // do something with location, user }
@Override public void onClientLocationUpdated(Context context, Location location, boolean stopped, RadarLocationSource source) { // do something with location, stopped, source }
@Override public void onError(Context context, RadarStatus status) { // do something with status }
@Override public void onLog(Context context, String message) { // print message for debug logs }
@Override public void onLocationPermissionStatusUpdated(context: Context,status: RadarLocationPermissionStatus) { // do something with location permission status }
}
class MyRadarReceiver: RadarReceiver() {
override fun onEventsReceived(context: Context, events: Array<RadarEvent>, user: RadarUser?) { // do something with events, user }
override fun onLocationUpdated(context: Context, location: Location, user: RadarUser) { // do something with location, user }
override fun onClientLocationUpdated(context: Context, location: Location, stopped: Boolean, source: RadarLocationSource) { // do something with location, stopped, source }
override fun onError(context: Context, status: RadarStatus) { // do something with status }
override fun onLog(context: Context, message: String) { // print message for debug logs }
overide fun onLocationPermissionStatusUpdated(context: Context,status: RadarLocationPermissionStatus) { // do something with location permission status }
}
#
Manual trackingIf you want to manage location services yourself, you can manually update the user's location instead by calling:
- Java
- Kotlin
Radar.trackOnce( location, new RadarTrackCallback() { @Override public void onComplete(RadarStatus status, Location location, RadarEvent[] events, RadarUser user) { // do something with location, events, user } });
Radar.trackOnce(location) { status, location, events, user -> // do something with location, events, user}
where location
is a Location
instance with a valid latitude, longitude, and accuracy.
#
Identify userThe SDK automatically collects installId
(a GUID generated on fresh install) and deviceId
(Android ID).
You can also assign a custom userId
, also called External ID in the dashboard. To set a custom userId
, call:
- Java
- Kotlin
Radar.setUserId(userId);
Radar.setUserId(userId)
where userId
is a stable unique ID for the user.
userId
. See privacy best practices for more information.To set a dictionary of custom metadata for the user, call:
- Java
- Kotlin
Radar.setMetadata(metadata);
Radar.setMetadata(metadata)
where metadata
is a JSONObject
with up to 16 keys and values of type string, boolean, or number.
Finally, to set an optional description for the user, displayed in the dashboard, call:
- Java
- Kotlin
Radar.setDescription(description);
Radar.setDescription(description)
You only need to call these methods once, as these settings will be persisted across app sessions.
Learn more about when Radar creates new user records here.
#
Debug loggingBy default, only critical errors are logged to the console. To enable debug logging, call:
- Java
- Kotlin
Radar.setLogLevel(Radar.RadarLogLevel.DEBUG);
Radar.setLogLevel(Radar.RadarLogLevel.DEBUG)
The Android SDK automatically logs lifecycle events without the additional setup required on iOS.
#
Other APIsThe Android SDK also exposes APIs for beacons, anonymous context, geocoding, search, and distance.
#
BeaconsTo range and monitor beacons, you must request Bluetooth permissions. If targeting API level 31
or above, both BLUETOOTH_CONNECT
and BLUETOOTH_SCAN
are required runtime permissions.
The following bluetooth permissions must be added to your manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
</manifest>
To range beacons in the foreground, call:
- Java
- Kotlin
Radar.trackOnce(RadarTrackingOptionsDesiredAccuracy.HIGH, true, new RadarTrackCallback() { @Override public void onComplete(RadarStatus status, Location location, RadarEvent[] events, RadarUser user) { // do something with user.beacons }});
Radar.trackOnce(RadarTrackingOptionsDesiredAccuracy.HIGH, true) { status, location, events, user -> // do something with user.beacons}
To monitor beacons in the background, update your tracking options:
- Java
- Kotlin
RadarTrackingOptions trackingOptions = RadarTrackingOptions.RESPONSIVE;trackingOptions.beacons = true;Radar.startTracking(trackingOptions);
val trackingOptions = RadarTrackingOptions.RESPONSIVEtrackingOptions.beacons = trueRadar.startTracking(trackingOptions)
Learn more about beacons.
#
Get locationGet a single location update without sending it to the server:
- Java
- Kotlin
Radar.getLocation(new RadarLocationCallback() { @Override public void onComplete(RadarStatus status, Location location, boolean stopped) { // do something with location }});
Radar.getLocation { status, location, stopped -> // do something with location}
#
ContextWith the context API, get context for a location without sending device or user identifiers to the server:
- Java
- Kotlin
Radar.getContext(new RadarContextCallback() { @Override public void onComplete(RadarStatus status, Location location, RadarContext context) { // do something with context }});
Radar.getContext { status, location, context -> // do something with context}
#
GeocodingWith the forward geocoding API, geocode an address, converting address to coordinates:
- Java
- Kotlin
Radar.geocode( "20 jay street brooklyn ny", // query new RadarGeocodeCallback() { @Override public void onComplete(RadarStatus status, RadarAddress[] addresses) { // do something with addresses } });
Radar.geocode("20 jay street brooklyn ny") { status, addresses -> // do something with addresses}
With the reverse geocoding API, reverse geocode a location, converting coordinates to address:
- Java
- Kotlin
Radar.reverseGeocode( location, new RadarGeocodeCallback() { @Override public void onComplete(RadarStatus status, RadarAddress[] addresses) { // do something with addresses } });
Radar.reverseGeocode(location) { status, addresses -> // do something with addresses}
With the IP geocoding API, geocode the device's current IP address, converting IP address to city, state, and country:
- Java
- Kotlin
Radar.ipGeocode(new RadarIpGeocodeCallback() { @Override public void onComplete(RadarStatus status, RadarAddress address, boolean proxy) { // do something with address, proxy }});
Radar.ipGeocode { status, address, proxy -> // do something with address, proxy}
#
SearchWith the autocomplete API, autocomplete partial addresses and place names, sorted by relevance:
- Java
- Kotlin
Radar.autocomplete( "brooklyn roasting", // query near, 10, // limit new RadarGeocodeCallback() { @Override public void onComplete(RadarStatus status, RadarAddress[] addresses) { // do something with addresses } });
Radar.autocomplete( "brooklyn roasting", // query near, 10 // limit) { status, addresses -> // do something with addresses}
With the geofence search API, search for geofences near a location, sorted by distance:
- Java
- Kotlin
Radar.searchGeofences( near, 1000, // radius (meters) {"store"}, // tags null, //metadata 10, // limit new RadarSearchGeofencesCallback() { @Override public void onComplete(RadarStatus status, Location location, RadarGeofence[] geofences) { // do something with geofences } });
Radar.searchGeofences( near, 1000, // radius (meters) arrayOf("store"), // tags null, // metadata 10 // limit) { status, location, geofences -> // do something with geofences}
With the places search API, search for places near a location, sorted by distance:
- Java
- Kotlin
Radar.searchPlaces( near, 1000, // radius (meters) {"starbucks"}, // chains null, // categories null, //groups 10, // limit new RadarSearchPlacesCallback() { @Override public void onComplete(RadarStatus status, Location location, RadarPlace[] places) { // do something with places } });
Radar.searchPlaces( near, 1000, // radius (meters) arrayOf("starbucks"), // chains null, // categories null, // groups 10 // limit) { status, location, places -> // do something with places}
With the address validation API (currently in beta), validate a structured address in the US or Canada:
- Java
- Kotlin
Radar.validateAddress( address, // query new RadarValidateAddressCallback() { @Override public void onComplete(RadarStatus status, RadarAddress address, ValidationResult result) { // do something with validation result and address } });
Radar.validateAddress(address) { status, address, result -> // do something with validation result and address}
#
DistanceWith the distance API, calculate the travel distance and duration from an origin to a destination:
- Java
- Kotlin
Radar.getDistance( origin, destination, EnumSet.of(RadarRouteMode.FOOT, RadarRouteMode.CAR), RadarRouteUnits.IMPERIAL, new RadarRouteCallback() { @Override public void onComplete(RadarStatus status, RadarRoutes routes) { // do something with routes } });
Radar.getDistance( origin, destination, EnumSet.of(RadarRouteMode.FOOT, RadarRouteMode.CAR), RadarRouteUnits.IMPERIAL) { status, routes -> // do something with routes}
#
MatrixWith the matrix API, calculate the travel distance and duration between multiple origins and destinations for up to 25 routes:
- Java
- Kotlin
Radar.getMatrix( origins, destinations, RadarRouteMode.CAR, RadarRouteUnits.IMPERIAL, new RadarRouteCallback() { @Override public void onComplete(RadarStatus status, RadarRouteMatrix matrix) { // do something with matrix.routeBetween(originIndex, destinationIndex) } });
Radar.getMatrix( origins, destinations, RadarRouteMode.CAR, RadarRouteUnits.IMPERIAL) { status, routes -> // do something with matrix.routeBetween(originIndex, destinationIndex)}
#
ConversionsWith the conversions API, log a conversion, such as a purchase or signup, to analyze alongside your app's location activity:
- Java
- Kotlin
Radar.logConversion( name, metadata, new RadarLogConversionCallback() { @Override public void onComplete(RadarStatus status, RadarEvent event) { // do something with the conversion event } })
// Conversion with revenueRadar.logConversion( name, revenue, metadata, new RadarLogConversionCallback() { @Override public void onComplete(RadarStatus status, RadarEvent event) { // do something with the conversion event } })
Radar.logConversion( name, metadata,) { status, event -> // do something with the conversion event}
// Conversion with revenueRadar.logConversion( name, revenue, metadata,) { status, event -> // do something with the conversion event}
#
NotificationsWith setNotificationOptions
, set the icon and the background color of foreground service and event notifications:
- Java
- Kotlin
// Set both foreground service and event notifications
JSONObject notificationOptions = new JSONObject();try { notificationOptions.put("iconString", "icon_1"); notificationOptions.put("iconColor", "color_1");} catch (JSONException e) { e.printStackTrace();}
Radar.setNotificationOptions(RadarNotificationsOptions.fromJson(notificationOptions));
// Or, set the foreground service notification and event notifications separately
JSONObject notificationOptions = new JSONObject();try { notificationOptions.put("foregroundServiceIconString", "icon_1"); notificationOptions.put("foregroundServiceIconColor", "color_1"); notificationOptions.put("eventIconString", "icon_2"); notificationOptions.put("eventIconColor", "color_2");} catch (JSONException e) { e.printStackTrace();}
Radar.setNotificationOptions(RadarNotificationsOptions.fromJson(notificationOptions));
// Set both foreground service and event notifications
Radar.setNotificationOptions(RadarNotificationsOptions( "icon_1", // iconString "color_1", // iconColor))
// Or, set the foreground service notification and event notifications separately
Radar.setNotificationOptions(RadarNotificationsOptions( foregroundServiceIconString = "icon_2", foregroundServiceIconColor = "color_2", eventIconString = "icon_3", eventIconColor = "color_3",))
#
HuaweiBy default, the SDK depends on Google Play Services Location. However, you can use Huawei Mobile Services Location Kit instead.
If you haven't already configured your project for Huawei Mobile Services, follow the instructions here.
Then, add the dependency to your app's build.gradle
file:
dependencies { implementation 'com.huawei.hms:location:6.4.0.300'}
Finally, pass in RadarLocationServicesProvider.HUAWEI
when you initialize the SDK:
- Java
- Kotlin
Radar.initialize(this, publishableKey, receiver, RadarLocationServicesProvider.HUAWEI);
Radar.initialize(context, publishableKey, receiver, RadarLocationServicesProvider.HUAWEI)