【问题标题】:Fused Location Provider not getting location unless GPS is on除非打开 GPS,否则 Fused Location Provider 无法获取位置
【发布时间】:2015-04-14 01:17:10
【问题描述】:

所以我实现了新的 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;
    }
}

【问题讨论】:

  • 我也遇到了这个问题,你解决了吗?
  • 在我的 Nexus 7 平板上也发生了同样的事情,如果解决了,请分享解决方案,谢谢
  • 遇到同样的问题,除非启用 GPS,否则根本找不到位置。你的问题解决了吗?

标签: java android gps geolocation fusedlocationproviderapi


【解决方案1】:

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

【讨论】:

  • 我认为这个答案解决了位置和 GPS 之间的混淆。
【解决方案2】:

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

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

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

要为只有 WiFi 的用户测试该应用是否可以获取位置 - 将设置更改为“Wifi+Cellular”。

【讨论】:

    【解决方案3】:

    您似乎正在使用LocationRequest.PRIORITY_HIGH_ACCURACY,它更喜欢使用上面的 GPS 和其他方法。您可能想使用PRIORITY_BALANCED_POWER_ACCURACY,它会在使用 GPS 之前使用 WiFi 和手机信号塔。

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

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

    【讨论】:

    • 嗯,我确实试过了。但是,当我使用 PRIORITY_BALANCED_POWER_ACCURACY 时,我没有得到任何位置。
    • 你是在模拟器还是设备上测试?
    • 我正在设备上进行测试。澄清一下,如果我没有开启 GPS,我将无法获得任何位置。
    • 很奇怪,我在 Lenovo K900 上运行了一些快速示例代码,并设法使用PRIORITY_BALANCED_POWER_ACCURACY 在关闭 GPS 的情况下进行定位。在黑暗中刺伤,但您是否选择让 Google 应用程序访问设备位置?它位于 Google 设置 > 位置 > 访问位置。还要检查是否允许设备使用 Wi-Fi/移动网络访问位置。您可能会收到一个对话框,询问 Google 是否可以收集匿名位置数据,具体取决于您的设备型号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2015-08-17
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多