I hope this is an appropriate question for this group. It is not strictly speaking a programming question unless I end up writing my own NEMA listener instead of the location listener but that would mean a start over on a lot of code. I have written a GPS based application and want to use an external GPS at 5HZ. I have been searching for a couple of hours on Google and this forum with no luck for answers to my problem.
I have been using Android apps to talk to the external GPS. I can get 5Hz with Bluetooth GPS Provider or GPS Mouse but they both have time errors of about 18 seconds (slow). I can get accurate time with Bluetooth GPS but only at 1Hz. I have checked the raw NEMA output of the Qstarz unit and it is correct at both 1Hz and 5Hz.
I am using the standard location listener and everything in the program is working fine. I just want to get 5Hz data and accurate GPS time. At first I thought it was a GPS Leap Second issue but the NEMA data is correct with real time. I use WWV to find real time.
Try:
http://sourceforge.net/projects/bluegps4droid/files/
This app updates mock location at the frequency of the source GPS.
Related
I am working on gps tracking apps in android. Here is my code architecture:
BackgroundSyncService : A service class that is used for getting location update. Here GoogleApiClient is initialized and implements others Location related methods.
AppRunCheckerReceiver : A BroadcastReceiver class that will check if my BackgroundSyncService is running or not in a time interval. If it stopped then it start.
GpsEnableReceiver : A BroadcastReceiver it will fire if gps status changed. It will check if my BackgroundSyncService is running or not in a time interval. If it stopped then it start.
InternetConnectionStateReceiver : A BroadcastReceiver it will fire when internet status changed. It will check if my BackgroundSyncService is running or not in a time interval. If it is stopped, then it start.
In my BackgroundSyncService service I initialize the GoogleApiClient using this way:
public void setLocationLocationRequest() {
try {
googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).addApi(com.google.android.gms.location.LocationServices.API).build();
locationRequest = new LocationRequest();
locationRequest.setInterval(3000);
locationRequest.setFastestInterval(3000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
googleApiClient.connect();
} catch (Exception e) {
}
Here accuricy is LocationRequest.PRIORITY_HIGH_ACCURACY and interval is
locationRequest.setInterval(3000)
here is the GoogleApiClient implementation code.
This application GPS info section contains Latitude longitude and Accuracy parameter
My Findings: in onLocationChanged(Location location) method I check the accuracy of Location object in this way : location.getAccuracy(). Here if accuracy is less than 50 meter, then I accept it.
In 85% of the cases it working like a charm. It sending me exact location from GPS. But in 15% cases, it sending me inaccurate location like more >300 meter.
The 15% device are low cost China brand mobile.
My Questions:
How can i make accuracy level near 99%. Is there any problem on my code architecture?
Does GPS accuracy depends on device configuration? if YES then what can I do for low configuration device?
How Uber, Go-JEK etc. ride sharing apps works for all device? Is they have extra coding for GPS only?
My application is for Bangladesh. Here internet is slow. Is it has negative impact on GPS accuracy?
Thanks in advance for this thread. And also sorry for bad english.
How can i make accuracy level near 99%. Is there any problem on my code architecture?
This is real life scenario. You cannot ensure that all the location providers will work as expected. You should ask for best available position.
a) Does GPS accuracy depends on device configuration?
YES. Some devices may have older GPS chipsets which can only track GPS signals (USA) since there are other positioning systems like Galileo (Europe), GLONASS (Russia), QZSS (Japan) and Beidou (China). The more the chipset support for these types the more chance you get to track more satellite hereby position fix. Also TTFF (time to first fix) depends on how many channels do the gps receiver has.
b) If YES then what can i do for low configuration device?
Since this is a hardware issue, you cannot do anything here. But other location sources can compensate the lack of GPS data such as AGPS (aided gps), wifi and cellular positioning. Also there are some paid options which provides a database to locate your device using wifi access points and cellids (they claim that they provide best solution on wifi but i m not sure as I dont use it. you can check it out http://combain.com). Wifi and cellid also depends on how many wifi access point and cell tower available around and how far they are (signal strength). If you need 50m accuracy, cellular positioning has nothing to do but wifi has a chance to get closer to this value.
Some study results from 2009 [3]
3G iPhone w/ A-GPS ~ 8 meters
3G iPhone w/ wifi ~ 74 meters
3G iPhone w/ Cellular positioning ~ 600 meters
How Uber, Go-JEK etc. ride sharing apps works for all device? Is they have extra coding for GPS only?
They may have specific Location strategies but it will based on using other sources during GPS outage.
My application is for Bangladesh. Here internet is slow. Is it has negative impact on GPS accuracy?
Other answers claims that internet is not related to GPS. Yes it is true it is not related to GPS but location. AGPS uses internet to fetch 3 types of data (Satellite signals, almanac and ephemeris) which assist GPS to provide position fix faster. If ephemeris and almanac are outdated or the device moved several hundred km from the previous position fix then it is called cold start and takes around 12-15min without AGPS.
Fused location provider already knows how to provide best solution with these configurations, so you should bless it.
References:
[1] http://gpssystems.net/agps/
[2] http://gpsinformation.net/main/almanac.txt
[3]
https://communityhealthmaps.nlm.nih.gov/2014/07/07/how-accurate-is-the-gps-on-my-smart-phone-part-2/
First, (and second)
How can I make accuracy level near 99%. Is there any problem on my code architecture?
Does GPS accuracy depends on device configuration? If YES then what can I do for low configuration device?
Both - device configuration and code architecture, are important here. If you are already at an 85% success rate, the code architecture is alright I think.
As far as GPS goes, line-of-sight is an important factor when it comes to device configurations and accuracy.
Although a low cost mobile could return an accurate location with a clear line-of-sight. You can try running 2 cycles more/waiting to attain higher accuracy.
In a worst case scenario and for what its worth, you can also try retrieving location using the LocationManager and GPS provider technique which works as a fallback in the 15% just to compare and ensure you are using the most accurate location you can get.
Location Strategies put it as
In most cases, you'll get better battery performance, as well as more
appropriate accuracy, by using the Location Services API.
How Uber, Go-JEK etc. ride sharing apps works for all device? Is they have extra coding for GPS only?
They do work but not always with highest of accuracy for locations received within the app. If there are any location hacks for us developers, we need to find them, maybe a 5th page google search result :) or benefit from the open source environment. For me, best practices and android repo links suffice. You have already followed posts like Receive location updates
My application is for Bangladesh. Here Internet is slow. Is it has negative impact on GPS accuracy?
No relation between Internet and LocationManager + GPS_PROVIDER
I am looking to get device's location every 1 minute. I noticed the incorrect location of some devices.
With S7500 the correct location is found after 3-4 minutes sometimes or more, with HUAWEI Y530-U00 the correct location if found instantly. I used the example https://github.com/googlesamples/android-play-location/tree/master/LocationUpdates.
S7500 is not very powerful so I thought about a device limitation but it find location after a while. Maybe the code use only phone cell or internet instead of GPS and it makes location difficult.
Is there a way to improve this?
I'm using intel xdk and cordova for an android app that uses geolocation this is the code that i use:
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(geolocalizacion,error,{enableHighAccuracy:true, maximumAge:Infinity, timeout:100000});
} else {
handleNoGeolocation(false);
}
I don't want to use the 'google location service' because, if that option is disabled, some people can get lost trying to find it in settings, so i'm using enableHighAccuracy:true in order to use GPS.
However with that it takes so much time, almost a minute to call the success function 'geolocalizacion' when the app is used indoors. I know that GPS is better in outdoors (in that case it takes 5 or 7 seconds) but i think 1 minute is too much for indoors.
Am i doing something wrong?
Is there a way to make faster the geolocation with GPS?
or a way to activate the 'google location service' without the user doing anything?.
The GPS signals transmitted by GPS satellites are very weak if you are not located outside. Even if you are outside, weather conditions, tall buildings and other large metal structures can hide or degrade the GPS signal. In addition, the GPS receivers inside of your typical phone or tablet are very low grade receivers and antennas, they are not as capable as the more expensive dedicated GPS devices, due to compromises associated price and physical size.
You should really take a two prong approach: get an initial reading using the "coarse" geo reading, with the geo cache enabled. The coarse reading will use the wifi, network, GPS and cached readings and return it's best estimate based on the parameters you specify, usually within a very reasonable time frame.
Then, after you've established an approximate position (which can be very accurate, as #SeahawksRdaBest points out, if based on the current wifi), switch to the "fine" location setting to get an accurate position. This part of your app can run in the background so it doesn't interrupt the responsiveness of your app, and can then update the position information in your app as more accurate position data becomes available.
One thing to keep in mind, many users have the GPS turned off because it severely degrades battery life. If all your app needs is to "find a restaurant nearby" then the coarse location should be good enough, since you're probably more interested in placing the destination on the map. This will be much more battery friendly, and is one of the reasons that the geo settings on the more recent Android devices have changed to make it harder for an app to enable GPS programmatically.
I see you've added the intel-xdk tag, so you might want to checkout this little geolocation test app that I've put together at https://github.com/xmnboy/hello-cordova. It needs a little work but should help you with some experimentation between coarse and fine settings.
I think you can diversify your app a little.
For example if you are indoors and have a WiFi connection why not use that to triangulate your position? WiFi is highly accurate because theoretically it covers a small space so the phone would know exactly where it is and return a position quickly.(if done right in my experience usually <10 secs).
If a Wifi connection is not found(outdoors). You can always drop back to GPS to provide the coordinates. Plus Gps is "fastest" outside anyways.
Checkout these pages: Stackoverflow discussion. Location Manager Android.
If you want to get really fancy you can even use the Geocoder Android library to get Location addresses etc in human readable form.
my question title is kind of self explanatory.
When I want to get my current location, for the first time(after phone start up), I have to be connected to the internet.
After getting the location once, my app no longer needs the internet connection and the update happens just fine.
At first I thought there was something missing in my code, but I tried the in-build maps application, and it also couldn't get my location until I enabled data transfer.
This seems really strange to me, if I can get coordinates without net connectivity after the first coordinate is aquired, why do I need it in the first place?
So I was wondering 2 things,
1 - is there a work around to let me get my first Location without being connected
and
2 - if there is no work around is it practical to ask the user to enable it? I'm not 100% on this but I'm pretty sure I cant enable data programatically.
Would like to hear your opinions.
Thanks :)
Android devices use what's called aGPS - the a stands for assisted. The most basic I've seen it explained is that certain information has to be downloaded and a general, broad location identified in order to allow the GPS sensor to know where to look for the satellites. Once it has the information, it can find the GPS satellites, and is fine. There is no way for your app to get around that fact, I'm afraid.
Have you defined <uses-permission android:name="android.permission.INTERNET" /> in AndroidManifest.xml
If yes then check you internet connection:
Or
Check My Answer Here: Get current latitude and longtitude
I'm attempting to get my phone to update the assisted GPS info.
I've followed the instructions outlined in question
Android: How to reset and download A-GPS data?
This seems to tell GPS to remove the "almanac" SO I'll assume the next time my handheld attempts to connect it will also attempt to get the almanac.
This is not really what I'm looking for, because (at least according to wikipedia) GPS take about 12.5 minutes to get the new almanac. It does indeed feel that long, though I've not timed it. Even 5 minutes seems like a long wait when I'm ready to start a run.
When i was skulking about, I came across "GPS Status & Toolbox." This app downloads the data via wifi or 3g. It's lightning fast and perfectly suited to my needs.
Beyond setting clearing the data, I'm wondering if anyone knows how they accomplish the insertion of the data?
You are confusing two different methods to obtain the almanac necessary for GPS to compute user locations:
Receive and decode the almanac directly from the GPS satellite signal, which is broadcast in its navigation message. This is the part that takes 12.5 minutes (i.e. to download the entire almanac from scratch. In practice, this is only needed after a "cold start" of the GPS receiver). In general, a GPS receiver does not require the almanac to obtain a position solution. Instead it performs a so-called sky search to determine which satellite signals are present.
Receive the almanac from an alternative network (e.g. cellular network) that is dedicated to providing such information. This method is also known as Assisted-GPS (A-GPS). This is the method that smartphone-based receivers will typically use, as it is much faster.
The answer you cited concerns the second method, i.e. telling the system to retrieve an updated almanac from a server.
For those who came to this page due to the headline "Is there a way to download the GPS almanac?" and who want to actually see how the almanac data actually looks, you can always download the current almanac data from the US Navigation Center.
First you must distinguish between
almanach
epheremides
preditced ephermides model
The almanach contains the rough satellite curves, valid for "long" time.
Once received the chip does not need to wait for it each time.
The epheremides contains the detailed satellite orbit modell. They are valid a short time.
The predicted ephermides is a ephermides modell that can predict up to two weeks.
It has to be downloaded form a server, this data is not available through GPS communication. And might be proprietary to specific GPS chip manufacturer.
You can set both the almanach and the epheremides to the chip, via (custom) NMEA or usually the GPS chips properietary binary messages.
How this can be done via a hack on android i cannot tell you.
I expect that android OS does this automatcially without need to have a GPS Status Toolbox