My altitude tests are as follows.
To shorten things up, I'll refer to iFly as "IF", the GPS Essentials app as "GE", and the GPS Status app as "GS". My Samsung S21+ phone will just be "S21", the Android-running Samsung Tab E tablet in my plane will just be "TabE" and the other tablet in my plane, a generic Android, will be "TabX". In the plane, my electronic barometric Attitude/Altitude Indicator will be "AV30", and my copilot's iPhone (using his compass app) will be "IP".
The S21 is running Android 12, and iFly 11.1.38. The tablets are running (I believe) Android 8, and they're (definitely) running iFly 11.1.26.
On the drive to the airport, switching back and forth between IF, GE, and GS on my phone, whenever I switched between GS and IF/GE (both IF & GE always giving the same reading), GS was always reporting 50' to 70' higher than IF/GE. This difference was very consistent, and much closer to "reality". Though still not accurate, because...
At one point in the drive, there is about a 5 mile straight and level section of I-5 at an altitude very close to sea level (I would guess about 20'). The readings were very steady at:
- GS: -12 (not great)
- IF/GE: -78 (horrible)
At the airport, in my plane in front of my hangar at KAWO, at a known altitude of 142' with ADS-B powered down, all of the devices (except the iPhone and the AV30-C) were too low. The readings were:
- AV30: 170 (when set to baro reading of 30.54 from the KAWO AWOS)
- IF on S21: 31
- IF on TabE: 115
- IF on TabX: 85
- GE on S21: 34
- GE on TabE: 33
- GE on TabX: 30
- GS on S21: 79 (error: +/- 12')
- GS on TabE: 72 (error: +/- 12')
- GS on TabX: 69 (error: +/- 12')
- IP: 140
Same situation, but with the ADS-B unit powered up and iFly connected to it:
In the air, I used my AV30 as the altimeter since it has a nice digital display. (Note: it was always in agreement with my steam gauge altimeter.) I would get the plane stablized at 2000' (manually -- I don't have an autopilot), and then I/copilot would take readings off the devices and my copilot would write them down. There are variations to be expected, since I was manually trying to fly level (or re-establish level), and we also could not be expected to read/note all devices exactly simultaneously.
With the ADS-B powered down, the readings were:
- IF on S21: 1860
- IF on TabE: 1933
- IF on TabX: 1913
- GE on S21: 1863
- GE on TabE: 1865
- GE on TabX: 1860
- GS on S21: 1900 (error: +/- 12')
- GS on TabE: 1887 (error: +/- 12')
- GS on TabX: 1880 (error: +/- 12')
- IP: 1900
With the ADS-B unit powered up and iFly connected to it:
- IF on S21/TabE/TabX: 1860
If we make an assumption that the iPhone is a better altitude sensor, based on its ground performance (140' readout vs known 142'), and if we make a big assumption of extrapolating that to the flight (where the iPhone read 1900'), then we might assume that I was actually flying closer to 1900' instead of 2000'. That would make better sense of the other device readings.
There are a few reasons that my AV30 was possibly not giving me a good altitude during the test: it was a very cold day, so the altimeter would be expected to overstate my altitude the higher I go; I was not doing the test over my airport, so the baro pressure I input into the device may no longer have been "accurate" at that location; and from the get-go it was 28' high (170' vs airport altitude of 142').
If 1900' was closer to my true altitude, then the 1860' readings from the ADS-B unit via the ADS-B stream were reasonably close. Also, the 1933' and 1913' from the tablets via the API, were close.
But the S21+ had the same issue in the air as it did on the ground: when altitude was derived via the API (using IF or GE) it was about 50' lower than the other devices. Whereas, when derived via whatever process GS uses, it was in agreement with those other devices. To me it is clear that the API does not provide accurate altitude on the S21+. It showed that in all cases: on the drive, while sitting at the airport, and in the air.
Interestingly, the API does seem to provide reasonable numbers on the tablets. I was surprised by that. I was expecting the API to be universally wrong across all devices.
At first, you might jump to the conclusion that this API issue with the S21+ phone is simply due to the difference in hardware (phone vs tablets). As in: maybe the phone's GPS hardware is less accurate than the tablets'. But the GS app, running on the same phone, provides better numbers than the API. With a real consistent difference of around 50'. That says to me that the phone GPS hardware is not the issue (or at least it's not the total issue -- it may naturally give numbers lower than the tablets). It's the API that IF (and presumable GE) is using that's the issue -- but only on the phone.
So... is the Android version the issue? The phone is version 12, and the tablets are older version(s). Or did the API change between iFly 11.1.26 and 11.1.38? Or does the API behave differently on one device versus another?