我之前问过一个关于 Commonware 的位置轮询器的问题,并且之前让它工作过。它仍然工作,但有一个问题。
昨天,(经过一些实验和代码研究,哈哈)我意识到为了使用这两个选项(首选 GPS,但如果不可用,请使用网络)获取位置,我必须将额外的作为“BOTH”传递。
然而,在这样做之后,LocationPollerService 不会强制 GPS 定位我。让我在下面描述这个问题。
假设我打开了 GPS,另一个应用程序正在积极使用 GPS 并保持锁定。现在,如果我使用 LocationPollerService,它将返回来自 GPS 的值。但是,当我的 GPS 打开但未锁定时,LocationPollerService 不会尝试锁定,而只是移动到基于网络的位置,这在我启用 GPS 时不需要。
我会在这里添加代码,但我相信这是cwac-locpoll 特有的问题,并且代码已经在线。
这是链接:
我的问题?当 GPS 开启时,如何强制服务尝试定位?
更新
这是我认为它寻找 GPS 位置但实际上并没有尝试的地方。如果你能帮忙,那就太好了。
@Override protected void onPreExecute()
{
// Added in enabled check to even check if there is a provider
// enabled.
if (provider.equalsIgnoreCase("BOTH"))
{
if (!locMgr.isProviderEnabled(LocationManager.GPS_PROVIDER) && !locMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
{
Log.i(TAG, "Both providers are disabled");
// There is no provider so fail with the LKL if possible
Intent toBroadcast = new Intent(intentTemplate);
toBroadcast.putExtra(LocationPoller.EXTRA_ERROR, "Location Provider disabled!");
toBroadcast.putExtra(LocationPoller.EXTRA_ERROR_PROVIDER_DISABLED, true);
Location lastLoc = locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (lastLoc == null)
lastLoc = locMgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
toBroadcast.putExtra(LocationPoller.EXTRA_LASTKNOWN, lastLoc);
sendBroadcast(toBroadcast);
quit();
return;
}
}
else if (!locMgr.isProviderEnabled(provider))
{
Log.i(TAG, provider + " is disabled");
// There is no provider so fail with the LKL if possible
Intent toBroadcast = new Intent(intentTemplate);
toBroadcast.putExtra(LocationPoller.EXTRA_ERROR, "Location Provider disabled!");
toBroadcast.putExtra(LocationPoller.EXTRA_ERROR_PROVIDER_DISABLED, true);
toBroadcast.putExtra(LocationPoller.EXTRA_LASTKNOWN, locMgr.getLastKnownLocation(provider));
sendBroadcast(toBroadcast);
quit();
return;
}
onTimeout = new Runnable()
{
public void run()
{
Intent toBroadcast = new Intent(intentTemplate);
toBroadcast.putExtra(LocationPoller.EXTRA_ERROR, "Timeout!");
toBroadcast.putExtra(LocationPoller.EXTRA_ERROR_PROVIDER_DISABLED, false);
Location lastLoc = null;
if (provider.equalsIgnoreCase("BOTH"))
{
Log.i(TAG, "Both provider timed out");
lastLoc = locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (lastLoc == null)
lastLoc = locMgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
else
{
Log.i(TAG, provider + " timed out");
lastLoc = locMgr.getLastKnownLocation(provider);
}
toBroadcast.putExtra(LocationPoller.EXTRA_LASTKNOWN, lastLoc);
sendBroadcast(toBroadcast);
quit();
}
};
handler.postDelayed(onTimeout, TIMEOUT);
try
{
Log.e(TAG, "Provider: " + provider);
if (provider.equalsIgnoreCase("BOTH"))
{
Log.i(TAG, "Adding both providers");
locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
locMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
}
else
{
locMgr.requestLocationUpdates(provider, 0, 0, listener);
}
}
catch (IllegalArgumentException e)
{
// see http://code.google.com/p/android/issues/detail?id=21237
Log.w(TAG, "Exception requesting updates -- may be emulator issue", e);
quit();
}
}