【发布时间】:2013-10-21 16:04:56
【问题描述】:
我试图通过创建一个 Location 实例然后使用 LocationManager.SetTestProviderLocation(string providerName, Locatin location) 方法来模拟我的位置。
例如:
Location location = new Location(providerName)
{
Latitude = 51.20958,
Longitude = 2.92372,
Accuracy = 100.0f,
Time = DateTime.Now.Ticks,
Altitude = 1.0,
Speed = 0.0f,
Bearing = 0.0f,
Provider = providerName,
};
locationManager.SetTestProviderLocation(providerName, location);
这总是会导致异常:
“位置对象不完整,缺少时间戳或准确性? 位置[gps 51.209580,2.923720 acc=1 et=?!? alt=1.0 水平=0.0 熊=0.0]"
我找到了一些关于主题here的信息。
作者提到LocationManger检查一个isComplete(方法)
来确定Location是否完整。
我希望该类的单声道版本具有 IsComplete 属性
和 MakeComplete 方法,但它们不存在(或者至少我找不到它们)
public void makeComplete()
{
if (mProvider == null) mProvider = "?";
if (!mHasAccuracy) {
mHasAccuracy = true;
mAccuracy = 100.0f;
}
if (mTime == 0) mTime = System.currentTimeMillis();
if (mElapsedRealtimeNanos == 0) mElapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos();
}
我猜“et=?!?”异常中的值指的是 mElapsedRealtimeNanos 字段
并且由于我无法知道访问该字段的方法,因此我无法进行模拟工作。
我是否遗漏了什么,这是 Mono for Android 的缺失功能还是
有没有其他方法可以让它工作。
注意:我知道有一些方法可以使用 DDMS 设置虚假位置, 但我正在寻找一种自动化位置模拟的方法
更新
发布此问题后不久,我意识到我的目标不是 API 级别 16。
因此,适用于 Android 的 Mono 没有公开 ElapsedRealtimeNanos 属性。
切换到 API 级别 16 后,该属性变为可用。然而,它没有,
提供一个 MakeComplete 方法。 (也许这是一个错误/缺失的功能)。
所以我做了一个快速的解决方案来验证行为:
Location location = new Location(providerName)
{
Longitude = locations[position, 0],
Latitude = locations[position, 1],
Accuracy = 100.0f,
Time = DateTime.Now.Ticks,
Altitude = 1.0,
Speed = 0.0f,
Bearing = 0.0f,
Provider = providerName,
ElapsedRealtimeNanos = (long)(TimeSpan.FromTicks(DateTime.Now.Ticks)
.TotalMilliseconds * 1000000)
};
虽然这解决了 Jelly Bean 设备(4.1 或更高版本)的问题,但代码
会在旧设备上中断。这就是@Cheesebaron 建议的解决方案发挥作用的地方。
【问题讨论】:
标签: c# android xamarin.android android-location