20

这是一个已经被问过很多次的问题,但我找不到始终有效的解决方案。

我正在使用 Fused 位置提供程序开发应用程序。在该onConnected()方法中,我请求位置更新,一旦生成并onLocationChanged()调用位置修复,应用程序逻辑就会启动。(请参考我下面的代码)。

在某些设备上永远不会调用问题 onLocationChanged()方法。我使用三星 Tab 2 和三星 Galaxy Grand 进行测试。此代码在 Tab 2 上运行良好,但不适用于 Grand。不起作用,我的意思是locationClient连接但从onLocationChanged()未被调用。

早些时候,我使用位置管理器来获取位置,在那个实现中,发生了同样的问题。所以,我尝试实现融合的位置提供程序,但我仍然遇到同样的问题。

谁能帮我解决这个问题?我在这里缺少什么吗?

public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener {

LocationClient locationclient;
LocationRequest lr;
Location loc1;
static String address;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     

    locationclient = new LocationClient(this,this,this);
    locationclient.connect();        

}

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

    lr=LocationRequest.create();
    lr.setInterval(100);
    locationclient.requestLocationUpdates(lr, this);
    Log.d("LocationClient","On Connected");
}

@Override
public void onDisconnected() {
    // TODO Auto-generated method stub
    locationclient.disconnect();

}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onLocationChanged(Location loc) {
    // TODO Auto-generated method stub      

    // Application Logic        

    Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude());
}
}
4

7 回答 7

6

我在 Galaxy Nexus 上观察到了同样的行为,并发现了两件导致onLocationChanged()不被调用的事情。有

  1. 系统设置中未启用相应的位置源。对于GPS 卫星必须启用,对于PRIORITY_HIGH_ACCURACYWi -Fi 和移动网络位置必须启用。PRIORITY_BALANCED_POWER_ACCURACY

  2. 即使对于启用的位置源,也可能没有可用的有效位置信息。例如,PRIORITY_HIGH_ACCURACY源已启用,但没有(或不好)GPS 接收(例如设备在建筑物内)。或PRIORITY_BALANCED_POWER_ACCURACY源已启用,但 Wi-Fi 和移动数据均已关闭。在这些情况下,位置无法被检测到并且onLocationChanged()不会被调用。

要修复 #1,我必须在连接到 Google 服务 API 之前检查是否启用了所需的位置源,如果它们被关闭,然后我通知用户要求他/她允许位置访问。

为了解决#2,我决定使用LocationRequest.setExpirationDuration(). 我将超时设置为大约 10 秒,并在调用后立即requestLocationUpdates()发布一个延迟相同 10 秒的回调。如果之前调用了延迟回调requestLocationUpdates(),这意味着由于原因 #2 而无法检测到位置。我重试了三次,然后向用户显示错误消息。

Android 文档在这个地方不是很好,这就是为什么我希望这会有所帮助。

于 2015-01-07T21:27:09.517 回答
4
lr.setInterval(100); 

有了它,您的间隔为 0.1 秒,因此 gps 芯片组很难检测到位置。你的间隔应该是> 1秒。(我是> 10)

locationRequest 它应该被设置:

setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 因为PRIORITY_BALANCED_POWER_ACCURACY在户外它没有得到位置。代码将如下所示:

lr=LocationRequest.create();

lr.setInterval(5 * 1000);// 5s

lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationclient.requestLocationUpdates(lr, this);

希望这有帮助。

于 2015-01-08T07:17:39.070 回答
0

尝试删除并重新安装“ google play services”。从谷歌市场链接下面安装它,谷 歌播放服务

于 2014-03-27T09:29:38.260 回答
0

我通过将两个参数、最小距离和更新之间的最小时间都设置为 0 来解决这个问题。根据我在 2 个设备上测试的内容,现在在请求更新后会定期调用 onLocationChanged()。

于 2013-08-14T09:36:01.867 回答
0

这可能是胡说八道,但我之前遇到过这个问题,有人建议你应该创建自己的LocationListener而不是让你的MainActivity工具LocationListener。基本上是这样的:

locationclient.requestLocationUpdates(lr, your_location_listener);

希望这可以帮助。

于 2013-08-08T03:32:36.610 回答
0

通过测试 if (loc == null) 查看您是否获得了通过的位置。即使它是同一个提供者,也可能有一个设备返回 null 并爆炸,导致看起来它没有触发。

于 2013-08-07T17:17:59.000 回答
-1

在这里检查此代码...

public class MyActivity extends Activity implements LocationListener {
double destLat, destLong;

LocationManager locationManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    destLat = location.getLatitude();
    destLong = location.getLongitude();
}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
于 2014-12-06T11:11:22.660 回答