我正在为Android开发另一款GPS跟踪应用程序,我正在使用Android 4.3在索尼Xperia SP c5302上测试我的代码。
我提供了一项后台服务,该服务使用Google Play服务的GoogleApiClient来获取融合位置。我能够很好地获得位置,但几个小时后我意识到我的GPS芯片停止返回位置,因为它们的准确度从10增加到30或50(这意味着其他提供商而不是GPS返回新位置)。
考虑到我在室内我认为API决定只听网络提供商,然后我去了街道(关闭了wifi和数据连接)并且停止了融合位置(我没有得到网络修复)如预期的那样,GPS芯片已经死了。甚至谷歌地图都无法跟踪我。然后我决定在那一刻重新启动手机,我的应用程序和Google地图上的GPS芯片更新都很好(wifi和数据连接仍然关闭)。
我尝试使用与LocationManager相同结果的原始Location 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启动时没有错误,如果我停止并再次启动它)
答案 0 :(得分:0)
经过长时间的测试,我可以说“问题”取决于设备。很长一段时间,我的应用程序在朋友的Nexus 4上运行良好。
我还通过更改更新间隔
使其在我的Xperia SP中正常工作miLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(5000)
可能我可以将它设置为更高的间隔。我确定30秒太多了。
我最好的猜测是覆盖我客户的设备是设置一些共享首选项,以便在GPS芯片停止提供位置的情况下设置此间隔。