融合定位提供程序无法获取位置,除非GPS打开

15
所以我已经使用了新的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;
    }
}

2
我也遇到了这个问题,你解决了吗? - jjz
同样的问题发生在我的Nexus 7平板电脑上,如果已经解决,请分享解决方案,谢谢。 - Beeing Jk
你也遇到了同样的问题吗?除非启用GPS,否则根本没有位置信息。你解决了这个问题吗? - AAverin
3个回答

11

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


5
我认为这个答案解决了位置和GPS之间的混淆。 - Rohit Bandil

3
我想我已经找到了解决问题的方法。
如果您前往“设置”->“隐私和安全”->“位置”,您会注意到位置不仅仅是GPS,而实际上它让用户决定可以使用哪些提供程序。例如,您可以设置仅使用WiFi和蜂窝网络来获取任何位置信息。
禁用位置选项将同时禁用所有提供者,而不仅仅是GPS。
要测试仅使用WiFi的用户的应用程序是否可以获取位置,请将设置更改为“WiFi +蜂窝网络”。

0

看起来您正在使用LocationRequest.PRIORITY_HIGH_ACCURACY,这会优先使用GPS而非其他方法。您可能想要使用PRIORITY_BALANCED_POWER_ACCURACY,它会在使用GPS之前使用WiFi和基站。

此外,由于PRIORITY_BALANCED_POWER_ACCURACY是一种“粗略”的精度级别,因此您可能需要适当更改清单中的位置权限。

培训文档详细介绍了有关优先级标志的更多信息,您可能还希望仔细阅读一下。


1
我肯定尝试过了。但是,当我使用PRIORITY_BALANCED_POWER_ACCURACY时,我没有得到任何位置信息。 - Georgi Angelov
你是在模拟器上测试还是在设备上测试? - Abhishek
我正在设备上进行测试。澄清一下,如果我没有开启 GPS,我就无法获取任何位置信息。 - Georgi Angelov
奇怪,我在联想K900上运行了一些快速的示例代码,并成功使用“PRIORITY_BALANCED_POWER_ACCURACY”关闭GPS获取位置修复。这只是一个猜测,但您是否选择了Google应用程序以访问设备位置?它在Google设置>位置>访问位置下。还要检查设备是否允许使用Wi-Fi /移动网络来访问位置。根据您的设备型号,您可能会收到一个对话框,询问Google是否可以收集匿名位置数据。 - Abhishek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接