我正在为Android开发另一个全球定位系统跟踪应用程序,我正在用Sony c5302和Android4.3测试我的代码。
我制作了一个后台服务,它使用Google的GoogleApiClient来获取融合的位置。我能够很好地获得位置,但几个小时后,我意识到我的GPS芯片停止返回位置,因为它们的精度从10提高到30或50 (这意味着GPS以外的其他供应商正在返回新的位置)。
考虑到我是在室内,我认为API决定只听网络提供商的话,然后我走到街上(无线网络和数据连接关闭),完全停止了融合的位置(我不再像预期的那样得到网络修复,GPS芯片已经死了)。就连谷歌地图都找不到我。然后,我决定在那一刻重新启动我的手机,我的应用程序和Google (wifi和数据连接仍然关闭)再次获得了GPS芯片更新。
我尝试了相同的方法,与原来的位置API,它使用的LocationManager具有相同的结果.为了让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,就不会出错)
发布于 2015-02-24 00:41:59
经过长时间的测试,我可以看出“问题”是设备依赖的。我的应用程序在一个朋友的Nexus 4上运行得很好。
我还通过更改更新间隔使它在我的Xperia中工作。
miLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(5000)也许我可以把它调到更高的时间间隔。我只是确定30秒太多了。
我对覆盖客户设备的最佳猜测是设置一些共享偏好,以便在GPS芯片停止提供位置的情况下设置此间隔。
https://stackoverflow.com/questions/28419283
复制相似问题