We’re building an open SDK to collect location data (like GPS) from phones, for apps like yours
OpenLocate is supported by developers, non-profits, trade groups, and industry for the following reasons:
- Collecting location data in a battery efficient manner that does not adversely affect mobile application performance is non-trivial. OpenLocate enables everyone in the community to benefit from shared knowledge around how to do this well.
- Creates standards and best practices for location collection.
- Developers have full transparency on how OpenLocate location collection works.
- Location data collected via OpenLocate is solely controlled by the developer.
Mobile application developers can use location data collected via OpenLocate to:
- Enhance their mobile application using context about the user’s location.
- Receive data about the Points of Interest a device has visited by enabling integrations with 3rd party APIs such as Google Places or Foursquare Venues
- Send location data to partners of OpenLocate via integrations listed here.
OpenLocate is supported by mobile app developers, non-profit trade groups, academia, and leading companies across GIS, logistics, marketing, and more.
- Android - Min SDK version 19
Openlocate uses the following permissions:
- ACCESS_COARSE_LOCATION - Required to access approximate location.
- ACCESS_FINE_LOCATION - Required to access precise location.
- INTERNET - Required to open network sockets.
- ACCESS_WIFI_STATE - Required to access information about Wi-Fi networks.
Add the below line to your app's build.gradle
:
repositories {
maven {
url "https://s3-us-west-2.amazonaws.com/openlocate-android/"
}
}
Add the below line to your app's build.gradle
inside the dependencies
section:
compile 'com.openlocate:openlocate:0.1.10@aar'
Configure where the SDK should send data to by building the configuration with appropriate URL and headers. Supply the configuration to the startTracking
method.
Configuration config = new Configuration.Builder()
.setUrl(<Your URL>)
.setHeaders(<Your Headers>)
.build();
try {
OpenLocate.getInstance(context).startTracking(config);
} catch (Exception e) {
Log.e("OpenLocate", e.getMessage())
}
HashMap<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer <TOKEN>");
Configuration config = new Configuration.Builder()
.setUrl("https://api.safegraph.com/v1/provider/<UUID>/devicelocation")
.setHeaders(headers)
.build();
try {
OpenLocate.getInstance(context).startTracking(config);
} catch (Exception e) {
Log.e("OpenLocate", e.getMessage())
}
To stop location tracking, call the stopTracking
method on OpenLocate
. Get the instance by calling getInstance
.
OpenLocate.getInstance(context).stopTracking()
The following fields are collected by the SDK to be sent to a private or public API:
latitude
- Latitude of the devicelongitude
- Longitude of the deviceutc_timestamp
- Timestamp of the recorded location in epochhorizontal_accuracy
- The accuracy of the location being recordedid_type
- 'aaid' for identifying android advertising typead_id
- Advertising identifierad_opt_out
- Flag that indicates whether user has enabled "limit ad tracking" (1: enabled; 0: not enabled)course
- Bearing in degrees.speed
- Speed in meters/second over ground.altitude
- Altitude in meters above the WGS 84 reference ellipsoid.
is_charging
- Indicates whether phone is charging or notdevice_manufacturer
- Manufacturer of devicedevice_model
- Model of deviseos
- Operating system installed on Device.location_method
- Method of location collected i.e "wifi", "cellular", "fused", "gps"location_context
- Indicates whether the location was collected when the application was foregrounded or backgrounded on the device.carrier_name
- Name of the mobile network carrierconnection_type
- Collects devices's network connection typewifi_ssid
- Collects wifi_ssidwifi_bssid
- Collects wifi_bssid
Optional field collection can be disabled while building the configuration object before passing it to the startTracking
method.
Configuration configuration = new Configuration.Builder()
.setUrl(BuildConfig.URL)
.setHeaders(getHeader())
.withoutDeviceManufacturer()
.withoutDeviceModel()
.withoutChargingInfo()
.withoutOperatingSystem()
.withoutCarrierName()
.withoutConnectionType()
.withoutWifiInfo()
.withoutLocationMethod()
.withoutLocationContext()
.build();
To use user's current location, obtain the location by calling getCurrentLocation
method on OpenLocate. Get the instance by calling getInstance
. Use the fields collected by SDK to send to 3rd party APIs.
OpenLocate openLocate = OpenLocate.getInstance(activity);
openLocate.getCurrentLocation(new OpenLocateLocationCallback() {
@Override
public void onLocationFetch(OpenLocateLocation location) {
//Use location object to obtain fields and pass it to 3rd Party API
}
@Override
public void onError(Error error) {
//error
}
});
Google Places API: https://developers.google.com/places/web-service/search
private Map<String, String> getQueryMapGoogle(OpenLocateLocation location ) {
Map<String, String> queryMap = new HashMap<>();
queryMap.put("location", String.valueOf(location.getLocation().getLatitude()) + "," + String.valueOf(location.getLocation().getLongitude()) );
queryMap.put("radius", "500");
queryMap.put("type", "restaurant");
queryMap.put("keyword", "south");
queryMap.put("key", -YOUR GOOGLE PLACES API KEY-);
return queryMap;
}
public void fetchGooglePlaces(OpenLocateLocation openLocateLocation, final SafeGraphPlaceCallback callback) {
GooglePlaceClient safeGraphPlaceClient = GooglePlaceClientGenerator.createClient(GooglePlaceClient.class);
Call<GooglePlaceBody> call=safeGraphPlaceClient.getNearByPlaces(getQueryMapGoogle(openLocateLocation));
call.enqueue(new Callback<GooglePlaceBody>() {
@Override
public void onResponse(Call<GooglePlaceBody> call, Response<GooglePlaceBody> response) {
if(response.isSuccessful()) {
//TODO Do something with place.
}
}
@Override
public void onFailure(Call<GooglePlaceBody> call, Throwable t) {
//Error
}
});
}
SafeGraph Places API: https://developers.safegraph.com/docs/places.html
private Map<String, String> getQueryMap(OpenLocateLocation location) {
Map<String, String> queryMap = new HashMap<>();
queryMap.put("advertising_id", location.getAdvertisingInfo().getId());
queryMap.put("advertising_id_type", "aaid");
queryMap.put("latitude", String.valueOf(location.getLocation().getLatitude()));
queryMap.put("longitude", String.valueOf(location.getLocation().getLongitude()));
queryMap.put("horizontal_accuracy", String.valueOf(location.getLocation().getHorizontalAccuracy()));
return queryMap;
}
private void fetchNearbyPlaces() {
// These classes can be found in the example app in this repo
SafeGraphPlaceClient safeGraphPlaceClient = ClientGenerator.createClient(SafeGraphPlaceClient.class);
Call<SafeGraphPlaceBody> call = safeGraphPlaceClient.getAllPlaces(getQueryMap(openLocateLocation));
call.enqueue(new Callback<SafeGraphPlaceBody>() {
@Override
public void onResponse(Call<SafeGraphPlaceBody> call, Response<SafeGraphPlaceBody> response) {
if (response.isSuccessful()) {
List<SafeGraphPlace> places = response.body().getPlaceList();
//TODO Do something with places
}
}
@Override
public void onFailure(Call<SafeGraphPlaceBody> call, Throwable t) {
//error
}
});
}
Similarly, OpenLocate SDK can be used to query additional APIs such as Facebook Places Graph or any other 3rd party places API.
- Facebook Places API - https://developers.facebook.com/docs/places/
ClientGenerator is created using Retrofit and its implementation code can found in example code.
This is a sample request body sent by the SDK.
[
{
"latitude": 37.773972,
"longitude": -122.431297,
"horizontal_accuracy": "23.670000076293945",
"utc_timestamp": 1508369672,
"course": "0.0",
"speed": "0.0",
"altitude": 0,
"ad_id": "f109e57e-a02e-41d3-b7c4-c906d1b92331",
"ad_opt_out": false,
"id_type": "aaid",
"device_manufacturer": "motorola",
"device_model": "Moto G (5S) Plus",
"is_charging": true,
"os_version": "Android 7.1.1",
"carrier_name": "T Mobile",
"wifi_ssid": "\"Jungle\"",
"wifi_bssid": "10:fe:ed:8d:b5:7c",
"connection_type": "wifi",
"location_method": "gps",
"location_context": "bground"
},
{
"latitude": 37.773972,
"longitude": -122.431297,
"horizontal_accuracy": "23.670000076293945",
"utc_timestamp": 1508369683,
"course": "0.0",
"speed": "0.0",
"altitude": 0,
"ad_id": "f109e57e-a02e-41d3-b7c4-c906d1b92331",
"ad_opt_out": false,
"id_type": "aaid",
"device_manufacturer": "motorola",
"device_model": "Moto G (5S) Plus",
"is_charging": true,
"os_version": "Android 7.1.1",
"carrier_name": "T Mobile",
"wifi_ssid": "\"Jungle\"",
"wifi_bssid": "10:fe:ed:8d:b5:7c",
"connection_type": "wifi",
"location_method": "gps",
"location_context": "bground"
}
]
- If you need help, post a question to the discussion forum, or tag a question with 'OpenLocate' on Stack Overflow.
- If you found a bug, open an issue.
- If you have a feature request, open an issue.
- If you want to contribute, submit a pull request.
This project is licensed under the MIT License - see the LICENSE.md file for details.