Android设备需要重启/重启才能在GPS芯片长时间处于活动状态后获取GPS位置

时间:2015-02-09 21:02:10

标签: android gps google-api-client

我正在为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启动时没有错误,如果我停止并再次启动它)

1 个答案:

答案 0 :(得分:0)

经过长时间的测试,我可以说“问题”取决于设备。很长一段时间,我的应用程序在朋友的Nexus 4上运行良好。

我还通过更改更新间隔

使其在我的Xperia SP中正常工作
miLocationRequest = LocationRequest.create()
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
        .setInterval(5000)

可能我可以将它设置为更高的间隔。我确定30秒太多了。

我最好的猜测是覆盖我客户的设备是设置一些共享首选项,以便在GPS芯片停止提供位置的情况下设置此间隔。