Android 不使用GPS数据的Google服务定位客户端
我目前正在尝试谷歌服务提供的LocationClient。当我在一个建筑物旁边时,我会频繁地进行位置更新,但是在道路中间,它们不那么频繁和不准确。在国家一方,根本没有更新。我想知道谷歌定位服务是否使用GPS,所以我禁用了手机设置中除GPS之外的所有定位提供商,并立即停止接收任何更新。显然,我的LocationClient没有收到任何使用GPS数据的更新 我错过什么了吗?是否需要为LocationClient设置任何设置,或者必须使用标准的LocationManager.GPS\u提供程序 我试图建立一个应用程序运行,我需要准确的位置数据。任何建议都将不胜感激;-)! 以下是我使用的实现:Android 不使用GPS数据的Google服务定位客户端,android,gps,location,google-api-client,Android,Gps,Location,Google Api Client,我目前正在尝试谷歌服务提供的LocationClient。当我在一个建筑物旁边时,我会频繁地进行位置更新,但是在道路中间,它们不那么频繁和不准确。在国家一方,根本没有更新。我想知道谷歌定位服务是否使用GPS,所以我禁用了手机设置中除GPS之外的所有定位提供商,并立即停止接收任何更新。显然,我的LocationClient没有收到任何使用GPS数据的更新 我错过什么了吗?是否需要为LocationClient设置任何设置,或者必须使用标准的LocationManager.GPS\u提供程序 我试图
public class CustomLocationProvider implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener, android.location.LocationListener {
private static final float DATA_UPDATE_DISTANCE = 100.0f;
private static final long ONE_MIN = 1000 * 60;
private static final long FIVE_MIN = ONE_MIN * 5;
private static final int UPDATE_TIME = 5000;
private static final int FASTEST_INTERVAL = 16;
private static final int ACCURACY_THRESHOLD = 30;
private Context mContext;
private LocationClient mLocationClient;
private Location mPreviousLocation;
private float mTotalDistance;
private float mDistanceSinceLastUpdate = 0.0f;
private WeakReference<Activity> mDelegate;
public interface LocationProviderDelegate {
void locationUpdated(Location location);
}
// These settings are the same as the settings for the map. They will in fact give you updates
// at the maximal rates currently possible.
private static final LocationRequest REQUEST = LocationRequest.create()
.setInterval(UPDATE_TIME) // 5 seconds
.setFastestInterval(FASTEST_INTERVAL) // 16ms = 60fps
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
public CustomLocationProvider (Context context, Activity delegate) {
if(context != null) {
mContext = context;
mDelegate = new WeakReference<Activity>(delegate);
}
}
public void enableTracking(boolean enable) {
if(enable) {
setUpLocationClientIfNeeded();
mLocationClient.connect();
} else {
if(mLocationClient != null) {
mLocationClient.disconnect();
}
}
}
private void setUpLocationClientIfNeeded() {
if (mLocationClient == null) {
mLocationClient = new LocationClient(
mContext,
this, // ConnectionCallbacks
this); // OnConnectionFailedListener
}
}
@Override
public void onLocationChanged(Location location) {
if(mPreviousLocation != null
&& location.getTime() > mPreviousLocation.getTime()
&& location.getAccuracy() < ACCURACY_THRESHOLD)
{
float distanceIncrement = mPreviousLocation.distanceTo(location);
mDistanceSinceLastUpdate += distanceIncrement;
mTotalDistance += distanceIncrement;
if(mDistanceSinceLastUpdate >= DATA_UPDATE_DISTANCE)
{
mDistanceSinceLastUpdate = 0.0f;
requestDataUpdate(location);
}
updateLocation(location);
} else if( mPreviousLocation == null){
requestDataUpdate(location);
updateLocation(location);
}
}
private void updateLocation(Location location) {
try {
((LocationProviderDelegate) mDelegate.get()).locationUpdated(location);
} catch (Exception e) {
Logger.logError("Cannot cast as a LocationProviderDelegate");
}
mPreviousLocation = location;
}
/**
* Callback called when connected to GCore. Implementation of {@link ConnectionCallbacks}.
*/
@Override
public void onConnected(Bundle connectionHint) {
mLocationClient.requestLocationUpdates(
REQUEST,
this); // LocationListener
Location location = mLocationClient.getLastLocation();
if (location != null) {
if (age(location) < FIVE_MIN) {
mPreviousLocation = location;
requestDataUpdate(location);
}
}
}
/**
* Callback called when disconnected from GCore. Implementation of {@link ConnectionCallbacks}.
*/
@Override
public void onDisconnected() {
// Do nothing
}
/**
* Implementation of {@link OnConnectionFailedListener}.
*/
@Override
public void onConnectionFailed(ConnectionResult result) {
Logger.postMessageToTheUser("Connection failed", mDelegate.get());
}
public void Reset(){
mTotalDistance = 0;
}
public float TotalDistance() {
return mTotalDistance;
}
public void requestDataUpdate(Location location)
{
double latitude = location.getLatitude();
double longitude = location.getLongitude();
double offset = 0.002;
LatLngBounds bounds = LatLngBounds.builder()
.include(new LatLng(latitude - offset, longitude - offset))
.include(new LatLng(latitude + offset, longitude + offset))
.build();
updateData();
}
private long age(Location location) {
return System.currentTimeMillis() - location.getTime();
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
String newStatus = "";
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
newStatus = "OUT_OF_SERVICE";
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
newStatus = "TEMPORARILY_UNAVAILABLE";
break;
case LocationProvider.AVAILABLE:
newStatus = "AVAILABLE";
break;
}
String msg = provider + ": " + newStatus;
Logger.postMessageToTheUser(msg, mDelegate.get());
}
}
公共类CustomLocationProvider实现ConnectionCallbacks、OnConnectionFailedListener、LocationListener、android.location.LocationListener{
专用静态最终浮动数据\u更新\u距离=100.0f;
专用静态最终长1_MIN=1000*60;
私有静态最终长五分钟=一分钟*5;
私有静态最终整数更新时间=5000;
专用静态最终int最快_间隔=16;
专用静态最终整数精度_阈值=30;
私有上下文;
私人地点客户M地点客户;
私人场所和前一场所;
私人浮动利率;
私有浮点MDistanceInclastUpdate=0.0f;
私人武器参考手册;
公共接口位置ProviderDelegate{
无效位置更新(位置);
}
//这些设置与地图的设置相同。它们实际上会为您提供更新
//以目前可能的最大速率。
私有静态最终位置请求=LocationRequest.create()
.setInterval(更新时间)//5秒
.SetFastTestInterval(最快间隔)//16ms=60fps
.setPriority(位置请求。优先级高精度);
公共CustomLocationProvider(上下文、活动委托){
if(上下文!=null){
mContext=上下文;
mDelegate=新的WeakReference(代表);
}
}
public void enableTracking(布尔启用){
如果(启用){
setupLocationClientIfNeed();
mLocationClient.connect();
}否则{
if(mLocationClient!=null){
mLocationClient.disconnect();
}
}
}
私有void setupLocationClientIfNeed(){
if(mLocationClient==null){
mlLocationClient=新位置客户端(
McContext,
此,//ConnectionCallbacks
此);//OnConnectionFailedListener
}
}
@凌驾
已更改位置上的公共无效(位置){
如果(mPreviousLocation!=null
&&location.getTime()>MPPreviousLocation.getTime()
&&location.getAccuracy()=数据更新距离)
{
MDistanceInclastUpdate=0.0f;
请求数据更新(位置);
}
更新位置(位置);
}else if(mPreviousLocation==null){
请求数据更新(位置);
更新位置(位置);
}
}
私有void更新位置(位置){
试一试{
((LocationProviderDelegate)mDelegate.get()).LocationUpdate(location);
}捕获(例外e){
Logger.logError(“无法强制转换为LocationProviderDelegate”);
}
mPreviousLocation=位置;
}
/**
*连接到GCore时调用回调。{@link ConnectionCallbacks}的实现。
*/
@凌驾
未连接的公共无效(捆绑连接提示){
mLocationClient.RequestLocationUpdate(
要求
这个);//位置侦听器
Location Location=mLocationClient.getLastLocation();
如果(位置!=null){
if(年龄(位置)<5分钟){
mPreviousLocation=位置;
请求数据更新(位置);
}
}
}
/**
*从GCore断开连接时调用回调。{@link ConnectionCallbacks}的实现。
*/
@凌驾
公共空间已断开连接(){
//无所事事
}
/**
*{@link OnConnectionFailedListener}的实现。
*/
@凌驾
连接失败的公共void(连接结果){
Logger.postMessageToTheUser(“连接失败”,mDelegate.get());
}
公共无效重置(){
mTotalDistance=0;
}
公共浮动总距离(){
返回mTotalDistance;
}
public void requestDataUpdate(位置)
{
双纬度=location.getLatitude();
double longitude=location.getLongitude();
双偏移=0.002;
LatLngBounds bounds=LatLngBounds.builder()
.包括(新板条(纬度偏移、经度偏移))
.包括(新板条(纬度+偏移、经度+偏移))
.build();
更新数据();
}
私人长年(地点){
return System.currentTimeMillis()-location.getTime();
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
//TODO自动生成的方法存根
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
//TODO自动生成的方法存根
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra