我正在开发Android的另一个GPS跟踪应用程序,我正在使用Android 4.3测试我的代码在Sony Xperia SP c5302中。Android设备需要重新启动/重新启动GPS芯片长时间后才能获取GPS位置
我做了一个后台服务,使用Google Play服务的GoogleApiClient获取融合位置。我能够很好的获得地点,但几个小时后,我意识到我的GPS芯片停止返回地点,因为他们的准确度从10提高到30或50(这意味着除GPS以外的其他提供商正在返回新地点)。
考虑到我在室内,我认为API决定只听网络提供商,然后我去街上(无线和数据连接关闭),并停止获取熔合位置(我没有得到网络如预期的那样修复了并且GPS芯片已经如所述那样死了)。即使Google地图也无法追踪我。然后我决定在那个时候重新启动我的手机,并且我的应用程序和Google地图都再次获得了GPS芯片更新(无线和数据连接仍然关闭)。
我尝试了与使用LocationManager的原始位置API使用相同的结果相同的方法....我必须重新启动手机才能使GPS芯片再次工作。
这是我的基本代码与GoogleApiClient:
public class MyService extends Service {
private final static String TAG = MyService.class.getSimpleName();
//GPS
private GoogleApiClient miGoogleApiClient = null;
private LocationRequest miLocationRequest = null;
private LocationRequest currLocation = null;
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate MY SERVICE");
startGPS();
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d(TAG, "onDestroy");
stopGPS();
}
public boolean startGPS(){
Log.d(TAG, "startGPS");
try{
miGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(miConnectionCallbacks)
.addOnConnectionFailedListener(miOnConnectionFailedListener)
.build();
miGoogleApiClient.connect();
return true;
}catch(Exception e){
Log.d(TAG, "can't start GPS:"+e);
return false;
}finally{return false;}
}
public void stopGPS(){
Log.d(TAG, "stopGPS");
miGoogleApiClient.disconnect();
}
private LocationListener miLocationListener = new LocationListener(){
@Override public void onLocationChanged(Location location){
Log.d(TAG, "onLocationChanged:"+new Date(location.getTime())+", "+ location);
//...more work
currLocation = location;
}
};
private GoogleApiClient.ConnectionCallbacks miConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks(){
@Override public void onConnected(Bundle bundle){
Log.d(TAG, "onConnected:"+bundle);
currLocation = LocationServices.FusedLocationApi.getLastLocation(miGoogleApiClient); //may be old
miLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
//.setSmallestDisplacement(10) //Won't use this for now
.setInterval(30000)
.setFastestInterval(30000);
LocationServices.FusedLocationApi.requestLocationUpdates(
miGoogleApiClient, miLocationRequest, miLocationListener);
}
@Override public void onConnectionSuspended(int i){
Log.d(TAG, "onConnectionSuspended:"+i);
}
};
private GoogleApiClient.OnConnectionFailedListener miOnConnectionFailedListener = new GoogleApiClient.OnConnectionFailedListener(){
@Override public void onConnectionFailed(ConnectionResult connectionResult){
Log.d(TAG, "onConnectionFailed:"+connectionResult);
}
};
}
我知道这种做法水渠电池快,但这个应用程序是为特定的客户端,而不是为普通大众所以没关系。
¿是否应该发生这种行为,或者手机有问题或者我的代码有问题?我发现特别奇怪的是,即使谷歌地图无法获取位置,所以我想知道我的应用程序是否搞乱了手机本身。
编辑。
我必须重新启动手机,因为在Android设置菜单中关闭和打开GPS没有任何区别。 (我的服务日志显示,如果我停止并重新启动GPS,则无错误地启动GPS)
虽然它应该做同样的事情,你可以尝试使用https://github.com/mcharmas/Android-ReactiveLocation在任何情况下,它可以节省很多行代码 – cYrixmorten 2015-02-09 21:44:31
@cYrixmorten谢谢。这是一个有趣的图书馆。如您所说,它使用相同的代码来处理GoogleApiClient,但样板代码可能是一个因素。我想知道在服务上下文中使用GoogleApi的注意事项。我会尝试用你的建议做一个测试项目。 – user2997817 2015-02-10 23:06:04
除了记得在我知道的'onDestroy()'中取消订阅外。我自己在服务中使用它。只需将另一个库添加到混合中,然后使用EventBus https://github.com/greenrobot/EventBus在新位置可用于更新UI时进行广播。这种工作方式与常规广播几乎相同,但不限于可序列化的数据,但适用于任何复杂的对象,并且比设置广播接收器等代码少。 – cYrixmorten 2015-02-11 08:47:35