Loading location/java/android/location/GnssMeasurement.java +116 −24 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ public final class GnssMeasurement implements Parcelable { private double mCarrierPhaseUncertainty; private int mMultipathIndicator; private double mSnrInDb; private double mAgcLevelDb; // The following enumerations must be in sync with the values declared in gps.h Loading @@ -56,6 +57,7 @@ public final class GnssMeasurement implements Parcelable { private static final int HAS_CARRIER_CYCLES = (1<<10); private static final int HAS_CARRIER_PHASE = (1<<11); private static final int HAS_CARRIER_PHASE_UNCERTAINTY = (1<<12); private static final int HAS_AUTOMATIC_GAIN_CONTROL = (1<<13); /** * The status of the multipath indicator. Loading Loading @@ -111,6 +113,20 @@ public final class GnssMeasurement implements Parcelable { public static final int STATE_GAL_E1B_PAGE_SYNC = (1<<12); /** This SBAS measurement's tracking state has whole second level sync. */ public static final int STATE_SBAS_SYNC = (1<<13); /** * This GNSS measurement's tracking state has time-of-week known, possibly not decoded * over the air but has been determined from other sources. If TOW decoded is set then TOW Known * will also be set. * @hide */ public static final int STATE_TOW_KNOWN = (1<<14); /** * This Glonass measurement's tracking state has time-of-day known, possibly not decoded * over the air but has been determined from other sources. If TOD decoded is set then TOD Known * will also be set. * @hide */ public static final int STATE_GLO_TOD_KNOWN = (1<<15); /** * All the GNSS receiver state flags, for bit masking purposes (not a sensible state for any Loading Loading @@ -180,6 +196,7 @@ public final class GnssMeasurement implements Parcelable { mCarrierPhaseUncertainty = measurement.mCarrierPhaseUncertainty; mMultipathIndicator = measurement.mMultipathIndicator; mSnrInDb = measurement.mSnrInDb; mAgcLevelDb = measurement.mAgcLevelDb; } /** Loading Loading @@ -299,6 +316,9 @@ public final class GnssMeasurement implements Parcelable { if ((mState & STATE_TOW_DECODED) != 0) { builder.append("TowDecoded|"); } if ((mState & STATE_TOW_KNOWN) != 0) { builder.append("TowKnown|"); } if ((mState & STATE_MSEC_AMBIGUOUS) != 0) { builder.append("MsecAmbiguous|"); } Loading @@ -311,6 +331,9 @@ public final class GnssMeasurement implements Parcelable { if ((mState & STATE_GLO_TOD_DECODED) != 0) { builder.append("GloTodDecoded|"); } if ((mState & STATE_GLO_TOD_KNOWN) != 0) { builder.append("GloTodKnown|"); } if ((mState & STATE_BDS_D2_BIT_SYNC) != 0) { builder.append("BdsD2BitSync|"); } Loading Loading @@ -356,10 +379,14 @@ public final class GnssMeasurement implements Parcelable { * C/A code lock : [ 0 1ms ] : STATE_CODE_LOCK is set * Bit sync : [ 0 20ms ] : STATE_BIT_SYNC is set * Subframe sync : [ 0 6s ] : STATE_SUBFRAME_SYNC is set * TOW decoded : [ 0 1week ] : STATE_TOW_DECODED is set</pre> * TOW decoded : [ 0 1week ] : STATE_TOW_DECODED is set * TOW Known : [ 0 1week ] : STATE_TOW_KNOWN set</pre> * * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has * been determined from other sources. If TOW decoded is set then TOW Known must also be set. * * <p>Note well: if there is any ambiguity in integer millisecond, {@code STATE_MSEC_AMBIGUOUS} * should be set accordingly, in the 'state' field. * must be set accordingly, in the 'state' field. * * <p>This value must be populated if 'state' != {@code STATE_UNKNOWN}. * Loading @@ -376,7 +403,12 @@ public final class GnssMeasurement implements Parcelable { * Symbol sync : [ 0 10ms ] : STATE_SYMBOL_SYNC is set * Bit sync : [ 0 20ms ] : STATE_BIT_SYNC is set * String sync : [ 0 2s ] : STATE_GLO_STRING_SYNC is set * Time of day : [ 0 1day ] : STATE_GLO_TOD_DECODED is set</pre> * Time of day decoded : [ 0 1day ] : STATE_GLO_TOD_DECODED is set * Time of day known : [ 0 1day ] : STATE_GLO_TOD_KNOWN set</pre> * * Note: Time of day known refers to the case where it is possibly not decoded over the air but * has been determined from other sources. If Time of day decoded is set then Time of day known * must also be set. * * <p>For Beidou, this is: * <ul> Loading @@ -392,7 +424,11 @@ public final class GnssMeasurement implements Parcelable { * Bit sync (D1) : [ 0 20ms ] : STATE_BIT_SYNC is set * Subframe (D2) : [ 0 0.6s ] : STATE_BDS_D2_SUBFRAME_SYNC is set * Subframe (D1) : [ 0 6s ] : STATE_SUBFRAME_SYNC is set * Time of week : [ 0 1week ] : STATE_TOW_DECODED is set</pre> * Time of week decoded : [ 0 1week ] : STATE_TOW_DECODED is set * Time of week known : [ 0 1week ] : STATE_TOW_KNOWN set</pre> * * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has * been determined from other sources. If TOW decoded is set then TOW Known must also be set. * * <p>For Galileo, this is: * <ul> Loading @@ -402,7 +438,11 @@ public final class GnssMeasurement implements Parcelable { * E1BC code lock : [ 0 4ms ] : STATE_GAL_E1BC_CODE_LOCK is set * E1C 2nd code lock : [ 0 100ms ] : STATE_GAL_E1C_2ND_CODE_LOCK is set * E1B page : [ 0 2s ] : STATE_GAL_E1B_PAGE_SYNC is set * Time of week : [ 0 1week ] : STATE_GAL_TOW_DECODED is set</pre> * Time of week decoded : [ 0 1week ] : STATE_GAL_TOW_DECODED is set * Time of week known : [ 0 1week ] : STATE_GAL_TOW_KNOWN set</pre> * * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has * been determined from other sources. If TOW decoded is set then TOW Known must also be set. * * <p>For SBAS, this is: * <ul> Loading Loading @@ -620,10 +660,10 @@ public final class GnssMeasurement implements Parcelable { } /** * Gets the carrier frequency at which codes and messages are modulated. * Gets the carrier frequency of the tracked signal. * * <p>For GPS, e.g., it can be L1 or L2. If the field is not set, it is the primary common use * frequency, e.g. L1 for GPS. * <p>For example it can be the GPS L1 = 1.57542e9 Hz, or L2, L5, varying GLO channels, etc. If * the field is not set, it is the primary common use frequency, e.g. L1 for GPS. * * <p>The value is only available if {@link #hasCarrierFrequencyHz()} is {@code true}. */ Loading @@ -632,7 +672,7 @@ public final class GnssMeasurement implements Parcelable { } /** * Sets the Carrier frequency (L1 or L2) in Hz. * Sets the Carrier frequency in Hz. * @hide */ @TestApi Loading @@ -642,7 +682,7 @@ public final class GnssMeasurement implements Parcelable { } /** * Resets the Carrier frequency (L1 or L2) in Hz. * Resets the Carrier frequency in Hz. * @hide */ @TestApi Loading Loading @@ -843,6 +883,51 @@ public final class GnssMeasurement implements Parcelable { mSnrInDb = Double.NaN; } /** * Returns {@code true} if {@link #getAgcLevelDb()} is available, {@code false} otherwise. * @hide */ public boolean hasAgcLevelDb() { return isFlagSet(HAS_AUTOMATIC_GAIN_CONTROL); } /** * Gets the Automatic Gain Control level in dB. * * <p> AGC acts as a variable gain amplifier adjusting the power of the incoming signal to * minimize the quantization losses. The AGC level may be used to indicate potential * interference. When AGC is at a nominal level, this value must be set as 0. Higher gain * (and/or lower input power) shall be output as a positive number. Hence in cases of strong * jamming, in the band of this signal, this value will go more negative. * <p>Note: Different hardware designs (e.g. antenna, pre-amplification, or other RF HW * components) may also affect the typical output of of this value on any given hardware design * in an open sky test - the important aspect of this output is that changes in this value are * indicative of changes on input signal power in the frequency band for this measurement. * <p>The value is only available if {@link #hasAgcLevelDb()} is {@code true}. * @hide */ public double getAgcLevelDb() { return mAgcLevelDb; } /** * Sets the Automatic Gain Control level in dB. * @hide */ public void setAgcLevelDb(double agcLevelDb) { setFlag(HAS_AUTOMATIC_GAIN_CONTROL); mAgcLevelDb = agcLevelDb; } /** * Resets the Automatic Gain Control level. * @hide */ public void resetAgcLevel() { resetFlag(HAS_AUTOMATIC_GAIN_CONTROL); mAgcLevelDb = Double.NaN; } public static final Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() { @Override public GnssMeasurement createFromParcel(Parcel parcel) { Loading @@ -867,6 +952,7 @@ public final class GnssMeasurement implements Parcelable { gnssMeasurement.mCarrierPhaseUncertainty = parcel.readDouble(); gnssMeasurement.mMultipathIndicator = parcel.readInt(); gnssMeasurement.mSnrInDb = parcel.readDouble(); gnssMeasurement.mAgcLevelDb = parcel.readDouble(); return gnssMeasurement; } Loading Loading @@ -898,6 +984,7 @@ public final class GnssMeasurement implements Parcelable { parcel.writeDouble(mCarrierPhaseUncertainty); parcel.writeInt(mMultipathIndicator); parcel.writeDouble(mSnrInDb); parcel.writeDouble(mAgcLevelDb); } @Override Loading Loading @@ -968,6 +1055,10 @@ public final class GnssMeasurement implements Parcelable { format, "SnrInDb", hasSnrInDb() ? mSnrInDb : null)); builder.append(String.format( format, "AgcLevelDb", hasAgcLevelDb() ? mAgcLevelDb : null)); return builder.toString(); } Loading @@ -991,6 +1082,7 @@ public final class GnssMeasurement implements Parcelable { resetCarrierPhaseUncertainty(); setMultipathIndicator(MULTIPATH_INDICATOR_UNKNOWN); resetSnrInDb(); resetAgcLevel(); } private void setFlag(int flag) { Loading location/java/android/location/GnssStatus.java +29 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ public final class GnssStatus { public static final int GNSS_SV_FLAGS_HAS_ALMANAC_DATA = (1 << 1); /** @hide */ public static final int GNSS_SV_FLAGS_USED_IN_FIX = (1 << 2); /** @hide */ public static final int GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY = (1 << 3); /** @hide */ public static final int SVID_SHIFT_WIDTH = 7; Loading Loading @@ -101,14 +103,16 @@ public final class GnssStatus { /* package */ float[] mElevations; /* package */ float[] mAzimuths; /* package */ int mSvCount; /* package */ float[] mCarrierFrequencies; GnssStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations, float[] azimuths) { float[] azimuths, float[] carrierFrequencies) { mSvCount = svCount; mSvidWithFlags = svidWithFlags; mCn0DbHz = cn0s; mElevations = elevations; mAzimuths = azimuths; mCarrierFrequencies = carrierFrequencies; } /** Loading Loading @@ -213,4 +217,28 @@ public final class GnssStatus { public boolean usedInFix(int satIndex) { return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_USED_IN_FIX) != 0; } /** * Reports whether {@link #getCarrierFrequencyHz(int satIndex)} is available (i.e. carrier * frequency is available for the satellite at the specified index). * * @param satIndex the index of the satellite in the list. * @hide */ public boolean hasCarrierFrequency(int satIndex) { return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) != 0; } /** * Gets the carrier frequency of the signal tracked. * * For example it can be the GPS L1 = 1.57542e9 Hz, or L2, L5, varying GLO channels, etc. If * the field is not set, it is the primary common use frequency, e.g. L1 for GPS. * * <p>The value is only available if {@link #hasCarrierFrequency(int satIndex)} is {@code true}. * @hide */ public float getCarrierFrequencyHz(int satIndex) { return mCarrierFrequencies[satIndex]; } } location/java/android/location/IGnssStatusListener.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ oneway interface IGnssStatusListener void onGnssStopped(); void onFirstFix(int ttff); void onSvStatusChanged(int svCount, in int[] svidWithFlags, in float[] cn0s, in float[] elevations, in float[] azimuths); in float[] elevations, in float[] azimuths, in float[] carrierFreqs); void onNmeaReceived(long timestamp, String nmea); } location/java/android/location/Location.java +214 −33 Original line number Diff line number Diff line Loading @@ -81,23 +81,35 @@ public class Location implements Parcelable { /** * Bit mask for mFieldsMask indicating the presence of mAltitude. */ private static final byte HAS_ALTITUDE_MASK = 1; private static final int HAS_ALTITUDE_MASK = 1; /** * Bit mask for mFieldsMask indicating the presence of mSpeed. */ private static final byte HAS_SPEED_MASK = 2; private static final int HAS_SPEED_MASK = 2; /** * Bit mask for mFieldsMask indicating the presence of mBearing. */ private static final byte HAS_BEARING_MASK = 4; private static final int HAS_BEARING_MASK = 4; /** * Bit mask for mFieldsMask indicating the presence of mAccuracy. * Bit mask for mFieldsMask indicating the presence of mHorizontalAccuracy. */ private static final byte HAS_ACCURACY_MASK = 8; private static final int HAS_HORIZONTAL_ACCURACY_MASK = 8; /** * Bit mask for mFieldsMask indicating location is from a mock provider. */ private static final byte HAS_MOCK_PROVIDER_MASK = 16; private static final int HAS_MOCK_PROVIDER_MASK = 16; /** * Bit mask for mFieldsMask indicating the presence of mVerticalAccuracy. */ private static final int HAS_VERTICAL_ACCURACY_MASK = 32; /** * Bit mask for mFieldsMask indicating the presence of mSpeedAccuracy. */ private static final int HAS_SPEED_ACCURACY_MASK = 64; /** * Bit mask for mFieldsMask indicating the presence of mBearingAccuracy. */ private static final int HAS_BEARING_ACCURACY_MASK = 128; // Cached data to make bearing/distance computations more efficient for the case // where distanceTo and bearingTo are called in sequence. Assume this typically happens Loading @@ -118,7 +130,11 @@ public class Location implements Parcelable { private double mAltitude = 0.0f; private float mSpeed = 0.0f; private float mBearing = 0.0f; private float mAccuracy = 0.0f; private float mHorizontalAccuracyMeters = 0.0f; private float mVerticalAccuracyMeters = 0.0f; private float mSpeedAccuracyMetersPerSecond = 0.0f; private float mBearingAccuracyDegrees = 0.0f; private Bundle mExtras = null; // A bitmask of fields present in this object (see HAS_* constants defined above). Loading Loading @@ -156,7 +172,10 @@ public class Location implements Parcelable { mAltitude = l.mAltitude; mSpeed = l.mSpeed; mBearing = l.mBearing; mAccuracy = l.mAccuracy; mHorizontalAccuracyMeters = l.mHorizontalAccuracyMeters; mVerticalAccuracyMeters = l.mVerticalAccuracyMeters; mSpeedAccuracyMetersPerSecond = l.mSpeedAccuracyMetersPerSecond; mBearingAccuracyDegrees = l.mBearingAccuracyDegrees; mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras); } Loading @@ -173,7 +192,10 @@ public class Location implements Parcelable { mAltitude = 0; mSpeed = 0; mBearing = 0; mAccuracy = 0; mHorizontalAccuracyMeters = 0; mVerticalAccuracyMeters = 0; mSpeedAccuracyMetersPerSecond = 0; mBearingAccuracyDegrees = 0; mExtras = null; } Loading Loading @@ -718,19 +740,18 @@ public class Location implements Parcelable { } /** * True if this location has an accuracy. * True if this location has a horizontal accuracy. * * <p>All locations generated by the {@link LocationManager} have an * accuracy. * <p>All locations generated by the {@link LocationManager} have an horizontal accuracy. */ public boolean hasAccuracy() { return (mFieldsMask & HAS_ACCURACY_MASK) != 0; return (mFieldsMask & HAS_HORIZONTAL_ACCURACY_MASK) != 0; } /** * Get the estimated accuracy of this location, in meters. * Get the estimated horizontal accuracy of this location, radial, in meters. * * <p>We define accuracy as the radius of 68% confidence. In other * <p>We define horizontal accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's * latitude and longitude, and with a radius equal to the accuracy, * then there is a 68% probability that the true location is inside Loading @@ -745,35 +766,183 @@ public class Location implements Parcelable { * accuracy, and does not indicate the accuracy of bearing, * velocity or altitude if those are included in this Location. * * <p>If this location does not have an accuracy, then 0.0 is returned. * All locations generated by the {@link LocationManager} include * an accuracy. * <p>If this location does not have a horizontal accuracy, then 0.0 is returned. * All locations generated by the {@link LocationManager} include horizontal accuracy. */ public float getAccuracy() { return mAccuracy; return mHorizontalAccuracyMeters; } /** * Set the estimated accuracy of this location, meters. * Set the estimated horizontal accuracy of this location, meters. * * <p>See {@link #getAccuracy} for the definition of accuracy. * <p>See {@link #getAccuracy} for the definition of horizontal accuracy. * * <p>Following this call {@link #hasAccuracy} will return true. */ public void setAccuracy(float accuracy) { mAccuracy = accuracy; mFieldsMask |= HAS_ACCURACY_MASK; public void setAccuracy(float horizontalAccuracy) { mHorizontalAccuracyMeters = horizontalAccuracy; mFieldsMask |= HAS_HORIZONTAL_ACCURACY_MASK; } /** * Remove the accuracy from this location. * Remove the horizontal accuracy from this location. * * <p>Following this call {@link #hasAccuracy} will return false, and * {@link #getAccuracy} will return 0.0. */ public void removeAccuracy() { mAccuracy = 0.0f; mFieldsMask &= ~HAS_ACCURACY_MASK; mHorizontalAccuracyMeters = 0.0f; mFieldsMask &= ~HAS_HORIZONTAL_ACCURACY_MASK; } /** * True if this location has a vertical accuracy. * @hide */ public boolean hasVerticalAccuracy() { return (mFieldsMask & HAS_VERTICAL_ACCURACY_MASK) != 0; } /** * Get the estimated vertical accuracy of this location, in meters. * * <p>We define vertical accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's altitude, and with a radius * equal to the vertical accuracy, then there is a 68% probability that the true altitude is * inside the circle. * * <p>In statistical terms, it is assumed that location errors * are random with a normal distribution, so the 68% confidence circle * represents one standard deviation. Note that in practice, location * errors do not always follow such a simple distribution. * * <p>If this location does not have a vertical accuracy, then 0.0 is returned. * @hide */ public float getVerticalAccuracyMeters() { return mVerticalAccuracyMeters; } /** * Set the estimated vertical accuracy of this location, meters. * * <p>See {@link #getVerticalAccuracyMeters} for the definition of vertical accuracy. * * <p>Following this call {@link #hasVerticalAccuracy} will return true. * @hide */ public void setVerticalAccuracyMeters(float verticalAccuracyMeters) { mVerticalAccuracyMeters = verticalAccuracyMeters; mFieldsMask |= HAS_VERTICAL_ACCURACY_MASK; } /** * Remove the vertical accuracy from this location. * * <p>Following this call {@link #hasVerticalAccuracy} will return false, and * {@link #getVerticalAccuracyMeters} will return 0.0. * @hide */ public void removeVerticalAccuracy() { mVerticalAccuracyMeters = 0.0f; mFieldsMask &= ~HAS_VERTICAL_ACCURACY_MASK; } /** * True if this location has a speed accuracy. * @hide */ public boolean hasSpeedAccuracy() { return (mFieldsMask & HAS_SPEED_ACCURACY_MASK) != 0; } /** * Get the estimated speed accuracy of this location, in meters per second. * * <p>We define speed accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's speed, and with a radius * equal to the speed accuracy, then there is a 68% probability that the true speed is * inside the circle. * * <p>If this location does not have a speed accuracy, then 0.0 is returned. * @hide */ public float getSpeedAccuracyMetersPerSecond() { return mSpeedAccuracyMetersPerSecond; } /** * Set the estimated speed accuracy of this location, meters per second. * * <p>See {@link #getSpeedAccuracyMetersPerSecond} for the definition of speed accuracy. * * <p>Following this call {@link #hasSpeedAccuracy} will return true. * @hide */ public void setSpeedAccuracyMetersPerSecond(float speedAccuracyMeterPerSecond) { mSpeedAccuracyMetersPerSecond = speedAccuracyMeterPerSecond; mFieldsMask |= HAS_SPEED_ACCURACY_MASK; } /** * Remove the speed accuracy from this location. * * <p>Following this call {@link #hasSpeedAccuracy} will return false, and * {@link #getSpeedAccuracyMetersPerSecond} will return 0.0. * @hide */ public void removeSpeedAccuracy() { mSpeedAccuracyMetersPerSecond = 0.0f; mFieldsMask &= ~HAS_SPEED_ACCURACY_MASK; } /** * True if this location has a bearing accuracy. * @hide */ public boolean hasBearingAccuracy() { return (mFieldsMask & HAS_BEARING_ACCURACY_MASK) != 0; } /** * Get the estimated bearing accuracy of this location, in degrees. * * <p>We define bearing accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's bearing, and with a radius * equal to the bearing accuracy, then there is a 68% probability that the true bearing is * inside the circle. * * <p>If this location does not have a bearing accuracy, then 0.0 is returned. * @hide */ public float getBearingAccuracyDegrees() { return mBearingAccuracyDegrees; } /** * Set the estimated bearing accuracy of this location, degrees. * * <p>See {@link #getBearingAccuracyDegrees} for the definition of bearing accuracy. * * <p>Following this call {@link #hasBearingAccuracy} will return true. * @hide */ public void setBearingAccuracyDegrees(float bearingAccuracyDegrees) { mBearingAccuracyDegrees = bearingAccuracyDegrees; mFieldsMask |= HAS_BEARING_ACCURACY_MASK; } /** * Remove the bearing accuracy from this location. * * <p>Following this call {@link #hasBearingAccuracy} will return false, and * {@link #getBearingAccuracyDegrees} will return 0.0. * @hide */ public void removeBearingAccuracy() { mBearingAccuracyDegrees = 0.0f; mFieldsMask &= ~HAS_BEARING_ACCURACY_MASK; } /** Loading Loading @@ -810,8 +979,8 @@ public class Location implements Parcelable { public void makeComplete() { if (mProvider == null) mProvider = "?"; if (!hasAccuracy()) { mFieldsMask |= HAS_ACCURACY_MASK; mAccuracy = 100.0f; mFieldsMask |= HAS_HORIZONTAL_ACCURACY_MASK; mHorizontalAccuracyMeters = 100.0f; } if (mTime == 0) mTime = System.currentTimeMillis(); if (mElapsedRealtimeNanos == 0) mElapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos(); Loading Loading @@ -849,8 +1018,8 @@ public class Location implements Parcelable { s.append("Location["); s.append(mProvider); s.append(String.format(" %.6f,%.6f", mLatitude, mLongitude)); if (hasAccuracy()) s.append(String.format(" acc=%.0f", mAccuracy)); else s.append(" acc=???"); if (hasAccuracy()) s.append(String.format(" hAcc=%.0f", mHorizontalAccuracyMeters)); else s.append(" hAcc=???"); if (mTime == 0) { s.append(" t=?!?"); } Loading @@ -863,6 +1032,12 @@ public class Location implements Parcelable { if (hasAltitude()) s.append(" alt=").append(mAltitude); if (hasSpeed()) s.append(" vel=").append(mSpeed); if (hasBearing()) s.append(" bear=").append(mBearing); if (hasVerticalAccuracy()) s.append(String.format(" vAcc=%.0f", mVerticalAccuracyMeters)); else s.append(" vAcc=???"); if (hasSpeedAccuracy()) s.append(String.format(" sAcc=%.0f", mSpeedAccuracyMetersPerSecond)); else s.append(" sAcc=???"); if (hasBearingAccuracy()) s.append(String.format(" bAcc=%.0f", mBearingAccuracyDegrees)); else s.append(" bAcc=???"); if (isFromMockProvider()) s.append(" mock"); if (mExtras != null) { Loading Loading @@ -890,7 +1065,10 @@ public class Location implements Parcelable { l.mAltitude = in.readDouble(); l.mSpeed = in.readFloat(); l.mBearing = in.readFloat(); l.mAccuracy = in.readFloat(); l.mHorizontalAccuracyMeters = in.readFloat(); l.mVerticalAccuracyMeters = in.readFloat(); l.mSpeedAccuracyMetersPerSecond = in.readFloat(); l.mBearingAccuracyDegrees = in.readFloat(); l.mExtras = Bundle.setDefusable(in.readBundle(), true); return l; } Loading @@ -917,7 +1095,10 @@ public class Location implements Parcelable { parcel.writeDouble(mAltitude); parcel.writeFloat(mSpeed); parcel.writeFloat(mBearing); parcel.writeFloat(mAccuracy); parcel.writeFloat(mHorizontalAccuracyMeters); parcel.writeFloat(mVerticalAccuracyMeters); parcel.writeFloat(mSpeedAccuracyMetersPerSecond); parcel.writeFloat(mBearingAccuracyDegrees); parcel.writeBundle(mExtras); } Loading location/java/android/location/LocationManager.java +3 −2 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
location/java/android/location/GnssMeasurement.java +116 −24 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ public final class GnssMeasurement implements Parcelable { private double mCarrierPhaseUncertainty; private int mMultipathIndicator; private double mSnrInDb; private double mAgcLevelDb; // The following enumerations must be in sync with the values declared in gps.h Loading @@ -56,6 +57,7 @@ public final class GnssMeasurement implements Parcelable { private static final int HAS_CARRIER_CYCLES = (1<<10); private static final int HAS_CARRIER_PHASE = (1<<11); private static final int HAS_CARRIER_PHASE_UNCERTAINTY = (1<<12); private static final int HAS_AUTOMATIC_GAIN_CONTROL = (1<<13); /** * The status of the multipath indicator. Loading Loading @@ -111,6 +113,20 @@ public final class GnssMeasurement implements Parcelable { public static final int STATE_GAL_E1B_PAGE_SYNC = (1<<12); /** This SBAS measurement's tracking state has whole second level sync. */ public static final int STATE_SBAS_SYNC = (1<<13); /** * This GNSS measurement's tracking state has time-of-week known, possibly not decoded * over the air but has been determined from other sources. If TOW decoded is set then TOW Known * will also be set. * @hide */ public static final int STATE_TOW_KNOWN = (1<<14); /** * This Glonass measurement's tracking state has time-of-day known, possibly not decoded * over the air but has been determined from other sources. If TOD decoded is set then TOD Known * will also be set. * @hide */ public static final int STATE_GLO_TOD_KNOWN = (1<<15); /** * All the GNSS receiver state flags, for bit masking purposes (not a sensible state for any Loading Loading @@ -180,6 +196,7 @@ public final class GnssMeasurement implements Parcelable { mCarrierPhaseUncertainty = measurement.mCarrierPhaseUncertainty; mMultipathIndicator = measurement.mMultipathIndicator; mSnrInDb = measurement.mSnrInDb; mAgcLevelDb = measurement.mAgcLevelDb; } /** Loading Loading @@ -299,6 +316,9 @@ public final class GnssMeasurement implements Parcelable { if ((mState & STATE_TOW_DECODED) != 0) { builder.append("TowDecoded|"); } if ((mState & STATE_TOW_KNOWN) != 0) { builder.append("TowKnown|"); } if ((mState & STATE_MSEC_AMBIGUOUS) != 0) { builder.append("MsecAmbiguous|"); } Loading @@ -311,6 +331,9 @@ public final class GnssMeasurement implements Parcelable { if ((mState & STATE_GLO_TOD_DECODED) != 0) { builder.append("GloTodDecoded|"); } if ((mState & STATE_GLO_TOD_KNOWN) != 0) { builder.append("GloTodKnown|"); } if ((mState & STATE_BDS_D2_BIT_SYNC) != 0) { builder.append("BdsD2BitSync|"); } Loading Loading @@ -356,10 +379,14 @@ public final class GnssMeasurement implements Parcelable { * C/A code lock : [ 0 1ms ] : STATE_CODE_LOCK is set * Bit sync : [ 0 20ms ] : STATE_BIT_SYNC is set * Subframe sync : [ 0 6s ] : STATE_SUBFRAME_SYNC is set * TOW decoded : [ 0 1week ] : STATE_TOW_DECODED is set</pre> * TOW decoded : [ 0 1week ] : STATE_TOW_DECODED is set * TOW Known : [ 0 1week ] : STATE_TOW_KNOWN set</pre> * * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has * been determined from other sources. If TOW decoded is set then TOW Known must also be set. * * <p>Note well: if there is any ambiguity in integer millisecond, {@code STATE_MSEC_AMBIGUOUS} * should be set accordingly, in the 'state' field. * must be set accordingly, in the 'state' field. * * <p>This value must be populated if 'state' != {@code STATE_UNKNOWN}. * Loading @@ -376,7 +403,12 @@ public final class GnssMeasurement implements Parcelable { * Symbol sync : [ 0 10ms ] : STATE_SYMBOL_SYNC is set * Bit sync : [ 0 20ms ] : STATE_BIT_SYNC is set * String sync : [ 0 2s ] : STATE_GLO_STRING_SYNC is set * Time of day : [ 0 1day ] : STATE_GLO_TOD_DECODED is set</pre> * Time of day decoded : [ 0 1day ] : STATE_GLO_TOD_DECODED is set * Time of day known : [ 0 1day ] : STATE_GLO_TOD_KNOWN set</pre> * * Note: Time of day known refers to the case where it is possibly not decoded over the air but * has been determined from other sources. If Time of day decoded is set then Time of day known * must also be set. * * <p>For Beidou, this is: * <ul> Loading @@ -392,7 +424,11 @@ public final class GnssMeasurement implements Parcelable { * Bit sync (D1) : [ 0 20ms ] : STATE_BIT_SYNC is set * Subframe (D2) : [ 0 0.6s ] : STATE_BDS_D2_SUBFRAME_SYNC is set * Subframe (D1) : [ 0 6s ] : STATE_SUBFRAME_SYNC is set * Time of week : [ 0 1week ] : STATE_TOW_DECODED is set</pre> * Time of week decoded : [ 0 1week ] : STATE_TOW_DECODED is set * Time of week known : [ 0 1week ] : STATE_TOW_KNOWN set</pre> * * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has * been determined from other sources. If TOW decoded is set then TOW Known must also be set. * * <p>For Galileo, this is: * <ul> Loading @@ -402,7 +438,11 @@ public final class GnssMeasurement implements Parcelable { * E1BC code lock : [ 0 4ms ] : STATE_GAL_E1BC_CODE_LOCK is set * E1C 2nd code lock : [ 0 100ms ] : STATE_GAL_E1C_2ND_CODE_LOCK is set * E1B page : [ 0 2s ] : STATE_GAL_E1B_PAGE_SYNC is set * Time of week : [ 0 1week ] : STATE_GAL_TOW_DECODED is set</pre> * Time of week decoded : [ 0 1week ] : STATE_GAL_TOW_DECODED is set * Time of week known : [ 0 1week ] : STATE_GAL_TOW_KNOWN set</pre> * * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has * been determined from other sources. If TOW decoded is set then TOW Known must also be set. * * <p>For SBAS, this is: * <ul> Loading Loading @@ -620,10 +660,10 @@ public final class GnssMeasurement implements Parcelable { } /** * Gets the carrier frequency at which codes and messages are modulated. * Gets the carrier frequency of the tracked signal. * * <p>For GPS, e.g., it can be L1 or L2. If the field is not set, it is the primary common use * frequency, e.g. L1 for GPS. * <p>For example it can be the GPS L1 = 1.57542e9 Hz, or L2, L5, varying GLO channels, etc. If * the field is not set, it is the primary common use frequency, e.g. L1 for GPS. * * <p>The value is only available if {@link #hasCarrierFrequencyHz()} is {@code true}. */ Loading @@ -632,7 +672,7 @@ public final class GnssMeasurement implements Parcelable { } /** * Sets the Carrier frequency (L1 or L2) in Hz. * Sets the Carrier frequency in Hz. * @hide */ @TestApi Loading @@ -642,7 +682,7 @@ public final class GnssMeasurement implements Parcelable { } /** * Resets the Carrier frequency (L1 or L2) in Hz. * Resets the Carrier frequency in Hz. * @hide */ @TestApi Loading Loading @@ -843,6 +883,51 @@ public final class GnssMeasurement implements Parcelable { mSnrInDb = Double.NaN; } /** * Returns {@code true} if {@link #getAgcLevelDb()} is available, {@code false} otherwise. * @hide */ public boolean hasAgcLevelDb() { return isFlagSet(HAS_AUTOMATIC_GAIN_CONTROL); } /** * Gets the Automatic Gain Control level in dB. * * <p> AGC acts as a variable gain amplifier adjusting the power of the incoming signal to * minimize the quantization losses. The AGC level may be used to indicate potential * interference. When AGC is at a nominal level, this value must be set as 0. Higher gain * (and/or lower input power) shall be output as a positive number. Hence in cases of strong * jamming, in the band of this signal, this value will go more negative. * <p>Note: Different hardware designs (e.g. antenna, pre-amplification, or other RF HW * components) may also affect the typical output of of this value on any given hardware design * in an open sky test - the important aspect of this output is that changes in this value are * indicative of changes on input signal power in the frequency band for this measurement. * <p>The value is only available if {@link #hasAgcLevelDb()} is {@code true}. * @hide */ public double getAgcLevelDb() { return mAgcLevelDb; } /** * Sets the Automatic Gain Control level in dB. * @hide */ public void setAgcLevelDb(double agcLevelDb) { setFlag(HAS_AUTOMATIC_GAIN_CONTROL); mAgcLevelDb = agcLevelDb; } /** * Resets the Automatic Gain Control level. * @hide */ public void resetAgcLevel() { resetFlag(HAS_AUTOMATIC_GAIN_CONTROL); mAgcLevelDb = Double.NaN; } public static final Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() { @Override public GnssMeasurement createFromParcel(Parcel parcel) { Loading @@ -867,6 +952,7 @@ public final class GnssMeasurement implements Parcelable { gnssMeasurement.mCarrierPhaseUncertainty = parcel.readDouble(); gnssMeasurement.mMultipathIndicator = parcel.readInt(); gnssMeasurement.mSnrInDb = parcel.readDouble(); gnssMeasurement.mAgcLevelDb = parcel.readDouble(); return gnssMeasurement; } Loading Loading @@ -898,6 +984,7 @@ public final class GnssMeasurement implements Parcelable { parcel.writeDouble(mCarrierPhaseUncertainty); parcel.writeInt(mMultipathIndicator); parcel.writeDouble(mSnrInDb); parcel.writeDouble(mAgcLevelDb); } @Override Loading Loading @@ -968,6 +1055,10 @@ public final class GnssMeasurement implements Parcelable { format, "SnrInDb", hasSnrInDb() ? mSnrInDb : null)); builder.append(String.format( format, "AgcLevelDb", hasAgcLevelDb() ? mAgcLevelDb : null)); return builder.toString(); } Loading @@ -991,6 +1082,7 @@ public final class GnssMeasurement implements Parcelable { resetCarrierPhaseUncertainty(); setMultipathIndicator(MULTIPATH_INDICATOR_UNKNOWN); resetSnrInDb(); resetAgcLevel(); } private void setFlag(int flag) { Loading
location/java/android/location/GnssStatus.java +29 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ public final class GnssStatus { public static final int GNSS_SV_FLAGS_HAS_ALMANAC_DATA = (1 << 1); /** @hide */ public static final int GNSS_SV_FLAGS_USED_IN_FIX = (1 << 2); /** @hide */ public static final int GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY = (1 << 3); /** @hide */ public static final int SVID_SHIFT_WIDTH = 7; Loading Loading @@ -101,14 +103,16 @@ public final class GnssStatus { /* package */ float[] mElevations; /* package */ float[] mAzimuths; /* package */ int mSvCount; /* package */ float[] mCarrierFrequencies; GnssStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations, float[] azimuths) { float[] azimuths, float[] carrierFrequencies) { mSvCount = svCount; mSvidWithFlags = svidWithFlags; mCn0DbHz = cn0s; mElevations = elevations; mAzimuths = azimuths; mCarrierFrequencies = carrierFrequencies; } /** Loading Loading @@ -213,4 +217,28 @@ public final class GnssStatus { public boolean usedInFix(int satIndex) { return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_USED_IN_FIX) != 0; } /** * Reports whether {@link #getCarrierFrequencyHz(int satIndex)} is available (i.e. carrier * frequency is available for the satellite at the specified index). * * @param satIndex the index of the satellite in the list. * @hide */ public boolean hasCarrierFrequency(int satIndex) { return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) != 0; } /** * Gets the carrier frequency of the signal tracked. * * For example it can be the GPS L1 = 1.57542e9 Hz, or L2, L5, varying GLO channels, etc. If * the field is not set, it is the primary common use frequency, e.g. L1 for GPS. * * <p>The value is only available if {@link #hasCarrierFrequency(int satIndex)} is {@code true}. * @hide */ public float getCarrierFrequencyHz(int satIndex) { return mCarrierFrequencies[satIndex]; } }
location/java/android/location/IGnssStatusListener.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ oneway interface IGnssStatusListener void onGnssStopped(); void onFirstFix(int ttff); void onSvStatusChanged(int svCount, in int[] svidWithFlags, in float[] cn0s, in float[] elevations, in float[] azimuths); in float[] elevations, in float[] azimuths, in float[] carrierFreqs); void onNmeaReceived(long timestamp, String nmea); }
location/java/android/location/Location.java +214 −33 Original line number Diff line number Diff line Loading @@ -81,23 +81,35 @@ public class Location implements Parcelable { /** * Bit mask for mFieldsMask indicating the presence of mAltitude. */ private static final byte HAS_ALTITUDE_MASK = 1; private static final int HAS_ALTITUDE_MASK = 1; /** * Bit mask for mFieldsMask indicating the presence of mSpeed. */ private static final byte HAS_SPEED_MASK = 2; private static final int HAS_SPEED_MASK = 2; /** * Bit mask for mFieldsMask indicating the presence of mBearing. */ private static final byte HAS_BEARING_MASK = 4; private static final int HAS_BEARING_MASK = 4; /** * Bit mask for mFieldsMask indicating the presence of mAccuracy. * Bit mask for mFieldsMask indicating the presence of mHorizontalAccuracy. */ private static final byte HAS_ACCURACY_MASK = 8; private static final int HAS_HORIZONTAL_ACCURACY_MASK = 8; /** * Bit mask for mFieldsMask indicating location is from a mock provider. */ private static final byte HAS_MOCK_PROVIDER_MASK = 16; private static final int HAS_MOCK_PROVIDER_MASK = 16; /** * Bit mask for mFieldsMask indicating the presence of mVerticalAccuracy. */ private static final int HAS_VERTICAL_ACCURACY_MASK = 32; /** * Bit mask for mFieldsMask indicating the presence of mSpeedAccuracy. */ private static final int HAS_SPEED_ACCURACY_MASK = 64; /** * Bit mask for mFieldsMask indicating the presence of mBearingAccuracy. */ private static final int HAS_BEARING_ACCURACY_MASK = 128; // Cached data to make bearing/distance computations more efficient for the case // where distanceTo and bearingTo are called in sequence. Assume this typically happens Loading @@ -118,7 +130,11 @@ public class Location implements Parcelable { private double mAltitude = 0.0f; private float mSpeed = 0.0f; private float mBearing = 0.0f; private float mAccuracy = 0.0f; private float mHorizontalAccuracyMeters = 0.0f; private float mVerticalAccuracyMeters = 0.0f; private float mSpeedAccuracyMetersPerSecond = 0.0f; private float mBearingAccuracyDegrees = 0.0f; private Bundle mExtras = null; // A bitmask of fields present in this object (see HAS_* constants defined above). Loading Loading @@ -156,7 +172,10 @@ public class Location implements Parcelable { mAltitude = l.mAltitude; mSpeed = l.mSpeed; mBearing = l.mBearing; mAccuracy = l.mAccuracy; mHorizontalAccuracyMeters = l.mHorizontalAccuracyMeters; mVerticalAccuracyMeters = l.mVerticalAccuracyMeters; mSpeedAccuracyMetersPerSecond = l.mSpeedAccuracyMetersPerSecond; mBearingAccuracyDegrees = l.mBearingAccuracyDegrees; mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras); } Loading @@ -173,7 +192,10 @@ public class Location implements Parcelable { mAltitude = 0; mSpeed = 0; mBearing = 0; mAccuracy = 0; mHorizontalAccuracyMeters = 0; mVerticalAccuracyMeters = 0; mSpeedAccuracyMetersPerSecond = 0; mBearingAccuracyDegrees = 0; mExtras = null; } Loading Loading @@ -718,19 +740,18 @@ public class Location implements Parcelable { } /** * True if this location has an accuracy. * True if this location has a horizontal accuracy. * * <p>All locations generated by the {@link LocationManager} have an * accuracy. * <p>All locations generated by the {@link LocationManager} have an horizontal accuracy. */ public boolean hasAccuracy() { return (mFieldsMask & HAS_ACCURACY_MASK) != 0; return (mFieldsMask & HAS_HORIZONTAL_ACCURACY_MASK) != 0; } /** * Get the estimated accuracy of this location, in meters. * Get the estimated horizontal accuracy of this location, radial, in meters. * * <p>We define accuracy as the radius of 68% confidence. In other * <p>We define horizontal accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's * latitude and longitude, and with a radius equal to the accuracy, * then there is a 68% probability that the true location is inside Loading @@ -745,35 +766,183 @@ public class Location implements Parcelable { * accuracy, and does not indicate the accuracy of bearing, * velocity or altitude if those are included in this Location. * * <p>If this location does not have an accuracy, then 0.0 is returned. * All locations generated by the {@link LocationManager} include * an accuracy. * <p>If this location does not have a horizontal accuracy, then 0.0 is returned. * All locations generated by the {@link LocationManager} include horizontal accuracy. */ public float getAccuracy() { return mAccuracy; return mHorizontalAccuracyMeters; } /** * Set the estimated accuracy of this location, meters. * Set the estimated horizontal accuracy of this location, meters. * * <p>See {@link #getAccuracy} for the definition of accuracy. * <p>See {@link #getAccuracy} for the definition of horizontal accuracy. * * <p>Following this call {@link #hasAccuracy} will return true. */ public void setAccuracy(float accuracy) { mAccuracy = accuracy; mFieldsMask |= HAS_ACCURACY_MASK; public void setAccuracy(float horizontalAccuracy) { mHorizontalAccuracyMeters = horizontalAccuracy; mFieldsMask |= HAS_HORIZONTAL_ACCURACY_MASK; } /** * Remove the accuracy from this location. * Remove the horizontal accuracy from this location. * * <p>Following this call {@link #hasAccuracy} will return false, and * {@link #getAccuracy} will return 0.0. */ public void removeAccuracy() { mAccuracy = 0.0f; mFieldsMask &= ~HAS_ACCURACY_MASK; mHorizontalAccuracyMeters = 0.0f; mFieldsMask &= ~HAS_HORIZONTAL_ACCURACY_MASK; } /** * True if this location has a vertical accuracy. * @hide */ public boolean hasVerticalAccuracy() { return (mFieldsMask & HAS_VERTICAL_ACCURACY_MASK) != 0; } /** * Get the estimated vertical accuracy of this location, in meters. * * <p>We define vertical accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's altitude, and with a radius * equal to the vertical accuracy, then there is a 68% probability that the true altitude is * inside the circle. * * <p>In statistical terms, it is assumed that location errors * are random with a normal distribution, so the 68% confidence circle * represents one standard deviation. Note that in practice, location * errors do not always follow such a simple distribution. * * <p>If this location does not have a vertical accuracy, then 0.0 is returned. * @hide */ public float getVerticalAccuracyMeters() { return mVerticalAccuracyMeters; } /** * Set the estimated vertical accuracy of this location, meters. * * <p>See {@link #getVerticalAccuracyMeters} for the definition of vertical accuracy. * * <p>Following this call {@link #hasVerticalAccuracy} will return true. * @hide */ public void setVerticalAccuracyMeters(float verticalAccuracyMeters) { mVerticalAccuracyMeters = verticalAccuracyMeters; mFieldsMask |= HAS_VERTICAL_ACCURACY_MASK; } /** * Remove the vertical accuracy from this location. * * <p>Following this call {@link #hasVerticalAccuracy} will return false, and * {@link #getVerticalAccuracyMeters} will return 0.0. * @hide */ public void removeVerticalAccuracy() { mVerticalAccuracyMeters = 0.0f; mFieldsMask &= ~HAS_VERTICAL_ACCURACY_MASK; } /** * True if this location has a speed accuracy. * @hide */ public boolean hasSpeedAccuracy() { return (mFieldsMask & HAS_SPEED_ACCURACY_MASK) != 0; } /** * Get the estimated speed accuracy of this location, in meters per second. * * <p>We define speed accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's speed, and with a radius * equal to the speed accuracy, then there is a 68% probability that the true speed is * inside the circle. * * <p>If this location does not have a speed accuracy, then 0.0 is returned. * @hide */ public float getSpeedAccuracyMetersPerSecond() { return mSpeedAccuracyMetersPerSecond; } /** * Set the estimated speed accuracy of this location, meters per second. * * <p>See {@link #getSpeedAccuracyMetersPerSecond} for the definition of speed accuracy. * * <p>Following this call {@link #hasSpeedAccuracy} will return true. * @hide */ public void setSpeedAccuracyMetersPerSecond(float speedAccuracyMeterPerSecond) { mSpeedAccuracyMetersPerSecond = speedAccuracyMeterPerSecond; mFieldsMask |= HAS_SPEED_ACCURACY_MASK; } /** * Remove the speed accuracy from this location. * * <p>Following this call {@link #hasSpeedAccuracy} will return false, and * {@link #getSpeedAccuracyMetersPerSecond} will return 0.0. * @hide */ public void removeSpeedAccuracy() { mSpeedAccuracyMetersPerSecond = 0.0f; mFieldsMask &= ~HAS_SPEED_ACCURACY_MASK; } /** * True if this location has a bearing accuracy. * @hide */ public boolean hasBearingAccuracy() { return (mFieldsMask & HAS_BEARING_ACCURACY_MASK) != 0; } /** * Get the estimated bearing accuracy of this location, in degrees. * * <p>We define bearing accuracy as the radius of 68% confidence. In other * words, if you draw a circle centered at this location's bearing, and with a radius * equal to the bearing accuracy, then there is a 68% probability that the true bearing is * inside the circle. * * <p>If this location does not have a bearing accuracy, then 0.0 is returned. * @hide */ public float getBearingAccuracyDegrees() { return mBearingAccuracyDegrees; } /** * Set the estimated bearing accuracy of this location, degrees. * * <p>See {@link #getBearingAccuracyDegrees} for the definition of bearing accuracy. * * <p>Following this call {@link #hasBearingAccuracy} will return true. * @hide */ public void setBearingAccuracyDegrees(float bearingAccuracyDegrees) { mBearingAccuracyDegrees = bearingAccuracyDegrees; mFieldsMask |= HAS_BEARING_ACCURACY_MASK; } /** * Remove the bearing accuracy from this location. * * <p>Following this call {@link #hasBearingAccuracy} will return false, and * {@link #getBearingAccuracyDegrees} will return 0.0. * @hide */ public void removeBearingAccuracy() { mBearingAccuracyDegrees = 0.0f; mFieldsMask &= ~HAS_BEARING_ACCURACY_MASK; } /** Loading Loading @@ -810,8 +979,8 @@ public class Location implements Parcelable { public void makeComplete() { if (mProvider == null) mProvider = "?"; if (!hasAccuracy()) { mFieldsMask |= HAS_ACCURACY_MASK; mAccuracy = 100.0f; mFieldsMask |= HAS_HORIZONTAL_ACCURACY_MASK; mHorizontalAccuracyMeters = 100.0f; } if (mTime == 0) mTime = System.currentTimeMillis(); if (mElapsedRealtimeNanos == 0) mElapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos(); Loading Loading @@ -849,8 +1018,8 @@ public class Location implements Parcelable { s.append("Location["); s.append(mProvider); s.append(String.format(" %.6f,%.6f", mLatitude, mLongitude)); if (hasAccuracy()) s.append(String.format(" acc=%.0f", mAccuracy)); else s.append(" acc=???"); if (hasAccuracy()) s.append(String.format(" hAcc=%.0f", mHorizontalAccuracyMeters)); else s.append(" hAcc=???"); if (mTime == 0) { s.append(" t=?!?"); } Loading @@ -863,6 +1032,12 @@ public class Location implements Parcelable { if (hasAltitude()) s.append(" alt=").append(mAltitude); if (hasSpeed()) s.append(" vel=").append(mSpeed); if (hasBearing()) s.append(" bear=").append(mBearing); if (hasVerticalAccuracy()) s.append(String.format(" vAcc=%.0f", mVerticalAccuracyMeters)); else s.append(" vAcc=???"); if (hasSpeedAccuracy()) s.append(String.format(" sAcc=%.0f", mSpeedAccuracyMetersPerSecond)); else s.append(" sAcc=???"); if (hasBearingAccuracy()) s.append(String.format(" bAcc=%.0f", mBearingAccuracyDegrees)); else s.append(" bAcc=???"); if (isFromMockProvider()) s.append(" mock"); if (mExtras != null) { Loading Loading @@ -890,7 +1065,10 @@ public class Location implements Parcelable { l.mAltitude = in.readDouble(); l.mSpeed = in.readFloat(); l.mBearing = in.readFloat(); l.mAccuracy = in.readFloat(); l.mHorizontalAccuracyMeters = in.readFloat(); l.mVerticalAccuracyMeters = in.readFloat(); l.mSpeedAccuracyMetersPerSecond = in.readFloat(); l.mBearingAccuracyDegrees = in.readFloat(); l.mExtras = Bundle.setDefusable(in.readBundle(), true); return l; } Loading @@ -917,7 +1095,10 @@ public class Location implements Parcelable { parcel.writeDouble(mAltitude); parcel.writeFloat(mSpeed); parcel.writeFloat(mBearing); parcel.writeFloat(mAccuracy); parcel.writeFloat(mHorizontalAccuracyMeters); parcel.writeFloat(mVerticalAccuracyMeters); parcel.writeFloat(mSpeedAccuracyMetersPerSecond); parcel.writeFloat(mBearingAccuracyDegrees); parcel.writeBundle(mExtras); } Loading
location/java/android/location/LocationManager.java +3 −2 File changed.Preview size limit exceeded, changes collapsed. Show changes