2015-02-09 170 views
0

我正在开发Android的另一个GPS跟踪应用程序,我正在使用Android 4.3测试我的代码在Sony Xperia SP c5302中。Android设备需要重新启动/重新启动GPS芯片长时间后才能获取GPS位置

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

考虑到我在室内,我认为API决定只听网络提供商,然后我去街上(无线和数据连接关闭),并停止获取熔合位置(我没有得到网络如预期的那样修复了并且GPS芯片已经如所述那样死了)。即使Google地图也无法追踪我。然后我决定在那个时候重新启动我的手机,并且我的应用程序和Google地图都再次获得了GPS芯片更新(无线和数据连接仍然关闭)。

我尝试了与使用LocationManager的原始位置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,则无错误地启动GPS)

+0

虽然它应该做同样的事情,你可以尝试使用https://github.com/mcharmas/Android-ReactiveLocation在任何情况下,它可以节省很多行代码 – cYrixmorten 2015-02-09 21:44:31

+0

@cYrixmorten谢谢。这是一个有趣的图书馆。如您所说,它使用相同的代码来处理GoogleApiClient,但样板代码可能是一个因素。我想知道在服务上下文中使用GoogleApi的注意事项。我会尝试用你的建议做一个测试项目。 – user2997817 2015-02-10 23:06:04

+0

除了记得在我知道的'onDestroy()'中取消订阅外。我自己在服务中使用它。只需将另一个库添加到混合中,然后使用EventBus https://github.com/greenrobot/EventBus在新位置可用于更新UI时进行广播。这种工作方式与常规广播几乎相同,但不限于可序列化的数据,但适用于任何复杂的对象,并且比设置广播接收器等代码少。 – cYrixmorten 2015-02-11 08:47:35

回答

0

经过很长时间的测试后,我可以告诉“问题”依赖于设备。很久以来,我的应用在朋友的Nexus 4上运行良好。

我也做了它在我的Xperia SP通过改变更新间隔

miLocationRequest = LocationRequest.create() 
     .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
     .setInterval(5000) 

也许我可以将其设置到一个更高的区间运行。我只是肯定30秒太多了。

我最好的猜测来覆盖我的客户的设备是设置一些共享偏好设置此间隔可以设置GPS芯片停止给位置的情况下。

相关问题