我编写了一个位置SDK,该SDK生成了android.location.Location
实例。当用户调用Location.toString()
方法以获取可读文本时。
在Location.toString
方法中,我发现如下代码
@Override
public String toString() {
StringBuilder s = new StringBuilder();
s.append("Location[");
s.append(mProvider);
s.append(String.format(" %.6f,%.6f", mLatitude, mLongitude));
if (hasAccuracy()) s.append(String.format(" hAcc=%.0f", mHorizontalAccuracyMeters));
else s.append(" hAcc=???");
if (mTime == 0) {
s.append(" t=?!?");
}
if (mElapsedRealtimeNanos == 0) {
s.append(" et=?!?");
} else {
s.append(" et=");
TimeUtils.formatDuration(mElapsedRealtimeNanos / 1000000L, s);
}
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) {
s.append(" {").append(mExtras).append('}');
}
s.append(']');
return s.toString();
}
我的子类实现是
@Override
public String toString() {
String superString = super.toString();
return "ErrorCode[" + mErrorCode + "]," +
"FromCached[" + mFromCache + "]," +
superString;
}
结果
ErrorCode[0],FromCached[false], Location[network "31******,114****** acc=559 et=+1d19h24m40s624ms]"
latitude
和longitude
会产生什么奇怪的结果?
我尝试了Double.NaN
,Double.POSITIVE_INFINITY
,Double.MIN_VALUE
,但无法获得这个奇怪的结果。
答案 0 :(得分:1)
更多猜测:您可能正在查看错误 toString()
实现。
可能是您的实际位置是该位置的子类。一个关注“隐私”,因此会屏蔽该位置字符串的一部分。
这是很常见的事情:您想确保敏感信息不会直接进入日志或跟踪文件。因此,您编写了一个很好的包装程序,可以很好地掩盖输出的重要部分,例如使用*字符。