Android 不使用GPS数据的Google服务定位客户端

Android 不使用GPS数据的Google服务定位客户端,android,gps,location,google-api-client,Android,Gps,Location,Google Api Client,我目前正在尝试谷歌服务提供的LocationClient。当我在一个建筑物旁边时,我会频繁地进行位置更新,但是在道路中间,它们不那么频繁和不准确。在国家一方,根本没有更新。我想知道谷歌定位服务是否使用GPS,所以我禁用了手机设置中除GPS之外的所有定位提供商,并立即停止接收任何更新。显然,我的LocationClient没有收到任何使用GPS数据的更新 我错过什么了吗?是否需要为LocationClient设置任何设置,或者必须使用标准的LocationManager.GPS\u提供程序 我试图

我目前正在尝试谷歌服务提供的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