首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android设备需要重新启动/重新启动才能在长时间激活GPS芯片后获得GPS位置。

Android设备需要重新启动/重新启动才能在长时间激活GPS芯片后获得GPS位置。
EN

Stack Overflow用户
提问于 2015-02-09 21:02:09
回答 1查看 1.7K关注 0票数 0

我正在为Android开发另一个全球定位系统跟踪应用程序,我正在用Sony c5302和Android4.3测试我的代码。

我制作了一个后台服务,它使用Google的GoogleApiClient来获取融合的位置。我能够很好地获得位置,但几个小时后,我意识到我的GPS芯片停止返回位置,因为它们的精度从10提高到30或50 (这意味着GPS以外的其他供应商正在返回新的位置)。

考虑到我是在室内,我认为API决定只听网络提供商的话,然后我走到街上(无线网络和数据连接关闭),完全停止了融合的位置(我不再像预期的那样得到网络修复,GPS芯片已经死了)。就连谷歌地图都找不到我。然后,我决定在那一刻重新启动我的手机,我的应用程序和Google (wifi和数据连接仍然关闭)再次获得了GPS芯片更新。

我尝试了相同的方法,与原来的位置API,它使用的LocationManager具有相同的结果.为了让GPS芯片再次工作,我必须重新启动我的手机。

下面是我使用GoogleApiClient的基本代码:

代码语言:javascript
复制
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,就不会出错)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 00:41:59

经过长时间的测试,我可以看出“问题”是设备依赖的。我的应用程序在一个朋友的Nexus 4上运行得很好。

我还通过更改更新间隔使它在我的Xperia中工作。

代码语言:javascript
复制
miLocationRequest = LocationRequest.create()
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
        .setInterval(5000)

也许我可以把它调到更高的时间间隔。我只是确定30秒太多了。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28419283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档