Android GPS 芯片长时间处于活动状态后,设备需要 restart/reboot 才能获取 GPS 位置
Android device needs restart/reboot to get GPS locations after having GPS chip active a long time
我正在为 Android 开发另一个 GPS 跟踪应用程序,我正在使用 Android 4.3 在 Sony Xperia SP c5302 中测试我的代码。
我做了一个后台服务,它使用 Google Play 服务的 GoogleApiClient 来获取融合位置。我能够很好地找到位置,但几个小时后我意识到我的 GPS 芯片停止返回位置,因为它们的准确度从 10 提高到 30 或 50(这意味着除 GPS 之外的其他供应商正在返回新位置)。
考虑到我在室内,我认为 API 决定只听取网络提供商的意见,然后我走到街上(关闭 wifi 和数据连接)并完全停止获取融合位置(我不再像预期的那样获得网络修复,并且 GPS 芯片已经如所述那样死了)。甚至 Google 地图也无法追踪到我。然后我决定在那一刻重新启动我的 phone,我的应用程序和 Google 地图上的 GPS 芯片更新再次正常(wifi 和数据连接仍然关闭)。
我尝试了与原始 Location API 相同的方法,它使用 LocationManager 得到了相同的结果....我必须重新启动 phone 才能让 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);
}
};
}
我知道这种方法会更快地耗尽电池电量,但此应用程序是针对特定客户端而不是针对一般客户端的 public,所以没关系。
¿这种行为应该发生还是我的 phone 有问题或我的代码有问题?我觉得特别奇怪,甚至 Google 地图也无法获取位置,所以我想知道我的应用程序是否与 phone 本身混淆了。
编辑。
我必须重新启动 phone,因为从 Android 设置菜单关闭和打开 GPS 没有任何区别。 (我的服务日志显示,如果我停止并重新启动 GPS,则 GPS 启动没有错误)
经过长时间的测试,我可以看出 "problem" 是设备相关的。我的应用程序在朋友的 Nexus 4 上运行了很长时间。
我还通过更改更新间隔使其在我的 Xperia SP 中运行
miLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(5000)
也许我可以将它设置为更高的间隔。我只是确定 30 秒太多了。
我最好的猜测是设置一些共享首选项,以防 GPS 芯片停止提供位置时设置此间隔。
我正在为 Android 开发另一个 GPS 跟踪应用程序,我正在使用 Android 4.3 在 Sony Xperia SP c5302 中测试我的代码。
我做了一个后台服务,它使用 Google Play 服务的 GoogleApiClient 来获取融合位置。我能够很好地找到位置,但几个小时后我意识到我的 GPS 芯片停止返回位置,因为它们的准确度从 10 提高到 30 或 50(这意味着除 GPS 之外的其他供应商正在返回新位置)。
考虑到我在室内,我认为 API 决定只听取网络提供商的意见,然后我走到街上(关闭 wifi 和数据连接)并完全停止获取融合位置(我不再像预期的那样获得网络修复,并且 GPS 芯片已经如所述那样死了)。甚至 Google 地图也无法追踪到我。然后我决定在那一刻重新启动我的 phone,我的应用程序和 Google 地图上的 GPS 芯片更新再次正常(wifi 和数据连接仍然关闭)。
我尝试了与原始 Location API 相同的方法,它使用 LocationManager 得到了相同的结果....我必须重新启动 phone 才能让 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);
}
};
}
我知道这种方法会更快地耗尽电池电量,但此应用程序是针对特定客户端而不是针对一般客户端的 public,所以没关系。
¿这种行为应该发生还是我的 phone 有问题或我的代码有问题?我觉得特别奇怪,甚至 Google 地图也无法获取位置,所以我想知道我的应用程序是否与 phone 本身混淆了。
编辑。
我必须重新启动 phone,因为从 Android 设置菜单关闭和打开 GPS 没有任何区别。 (我的服务日志显示,如果我停止并重新启动 GPS,则 GPS 启动没有错误)
经过长时间的测试,我可以看出 "problem" 是设备相关的。我的应用程序在朋友的 Nexus 4 上运行了很长时间。
我还通过更改更新间隔使其在我的 Xperia SP 中运行
miLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(5000)
也许我可以将它设置为更高的间隔。我只是确定 30 秒太多了。
我最好的猜测是设置一些共享首选项,以防 GPS 芯片停止提供位置时设置此间隔。