The GDK developer guide states:
Local providers obtain location data from the Glass hardware such as GPS_PROVIDER and NETWORK_PROVIDER.
However this doesn't seem to be the case. I tried logging all available providers with:
Log.d("LocationDebug", mLocationManager.getAllProviders().toString());
The result is:
[remote_gps, remote_network, network, passive]
So no local GPS. If I try anyway with the following code:
mLocationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null);
The app crashes and the following gets logged:
java.lang.IllegalArgumentException: provider=gps
As described in the location and sensors developer guide, you should avoid referring to specific location providers, such as GPS_PROVIDER by name. Instead, use a Criteria-based approach or iterate over all location providers to ensure that you include the "remote" providers that retrieve locations from a Bluetooth tethered device running the MyGlass companion app. This will get you the most reliable location information.
Related
I added a test provider using LocationManager.GPS_PROVIDER as provider name like described here
https://mobiarch.wordpress.com/2012/07/17/testing-with-mock-location-data-in-android/
In Google Maps app, I see location jumping between mocked location and real location, and then back to mocked location.
Why is jumping to real location and how can I stop it?
Maybe I misunderstand how to use mock locations. I haven't found any official documentation available.
You most likely have your location settings configured in a way that your phone (and apps) can use both the location from the GPS sensor and the location from the cells and wi-fi. Since the coming of the Fused Location Provider, the way the system fetches your location got a bit murkier.
When you mock the position you are only able to mock the GPS sensor readings (this is also true for when you mock the position through the simulator settings).
So when the system feeds Google Maps with a position from the GPS sensor it gives it the fake one, and when it provides the position from other sensors it will be the real one.
To test that I'm correct, you can switch location settings to "Device only" and you should only get the fake positions.
Unfortunately there's no way to mock the other sensors readings.
Turn off Wi-Fi scanning / Bluetooth scanning in the Location Settings to stop jumping to preserve mock location.
I have an Android IoT device running Android 5.1.1 on Rockchip RK3288 that as name implies can connect to a WiFi network but doesn't have a GPS or a Cellular module. Whenever I try to access location and find the best location provider it always return me as a 'Passive' provider and hence i have no way of getting my current location.
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
I am a bit perplexed that the device has an active network connection but NETWORK_PROVIDER isn't available.
Try Google Geolocation API.
Google Geolocation API use wifiAccessPoints and cellTowers too. As you said device don't have GPS and Cellular module you need to use WifiAccessPoints for it.
For WifiAccessPoints you need to pass all your nearest wifi connection data. For E.g In android when click on WIFI it shows list of wifi near to you. So, you need to just pass all that wifi list to WifiAccessPoints so it returns the location of your device.
You can Pass Parameter "considerIp": "true" so using your Ip Address it get the current location of your device.
For My Opinion use Get Current location through IP Address which return the Highest Accuracy ratio for current location.This is also said by the Google Maps Geolocation API document.
For more information you can refer Google Geolocation API which also provide sample data so that you can check the result from here.
I hope this will give you some hint or get some idea to actually you want to achieve.
I'm looking for a way to know the country-level location.
How to do it on a phone, or devices that have cellular network connectivity or GPS is clear. But what about devices that don't have that?
I know from Google Analytics that Google has that kind of location information,
How?
How can I get that information as well? Maybe from the play-store locale or something?
By "Tablets" I mean devices that have no GPS and no GSM / cellular network connection.
10x
Use the WiFi aproximated location. It checks your IP adress and tries to locate it geographically.
please see this or this.
a quick summary of the WiFi location method form one of the posted links:
How it works: Unless you opt out, your phone is periodically sending anonymous data to Google with, among other things, your last known location and any Wi-Fi network you were connected to at the time. The accumulated data builds on a database begun by traveling Google Streetview cars that recorded Wi-Fi networks available along their routes (the cars no longer do this).
When using this method, your application will ask for the COARSE LOCATION permission on installation.
Since there's no clear indication (at least none that I've found) whether or not Google estimates location based on IP as a last resort, my 'getCountry' logic would be as follows:
Location location = LocationClient.getLastLocation()
If (location == null) location = getLocationByIp()
where getLocationByIP() will use a publicly available, RESTful free web service such as http://freegeoip.net/
Open to suggestions here. If line 2 is redundant I will be happy to drop it.
Cheers
(Y)
In my application I would like to determine the user's current location. I do however have a couple of questions in this regard:
There are different Location Providers, which one is the most accurate? The GPS Provider or the Network Provider?
In how far do those available provider differ? How do they function?
Could you please provide me with some code-snippets or tutorials on how to get started with implementing GPS functionality in my application?
There are 3 location providers in Android.
They are:
gps –> (GPS, AGPS): Name of the GPS location provider. This
provider determines location using satellites. Depending on
conditions, this provider may take a while to return a location fix.
Requires the permission android.permission.ACCESS_FINE_LOCATION.
network –> (AGPS, CellID, WiFi MACID): Name of the network
location provider. This provider determines location based on
availability of cell tower and WiFi access points. Results are
retrieved by means of a network lookup. Requires either of the
permissions android.permission.ACCESS_COARSE_LOCATION or
android.permission.ACCESS_FINE_LOCATION.
passive –> (CellID, WiFi MACID): A special location provider for
receiving locations without actually initiating a location fix. This
provider can be used to passively receive location updates when other
applications or services request them without actually requesting the
locations yourself. This provider will return locations generated by
other providers. Requires the permission
android.permission.ACCESS_FINE_LOCATION, although if the GPS is not
enabled this provider might only return coarse fixes. This is what
Android calls these location providers, however, the underlying
technologies to make this stuff work is mapped to the specific set of
hardware and telco provided capabilities (network service).
The best way is to use the “network” or “passive” provider first,
and then fallback on “gps”, and depending on the task, switch between
providers. This covers all cases, and provides a lowest common
denominator service (in the worst case) and great service (in the best
case).
Article Reference : Android Location Providers - gps, network, passive By Nazmul Idris
Code Reference : https://stackoverflow.com/a/3145655/28557
-----------------------Update-----------------------
Now Android have Fused location provider
The Fused Location Provider intelligently manages the underlying location technology and gives you the best location according to your needs. It simplifies ways for apps to get the user’s current location with improved accuracy and lower power usage
Fused location provider provide three ways to fetch location
Last Location: Use when you want to know current location once.
Request Location using Listener: Use when application is on screen / frontend and require continues location.
Request Location using Pending Intent: Use when application in background and require continues location.
References :
Official site : http://developer.android.com/google/play-services/location.html
Fused location provider example:
GIT : https://github.com/kpbird/fused-location-provider-example
http://blog.lemberg.co.uk/fused-location-provider
--------------------------------------------------------
GPS is generally more accurate than network but sometimes GPS is not available, therefore you might need to switch between the two.
A good start might be to look at the android dev site. They had a section dedicated to determining user location and it has all the code samples you need.
http://developer.android.com/guide/topics/location/obtaining-user-location.html
There are some great answers mentioned here. Another approach you could take would be to use some free SDKs available online like Atooma, tranql and Neura, that can be integrated with your Android application (it takes less than 20 min to integrate).
Along with giving you the accurate location of your user, it can also give you good insights about your user’s activities. Also, some of them consume less than 1% of your battery
Before I go into location based mode I check for existence of any location providers by calling
List<String> android.location.LocationManager.getProviders(boolean enabledOnly) //enabledOnly = true
and checking the size of the resulting list.
Now I tested my App on a HTC Desire with Android 2.2. The system settings don't allow any location tracking (GPS and mobile is turned off).
However, the list get returned has 1 entry, whose value is "passive". What is it? Can I work with it? The provider seems to be slow / not working.
From the Android API reference:
A special location provider for receiving locations without actually initiating a location fix. This provider can be used to passively receive location updates when other applications or services request them without actually requesting the locations yourself. This provider will return locations generated by other providers.
So no, it's not likely to do you any good if there are no other location providers available.