Skip to content

Customize Location Provider

By default, SDK retrieving GPS locations from system location manager, meanwhile, SDK also allows client inject customized location provider such that client side can simulate GPS location more flexibility. Following steps will illustrate how to deal with customized location provider.

Step 1: Implement customized location provider

One just need declare a class inheritance from LocationProvider and implement all interfaces with customized way. Following example code demostrate a location provider only gives single of fixed GPS location:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class MyLocationProvider implements LocationProvider {
    private final static String providerName = "Test Provider";

    @Override
    public String getName() {
        return providerName;
    }

    @Override
    public Status getStatus() {
        return Status.NORMAL;
    }

    @Override
    public Location getLastKnownLocation() {
        Location location = new Location(providerName);
        location.setLongitude(37.12158);
        location.setLongitude(-121.03148);
        location.setTime(1608052692);

        return location;
    }

    @Override
    public void addLocationUpdateListener(@NonNull LocationUpdateListener listener) {
        @Override
        public void onStatusChanged(LocationProvider.Status status) {
            if (status == LocationProvider.Status.NORMAL) {
                // status -> Normal
            } else {
                // status -> out of service
            }
        }

        @Override
        public void onLocationChanged(@NonNull Location location) {
            synchronized (this) {
               // obtain current location
            }
        }
    }

    @Override
    public void removeLocationUpdateListener(@NonNull LocationUpdateListener listener) {

    }

    // TODO: implement other public interfaces

}    
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class MyLocationProvider : LocationProvider {
    val strProviderName = "Test Provider"

    override fun getName() : String {
        return strProviderName
    }

    override fun getStatus() : LocationProvider.Status {
        return LocationProvider.Status.NORMAL
    }

    override fun getLastKnownLocation() : Location {
        var location = Location(strProviderName)
        location.setLongitude(37.12158)
        location.setLongitude(-121.03148)
        location.setTime(1608052692)

        return location
    }

    override fun addLocationUpdateListener(listener: LocationUpdateListener) {
        override fun onStatusChanged(status: LocationProvider.Status) {
            if (status == LocationProvider.Status.NORMAL) {
                // status -> Normal
            } else {
                // status -> out of service
            }
        }

        override fun onLocationChanged(location: Location) {
            synchronized (this) {
               // obtain current location
            }
        }
    }

    override fun removeLocationUpdateListener(listener: LocationUpdateListener) {

    }

 }    

Please be aware that both of LocationProvider.getStatus and LocationProvider.getLastKnownLocation needs to be implemented efficiently since they may be invokded with very high frequency (for eg, 4HZ).

Step 2: Create an instance of customized location provider and inject to drive-session

Following sample code assume user already obtain an instance of drive-session:

1
2
LocationProvider locationProvider = new MyLocationProvider();
driveSession.injectLocationProvider(locationProvider);
1
2
var locationProvider = MyLocationProvider()
driveSession.injectLocationProvider(locationProvider)