除非已启用GPS,否则融合位置提供商无法获取位置

时间:2015-02-13 03:44:27

标签: java android gps geolocation fusedlocationproviderapi

所以我已经实现了新的Fused Location Provider API以获取用户的位置但由于某种原因,除非GPS已开启,否则我无法获得任何位置。并非总是如此,用户是否会打开GPS,我不想让他们每次加载应用程序时都要打开GPS。 如何告诉API为我提供其可用提供商的位置?

这是我的代码:

public class FusedLocationService implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    public interface OnLocationChangedListener {
        public void OnLocationChanged(Location location);
    }

    private final String TAG = "SE8611";
    private boolean mRequestingLocationUpdates = true;

    private OnLocationChangedListener mCallBack;

    Service locationService;
    private LocationRequest locationRequest;
    private GoogleApiClient googleApiClient;
    private Location mCurrentLocation;
    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;

    public FusedLocationService(Service locationService, final long INTERVAL, final long FASTEST_INTERVAL) {
        Logger.log(TAG, "FusedLocationService called");

        this.mCallBack = (OnLocationChangedListener)locationService;

        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(INTERVAL);
        locationRequest.setFastestInterval(FASTEST_INTERVAL);
        this.locationService = locationService;

        googleApiClient = new GoogleApiClient.Builder(locationService)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        if (googleApiClient != null) {
            googleApiClient.connect();
        }
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        if(mRequestingLocationUpdates) {
            startLocationUpdates();
        }else{
            Logger.log(TAG, "Location updates are already running.");
        }
    }

    protected void startLocationUpdates() {
        this.fusedLocationProviderApi.requestLocationUpdates(
                googleApiClient, locationRequest, this);
        this.mRequestingLocationUpdates = false;
    }

    @Override
    public void onLocationChanged(Location mCurrentLocation) {
        Logger.log(TAG, "onLocationChanged called");
        this.mCurrentLocation = mCurrentLocation;
        this.mCallBack.OnLocationChanged(this.mCurrentLocation);
    }

    public void startLocationUpdatesAfterResume(){
        if (googleApiClient.isConnected() && !mRequestingLocationUpdates) {
            Logger.log(TAG, "startLocationUpdatesAfterResume called");
            this.startLocationUpdates();
        }
    }

    public void stopLocationUpdates() {
        Logger.log(TAG, "stopping Location Updates");
        LocationServices.FusedLocationApi.removeLocationUpdates(
                googleApiClient, this);
    }

    public Location getLocation() {
        return this.mCurrentLocation;
    }

    @Override
    public void onConnectionSuspended(int i) {
        this.mRequestingLocationUpdates = true;
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        this.mRequestingLocationUpdates = true;
    }
}

3 个答案:

答案 0 :(得分:9)

我遇到了和你一样的问题,这根本不是问题。 Android曾经有一个GPS按钮,可以让你直接控制它,但他们用一个不同的位置按钮取而代之。 要获得任何类型的位置,您必须打开它。 和你一样,我认为位置按钮只能打开和关闭GPS,但事实并非如此。 您可以通过更改位置模式来控制GPS:  1.高精度(GPS,Wi-Fi和移动网络)  2.省电(Wi-Fi和移动网络)  3.仅限GPS

答案 1 :(得分:2)

我想我找到了问题的解决方案。

如果你去设置 - >隐私和安全 - >位置,您会注意到位置不仅仅是GPS,而且实际上让用户可以决定使用哪些提供商。例如,您可以设置只应使用WiFi和Cellular来获取任何位置

禁用位置选项会立即禁用所有提供商,而不仅仅是GPS。

要为仅使用WiFi的用户测试该应用,可以获取位置 - 将设置更改为“Wifi + Cellular”。

答案 2 :(得分:0)

您似乎正在使用LocationRequest.PRIORITY_HIGH_ACCURACY,它更喜欢使用GPS而不是其他方法。您可能希望使用PRIORITY_BALANCED_POWER_ACCURACY,它将在使用GPS之前使用WiFi和手机信号塔。

此外,由于PRIORITY_BALANCED_POWER_ACCURACY是粗略的"准确度,您可能需要适当更改清单中的位置权限。

The training documentation详细介绍了有关优先级标志的详细信息,您可能还想了解它。