我的应用程序在冰淇淋三明治中工作得非常好,但现在我在KitKat上尝试了它并遇到了一些问题。
该应用程序是我在旧手机中运行的服务器,它在请求时提供位置。在ICS中,当请求位置时,GPS图标开始闪烁,很快应用程序接收位置更新并将其向前发送。但是现在有了KitKat,当请求位置时,GPS图标不会开始闪烁。该应用程序提供60秒的时间来查找GPS位置,但通常在此期间甚至没有激活GPS。 GPS现在仍然突然激活(在60年代),并且该位置被提供给我的应用程序。
为什么即使我的应用请求位置也无法激活GPS? 如上所述,我的应用程序可以毫无问题地使用ICS。我确实在清单中设置了所需的权限。
公共变量:
public static LocationManager mlocManager = null;
public static LocationListener mlocListener_fast = null;
的onCreate:
mlocListener_fast = new MyLocationListener();
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
处理用户请求的命令(位置请求)
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener_fast);
我应该做些什么来立即获取GPS位置,而无需等待突然的位置更新/ GPS激活,可能是由Android或其他应用程序触发的?不幸的是,我没有其他任何可以试用的Android设备。
编辑:
似乎如果应用程序在启动时没有请求位置,那么每次请求时间时位置请求都会起作用。但是,如果在启动时请求(和接收)位置,则位置请求不再起作用。是什么导致的?我在启动时使用完全相同的行(相同的位置mgr和相同的位置监听器)以及稍后的请求。
即使启动时使用的位置监听器与稍后使用的位置监听器不同,位置请求也不再起作用。尝试甚至在再次请求位置之前再次初始化位置mngr并且它没有帮助。这是什么?
EDIT2:
似乎使用KitKat无法请求多个位置请求。我以前有几个位置监听器用于不同的目的。例如,一个用于每小时更新一次位置,另一个用于立即获取位置(用户请求更新)。现在看来,如果我正常运行1 / 60min位置监听器,那么KitKat位置管理器无法处理即时位置请求。有人遇到过这个问题吗?很高兴知道哪个Android版本有这个问题。
答案 0 :(得分:1)
此问题的解决方法是仅使用一个LocationManager和一个LocationListener。如果您的应用程序需要不同类型的同时位置请求(具有不同的参数),那么您需要实现“位置请求处理程序”,该处理程序决定应该将哪些参数用于位置请求,即哪些参数对位置具有最严格的要求。
这是一个简单的示例代码,解释了“位置请求处理程序”的概念:
class LR {
long lock_min_time; // defined in set_lock_lr before using
float lock_min_dist;
boolean lock_active = false;
long idle_min_time = 3600000; // 1 per hour
float idle_min_dist = 200;
boolean idle_active = true;
long fast_min_time = 0;
float fast_min_dist = 0;
boolean fast_active = false;
//constructor
public LR()
{}
public void set_lock_lr(long min_time, float min_dist, boolean active)
{
lock_active = active;
lock_min_dist = min_dist;
lock_min_time = min_time;
System.out.println("LR lock set: "+min_time+", "+min_dist+", "+active);
update_location_request();
}
public void set_idle_lr(boolean active)
{
idle_active = active;
System.out.println("LR idle set: "+active);
update_location_request();
}
public void set_fast_lr(boolean active)
{
fast_active = active;
System.out.println("LR fast set: "+active);
update_location_request();
}
private void update_location_request()
{
// Remove current location request
mlocManager_basic.removeUpdates(mlocListener_basic);
if(fast_active)
{
mlocManager_basic.requestLocationUpdates(LocationManager.GPS_PROVIDER, fast_min_time, fast_min_dist, mlocListener_basic);
System.out.println("LR: fast_active");
}
else if(lock_active)
{
mlocManager_basic.requestLocationUpdates(LocationManager.GPS_PROVIDER, lock_min_time, lock_min_dist, mlocListener_basic);
System.out.println("LR: lock_active");
}
else if(idle_active) // only idle updates
{
mlocManager_basic.requestLocationUpdates(LocationManager.GPS_PROVIDER, idle_min_time, idle_min_dist, mlocListener_basic);
System.out.println("LR: idle_active");
}
}
}