1

getLastLocation()在我的 6.0 Nexus 7 平板电脑上关闭手机位置时返回 NULL,但它在另一台设备上没有 GPS 的情况下工作。为什么会这样以及有什么方法可以解决它?我想关闭 GPS,只使用网络获取位置。

下面是我用来获取位置的类:

public class GPSCenter {
public static GoogleApiClient mGoogleApiClient;
public static Location mLastLocation;
private static Context mContext;

static GoogleApiClient.ConnectionCallbacks ccb = new GoogleApiClient.ConnectionCallbacks() {

    @Override
    public void onConnectionSuspended(int arg0) {
    }

    @Override
    public void onConnected(Bundle arg0) {

        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        LocationRequest mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_NO_POWER);

        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    }
};
static GoogleApiClient.OnConnectionFailedListener odfl = new GoogleApiClient.OnConnectionFailedListener() {
    @Override
    public void onConnectionFailed(ConnectionResult arg0) {
    }
};

public static synchronized void buildGoogleApiClient(Context c) {
    try {

        mContext = c;
        mGoogleApiClient = new GoogleApiClient.Builder(c)
                .addConnectionCallbacks(ccb)
                .addOnConnectionFailedListener(odfl)
                .addApi(LocationServices.API)
                .build();

        mGoogleApiClient.connect();
    } catch (Exception ex) {
        Log.i("location", "error " + ex.toString());
        ex.printStackTrace();
    }
}

public static double getLatitude(Context c) {
    try {
        return mLastLocation.getLatitude();
    } catch (Exception ex) {
        return 0.0;
    }
}

public static double getLongitude(Context c) {
    try {
        return mLastLocation.getLongitude();
    } catch (Exception ex) {
        return 0.0;
    }
}
}
4

4 回答 4

2

这不是因为 GPS 的问题,而是Location Settings设备中尚未启用它,它位于您的设备设置>谷歌>服务>位置,或设置>隐私和安全>位置,或只是设置>位置。我很困惑,因为在某些设备中,下拉状态栏显示 GPS 启用按钮,有些显示位置启用按钮。有一种方法可以自动启用位置设置(无需将用户导航到设备设置),它解决了我的问题,希望对您有所帮助:

连接 GoogleApiClient 后,进行位置设置检查,如下所示:

public static GoogleApiClient mGoogleApiClient;
private static PendingResult<LocationSettingsResult> result;
private static LocationSettingsRequest.Builder builder;
public static Location mLastLocation;
public static boolean isLocationON = false;

public static synchronized void buildGoogleApiClient(Activity a, Context c) {

    try {

        mActivity = a;
        mContext = c;
        mGoogleApiClient = new GoogleApiClient.Builder(c)
                .addConnectionCallbacks(ccb)
                .addOnConnectionFailedListener(odfl)
                .addApi(LocationServices.API)
                .build();

        builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);

        mGoogleApiClient.connect();

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

private static GoogleApiClient.ConnectionCallbacks ccb = new GoogleApiClient.ConnectionCallbacks() {

    @Override
    public void onConnected(Bundle arg0) {
        checkLocationSettings();
    }

    @Override
    public void onConnectionSuspended(int arg0) {
    }
};

private static void checkLocationSettings() {

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {

        @Override
        public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
            final Status status = locationSettingsResult.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:

                    isLocationON = true;

                    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

                    if (mLocationSettingsListener != null) {
                        mLocationSettingsListener.onLocationON();
                    }

                    break;

                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

                    isLocationON = false;

                    try {
                        // This line will check the result and prompt a dialog if the device location settings is not enabled
                        status.startResolutionForResult(mActivity, REQUEST_CHECK_SETTINGS);

                    } catch (IntentSender.SendIntentException e) {
                    }
                    break;

                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    isLocationON = false;
                    // Location settings are unavailable so not possible to show any dialog now
                    if (mLocationSettingsListener != null) {
                        mLocationSettingsListener.onLocationError();
                    }
                    break;
            }
        }
    });
}
于 2016-10-17T03:58:16.800 回答
0

您必须在模拟器中将位置精度设置为仅设备。高精度或省电FusedLocationProviderApi在模拟器中不起作用。

于 2017-06-23T10:42:05.083 回答
0

下面解释了不返回任何位置值部分:
LocationRequestPRIORITY_NO_POWER

除非其他客户端请求位置更新,否则不会返回任何位置,在这种情况下,此请求将充当这些位置的被动侦听器。

对于FusedLocationProvider

在文档中的任何地方都没有明确指定唯一的来源

因此,要在不启用 GPS 的情况下获取位置,您可以信任PRIORITY_BALANCED_POWER_ACCURACY。据我观察,只有PRIORITY_HIGH_ACCURACY以强制方式使用 GPS。

平板电脑可能只有 wifi 或没有 SIM 卡,与其他设备不同,它排除了其他应用程序获取位置的情况——可能使用网络。

于 2016-08-30T13:34:47.700 回答
0

通过 Google Api 我认为这是不可能的。为此,您需要使用一些 api 进行 ip 地理定位,或者您可以通过此获取 MNC-Mobile 网络位置或 MCC-Mobile 国家代码。它可能会帮助你。

于 2016-08-30T11:37:42.853 回答