在某些设备上没有调用onLocationChanged

时间:2013-08-07 17:08:56

标签: android location-client

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

我正在使用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());
}
}

7 个答案:

答案 0 :(得分:5)

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

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

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

  3. 要修复#1,我必须检查在连接到Google Services API之前是否已启用所需的位置来源,如果已关闭,则我通知用户要求他/她允许位置访问。

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

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

答案 1 :(得分:3)

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);

希望得到这个帮助。

答案 2 :(得分:0)

通过测试if(loc == null)来查看是否获得了传递位置。即使它是同一个提供商,也许有一个设备会返回null并轰炸,导致看起来它没有被触发。

答案 3 :(得分:0)

这可能没有意义,但我之前遇到过这个问题,有人建议您创建自己的LocationListener,而不是让MainActivity实施LocationListener。基本上这个:

locationclient.requestLocationUpdates(lr, your_location_listener);

希望这有帮助。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:-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

}