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