这个问题已被多次询问,但我找不到始终有效的解决方案。
我正在使用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());
}
}
答案 0 :(得分:5)
我在Galaxy Nexus上观察到相同的行为并且发现了导致onLocationChanged()
未被调用的两件事。有
系统设置中未启用相应的位置源。对于PRIORITY_HIGH_ACCURACY
,必须启用 GPS卫星,PRIORITY_BALANCED_POWER_ACCURACY
Wi-Fi&必须启用移动网络位置。
即使对于启用的位置来源,也可能没有有效的位置信息。例如,PRIORITY_HIGH_ACCURACY
源已启用,但没有(或不好)GPS接收(例如设备在建筑物内)。或PRIORITY_BALANCED_POWER_ACCURACY
来源已启用,但Wi-Fi和移动数据均已关闭。在这些情况下,无法检测到位置,并且不会调用onLocationChanged()
。
要修复#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
}