Android 在某些设备上未调用onLocationChanged

Android 在某些设备上未调用onLocationChanged,android,location-client,Android,Location Client,这是一个被问了无数次的问题,但我找不到一个总是有效的解决办法 我正在使用Fused location provider开发一个应用程序。 在onConnected()。(请参考下面我的代码) 问题onLocationChanged()方法从未在某些设备上调用。我使用三星Tab 2和三星Galaxy Grand进行测试。这段代码在tab2上运行得非常好,但在Grand上不起作用。所谓不工作,我的意思是locationClient已连接,但从未调用onLocationChanged() 早些时候,我

这是一个被问了无数次的问题,但我找不到一个总是有效的解决办法

我正在使用Fused location provider开发一个应用程序。 在
onConnected()。(请参考下面我的代码)

问题
onLocationChanged()
方法从未在某些设备上调用。我使用三星Tab 2和三星Galaxy Grand进行测试。这段代码在tab2上运行得非常好,但在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());
}
}

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

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

locationclient.requestLocationUpdates(lr, your_location_listener);

希望这有帮助。

我通过将两个参数、最小距离和最短更新时间设置为0来解决这个问题。
lr.setInterval(100); 

根据我在2台设备上测试的结果,现在请求更新后会定期调用onLocationChanged()。

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

在这里查看此代码

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

}

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

  • 系统设置中未启用相应的位置源。对于
    PRIORITY\u HIGH\u精度
    必须启用GPS卫星,对于
    PRIORITY\u BALANCED\u POWER\u精度
    必须启用Wi-Fi和移动网络定位

  • 即使对于启用的位置源,也可能没有可用的有效位置信息。例如,
    优先级\u高精度
    源已启用,但没有(或不好)GPS接收(例如,设备位于建筑物内)。或启用了
    PRIORITY\u BALANCED\u POWER\u accurity
    源,但Wi-Fi和移动数据均已关闭。在这些情况下,无法检测位置,并且不会调用
    onLocationChanged()

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

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

    Android文档在这里不是很好,这就是为什么我希望这能有所帮助

    lr.setInterval(100); 
    
    使用它,您的时间间隔为0.1秒,因此gps芯片组很难检测到位置。您的间隔时间应大于1秒。(我的间隔时间大于10秒)

    位置请求应设置为:

    setPriority(LocationRequest.PRIORITY\u高精度)
    由于
    优先级\u平衡\u功率\u精度
    在室外,它无法获得位置。代码如下所示:

    lr=LocationRequest.create();
    
    lr.setInterval(5 * 1000);// 5s
    
    lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationclient.requestLocationUpdates(lr, this);
    

    希望获得此帮助。

    检查没有帮助。如果不会调用OnConnection(),则应激发onConnectionFailed()。您查看了ConnectionResult?正在调用OnConnectiond()并建立连接。我已经在两台设备上检查过了。在onConnected()中,我请求位置更新,这不会导致调用onLocationChanged。您找到修复或解决方法了吗?我也面临着同样的问题不,我没有……我尝试了在互联网上能找到的一切,但没有帮助。但我确信,这是有办法解决的;谷歌地图或任何其他谷歌应用程序的使用方式……在这个问题上有一些新的进展@Rohit?不,这也没有帮助。我也开始在这个方法上遇到问题。在某些设备上,我无法获得位置修复。此示例未使用融合的位置API。请您对您的#2解决方案进行详细说明,好吗?我不太明白,我很同意。尝试用
    优先级高精度
    替换
    优先级平衡功率高精度
    ,作为解决FusedLocationProviderClient/LocationCallback异常行为的第一步。在我的案例中,在将
    优先级平衡功率高精度
    更改为
    优先级高精度
    后,我能够知道GPS是否正确已打开,但无法调用
    onLocationChanged