As i started playing around Android programming, as soon I got the grip on the basic, I had go deep into "localization". So I had read a lot of manual pages, web pages and post about it. My first step was to create a class which allow me to select the best location provider, in several study case. So my mainly choice parameter were the requested accuracy, the status of the battery, and if I get the passive data then the age of the Location Object.
Two fact drawing my attention: the passive provider, and the improve of precision of coordinates when the wi-fi was turned on. So I have investigate how it was work, and I found several blog article or post , which explain how it work, and support it by example on how happen when people relocate without changes ("relocate") theirs their's wi-fi hot spot: a catastrophic lack in accuracy of the Location.
However in the last days I have had some spare time so I have tried to better understand the accuracy of the smart phone devices. First of all I have detected a point with fixed coordinate (in order to compare with Location data). Then I have use my old Localization class to write an App which write into a file all the parameters stored into a Location class.
Before to jump into the data analysis, I would recollect some basics term.
A devices can have several location providers (A-GPS, GPS, Network, Cell-ID), each of this providers can output a location. In the Android OS a Location  is a class with several methods and fields. For the analysis I will consider the following parameters that, accordingly to my opinion are the most important:
- Accuracy (double): which is only about horizontal value, and is a length, which represent a circle within we have the 0.68 probability to be inside.
- Latitude (double).
- Longitude (double).
- Altitude (double).
- Time (long), the UCT time of the fix.
- Bundle (android.os.Bundle), which is specific information and depends on the provider.
I have written a simple application that updates and collects the location data for every available provider, every 5 seconds for 30 times. I have used an instance of the class java.util.Timer and have extended the class java.util.TimerTask. For every Location I have extract the fields I have described before and wrote them down in a .csv file.
After I had collected the data, I had to find a point with known coordinates, then with all my devices I collected the information for that point.
To simplify the analyses I will not use the accuracy and I'll consider the collected data as a single measure (a perfect shot!). However I will use the known point coordinates and from all the sample values I will evaluate the accuarcy with a Circular Error Probability (CERP) set to 0.68 and 0.95. To perform all the statistical analysis I'll use R .