Android: Google Fused Location не работает, когда местоположение отключено

getLastLocation()возвращает NULL, когда местоположение телефона выключено на моем планшете 6.0 Nexus 7, но оно работает без 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;
    }
}
}

android,location,nexus-7,fusedlocationproviderapi,android-fusedlocation,

1

Ответов: 4


1 принят

Это связано не с тем, что GPS-устройство, но Location Settingsеще не включено в устройстве, оно находится под вашим устройством «Настройки»> «Google»> «Службы»> «Местоположение» или «Настройки»> «Конфиденциальность и безопасность»> «Местоположение» или «Настройки»> «Местоположение». Я запутался, потому что на каком-то устройстве в строке состояния выпадающего меню отображается кнопка включения 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;
            }
        }
    });
}

0

Через Google Api я думаю, что это невозможно. для этого вам нужно использовать некоторые api для ip геолокации, или вы можете использовать сетевое расположение MNC-Mobile или код страны MCC-Mobile, через это вы можете получить. Это может вам помочь.


0

В последующем объясняется, что не возвращалась часть значения местоположения:
LocationRequest . PRIORITY_NO_POWER :

Никакие местоположения не будут возвращены, если другой клиент не запросил обновления местоположения, и в этом случае этот запрос будет действовать как пассивный слушатель в этих местах.

Для FusedLocationProvider ,

нет однозначно уникального источника, указанного где-либо в документации .

Поэтому для получения местоположения без включения GPS вы можете доверять PRIORITY_BALANCED_POWER_ACCURACY . Из того, что я заметил, только PRIORITY_HIGH_ACCURACY использует GPS в обязательном порядке.

Планшет может быть только Wi-Fi или не иметь сим, который, в отличие от других устройств, исключает сценарий местоположения, получаемый другими приложениями, возможно, используя сеть.


0

Вы должны установить точность местоположения на устройство только в эмуляторе. Высокая точность или экономия батареи не будут работать FusedLocationProviderApiв эмуляторе.

андроид, расположение, нексус-7, fusedlocationproviderapi, андроид-fusedlocation,
Похожие вопросы