location based services · 2017-12-06 · using the emulator with location-based services...

38
Location Based Services

Upload: others

Post on 09-Apr-2020

17 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Location Based Services

Page 2: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Introduction

One of the defining features of mobile phones is their portability.

Most enticing APIs in Android enable you to find, contextualize, and

map physical locations.

Using the external Maps library included as part of the Google API

package, you can create map-based Activities using Google Maps as a

user interface element.

You have full access to the map, which enables you to control display

settings, alter the zoom level, and pan to different locations.

Page 3: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Introduction

Location-based services (LBS) enable you to find the device’s current

location.

They include technologies such as GPS and cell- or Wi-Fi-based

location sensing techniques.

Maps and location-based services use latitude and longitude to pinpoint

geographic locations.

But users are more likely to think in terms of a street address.

The maps library includes a geocoder that you can use to convert back

and forth between latitude/longitude values and real-world addresses.

Page 4: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using Location-based Services

Location-based services is an umbrella term that describes the different technologies you can use to find a device’s current location.

The two main LBS elements are:

Location Manager

Provides hooks to the location-based services.

Location Providers

Each of these represents a different location-finding technology used to determine the device’s current location.

Page 5: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using Location-based Services

Using the Location Manager, you can do the following:

Obtain your current location

Follow movement

Set proximity alerts for detecting movement into and out of a specifi edarea

Find available Location Providers

Monitor the status of the GPS receiver

Access to the location-based services is provided by the Location Manager.

To access the Location Manager, request an instance of the LOCATION_SERVICE using the getSystemService() method.

Page 6: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Accessing the Location Manager

String serviceString = Context.LOCATION_SERVICE;

LocationManager obj;

obj = (LocationManager)getSystemService(serviceString);

Page 7: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using Location-based Services

Before you can use the location-based services, you need to add one or more uses-permission tags to your manifest.

The following snippet shows how to request the fine and coarse permissions in your application

AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

An application that has been granted fine permission will have coarse permission granted implicitly.

Page 8: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using the Emulator with Location-

Based Services

Location-based services are dependent on device hardware used to

find the current location.

When you develop and test with the Emulator, your hardware is

virtualized, and you’re likely to stay in pretty much the same

location.

To compensate, Android includes hooks that enable you to emulate

Location Providers for testing location-based applications.

Page 9: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Updating Locations in Emulator

Location Providers

Use the Location

Controls available

from the DDMS

perspective in

Eclipse to push

location changes

directly into the

Emulator’s GPS

Location Provider.

Page 10: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Configuring the Emulator to Test

Location-Based Services

The GPS values returned by getLastKnownLocation() do not change

unless at least one application requests location updates.

As a result, when the Emulator is first started, the result returned

from a call to getLastKnownLocation() is likely to be null, as no

application has made a request to receive location updates.

Further, the techniques used to update the mock location are

effective only when at least one application has requested location

updates from the GPS.

Page 11: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Enabling the GPS provider on the

Emulator

Page 12: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Selecting A Location Provider

Depending on the device, you can use several technologies to

determine the current location.

Each technology, available as a Location Provider, offers different

capabilities including

Differences in power consumption

Accuracy

Ability to determine altitude

Speed or

Heading information.

Page 13: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Selecting A Location Provider

Finding Location Providers:

The LocationManager class includes static string constants that

return the provider name for three Location Providers:

1. LocationManager.GPS_PROVIDER

2. LocationManager.NETWORK_PROVIDER

3. LocationManager.PASSIVE_PROVIDER

Page 14: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Selecting A Location Provider

To get a list of the names of all the providers available (based on

hardware available on the device, and the permissions granted the

application), call getProviders, using a Boolean to indicate if you

want all, or only the enabled, providers to be returned

boolean enabledOnly = true;

List<String> providers = locationManager.getProviders(enabledOnly);

Page 15: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Finding Location Providers by

Specifying Criteria

Use the Criteria class to dictate the requirements of a provider in terms of accuracy, power use (low, medium, high), financial cost, and the ability to return values for altitude, speed, and heading.

Following Code specifies Criteria requiring coarse accuracy, low power consumption, and no need for altitude, bearing, or speed.

The provider is permitted to have an associated cost.

The coarse/fine values passed in to the setAccuracy represent a subjective level of accuracy.

Fine represents GPS or better and Coarse any technology significantly less accurate than that.

Page 16: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Finding Location Providers by

Specifying Criteria

Page 17: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Where Am I Example

Where Am I application features a new Activity that finds the device’s

last known location using the GPS Location Provider.

1. Create a new Where Am I project with a WhereAmI Activity. This

example uses the GPS provider, so you need to include the uses-permission

tag for ACCESS_FINE_LOCATION in your application manifest.

<uses-permission

android:name="android.permission.ACCESS_FINE_LOCATION"

/>

Page 18: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Where Am I Example

2. Modify the main.xml layout resource to include an android:ID attribute for the TextView control so that you can access it from within the Activity.

<TextView

android:id="@+id/myLocationText"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

Page 19: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Where Am I Example

3. Override the onCreate method of the WhereAmI Activity to get a

reference to the Location Manager.

Call getLastKnownLocation to get the last known location, and pass it in to

an updateWithNewLocation method stub.

Page 20: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Where Am I Example

4. Complete the updateWithNewLocation method to show the passed-in

Location in the Text View by extracting the latitude and longitude values

Page 21: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Where Am I Example

Page 22: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Best Practice For Location Updates

When using Location within your application, consider the following

factors:

1. Battery life versus accuracy

The more accurate the Location Provider, the greater its drain on the

battery.

2. Startup Time

In a mobile environment the time taken to get an initial location can

have a dramatic effect on the user experience — particularly if your

app requires a location to be used. GPS, for example, can have a

significant startup time, which you may need to mitigate.

Page 23: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Best Practice For Location Updates

3. Update Rate

The more frequent the update rate, the more dramatic the effect on

battery life. Slower updates can reduce battery drain at the price of

less timely updates.

4. Provider Availability

Users can toggle the availability of providers, so your application

needs to monitor changes in provider status to ensure the best

alternative is used at all times.

Page 24: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using Proximity Alerts

Proximity alerts let your app set Pending Intents that are fired when the

device moves within or beyond a set distance from a fixed location.

To set a proximity alert for a given area, select the center point (using

longitude and latitude values), a radius around that point, and an expiry

time-out for the alert.

The alert fires if the device crosses over that boundary.

Fires when device moves from outside to within the radius, and when it

moves from inside to beyond it.

To specify the Intent to fire, you use a PendingIntent.

Page 25: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Setting a proximity alert

Page 26: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using Proximity Alerts

Proximity alerts let your app set Pending Intents that are fired when the

device moves within or beyond a set distance from a fixed location.

When the Location Manager detects that you have crossed the radius

boundary, the Pending Intent fires with an extra keyed as

LocationManager.KEY_PROXIMITY_ENTERING

set to true or false accordingly.

Page 27: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using Proximity Alerts

To receive proximity alerts, you need to create a BroadcastReceiver.

To start listening for proximity alerts, register your receiver either by

using a tag in your Manifest or in code as shown here:

IntentFilter filter = new IntentFilter(TREASURE_PROXIMITY_ALERT);

registerReceiver(new ProximityIntentReceiver(), filter);

Page 28: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using The Geocoder

Geocoding enables you to translate between street addresses and

longitude/latitude map coordinates.

This can give you a recognizable context for the locations and

coordinates used in location based services and map-based Activities.

The Geocoder classes are included as part of the Google Maps library.

To use them you need to import it into your application by adding a

uses-library node within the application node.

<uses-library android:name=”com.google.android.maps”/>

Page 29: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using The Geocoder

As the geocoding lookups are done on the server, your applications also

requires the Internet uses permission in your manifest:

<uses-permission android:name=”android.permission.INTERNET”/>

The Geocoder class provides access to two geocoding functions:

1. Forward Geocoding

Finds the latitude and longitude of an address

2. Reverse Geocoding

Finds the street address for a given latitude and longitude

Page 30: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using The Geocoder

The results from these calls are contextualized by means of a locale

(used to define your usual location and language).

The following snippet shows how you set the locale when creating your

Geocoder.

If you don’t specify a locale, it assumes the device’s default.

Geocoder geocoder = new Geocoder(getApplicationContext(),

Locale.getDefault());

Both geocoding functions return a list of Address objects.

Each list can contain several possible results, up to a limit you specify

when making the call.

Page 31: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using The Geocoder

Each Address object is populated with as much detail as the Geocoder

was able to resolve.

This can include the latitude, longitude, phone number, and increasingly

granular address details from country to street and house number.

The Geocoder uses a web service to implement its lookups that may not

be included on all Android devices.

Page 32: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Using The Geocoder

Android 2.3 (API level 9) introduced the isPresent method to determine

if a Geocoder implementation exists on a given device:

bool geocoderExists = Geocoder.isPresent();

If no Geocoder implementation exists on the device, the forward and

reverse geocoding will return an empty list.

Page 33: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Reverse Geocoding

Reverse geocoding returns street addresses for physical locations

specified by latitude/longitude pairs.

It’s a useful way to get a recognizable context for the locations returned

by location-based services.

To perform a reverse lookup, pass the target latitude and longitude to a

Geocoder object’s getFromLocation() method.

It returns a list of possible address matches.

Page 34: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Reverse Geocoding

If the Geocoder could not resolve any addresses for the specified

coordinate, it returns null.

The accuracy and granularity of reverse lookups are entirely dependent

on the quality of data in the geocoding database.

The quality of the results may vary widely between different countries

and locales.

Page 35: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Reverse Geocoding

Page 36: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Forward Geocoding

Forward geocoding determines map coordinates for a given location.

To geocode an address, call getFromLocationName on a Geocoder

object.

Pass in a string that describes the address you want the coordinates for,

the maximum number of results to return, and optionally provide a

geographic bounding box within which to restrict your search results:

List<Address> result = gc.getFromLocationName(streetAddress, maxResults);

Page 37: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Forward Geocoding

The returned list of Addresses may include multiple possible matches for

the named location.

Each Address includes latitude and longitude and any additional address

information available for those coordinates.

This is useful to confirm that the correct location was resolved, and for

providing location specifics in searches for landmarks.

When you do forward lookups, the Locale specified when instantiating

the Geocoder is particularly important.

The Locale provides the geographical context for interpreting your

search requests because the same location names can exist in multiple

areas.

Page 38: Location Based Services · 2017-12-06 · Using the Emulator with Location-Based Services Location-based services are dependent on device hardware used to find the current location

Forward Geocoding