Location Manager всегда возвращает false для проверки с включенным gps в устройствах oreo + в android - PullRequest
0 голосов
/ 21 января 2019

LocationManager всегда возвращает false в устройствах oreo и выше, когда я проверяю, включен ли gps или нет, даже когда я его включаю, он все равно возвращает false.Как проверить, включен ли gps на oreo и выше устройствах?

Вот мой код:

Location manager;

  manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

           //this if check is always false even when gps is on    
 startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
            }


void onRestart(){
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

         //still returning false when i come back to app from settings screen after turning on gps, but it returns true in android Nougat devices perfectly
            }
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Существует еще одна возможность, которая на самом деле не связана с тем, является ли устройство Oreo или нет, но в действиях по настройке, которые вы перенаправляете через startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));, вы можете не включить самого поставщика GPS. Кроме того, поскольку вы сказали Oreo и выше , я думаю, что вы уже дали разрешение на android.manifest.Permission.ACCESS_FINE_LOCATION как во время выполнения, так и в манифесте.

Если вы заметили, есть 3 провайдера: GPS_PROVIDER, NETWORK_PROVIDER и PASSIVE_PROVIDER. Вы используете GPS_PROVIDER для получения своего местоположения, но если оно не включено через настройки, оно может вернуть false. Пока вы пытаетесь это сделать, мог быть выбран только сетевой поставщик.

Вот изображение того, о чем я говорю (из HUAWEI-P20 Lite - Android 8.0.0 API 26):

Click if not visible

0 голосов
/ 21 января 2019

Пожалуйста, используйте объединенный клиент определения местоположения
Документация
Это аккумуляторная батарея, с ней очень легко работать, и она довольно стандартна в приложениях, основанных на определении местоположения.
YouTubeучебник

Пример из одного из моих приложений:

@Override
public void onStart() {
    super.onStart();
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(getActivity());
}

@Override
public void onMapReady(GoogleMap googleMap) {
    if (googleMap == null) return;// GUARD
    map = googleMap;
    getDeviceLocationUpdates();
}  



/**
 * Start listening to location changes
 */
private void getDeviceLocationUpdates() {
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    locationRequest = new LocationRequest();

    locationRequest.setInterval(Constants.DRIVING_TIME_INTERVAL);
    locationRequest.setFastestInterval(Constants.DRIVING_TIME_INTERVAL);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper());

}  



LocationCallback locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        List<Location> locationList = locationResult.getLocations();
        if (locationList.size() > 0) {
            //The last location in the list is the newest
            Location location = locationList.get(locationList.size() - 1);
            Log.i(TAG, "Location: " + location.getLatitude() + " " + location.getLongitude());
            lastLocation = location;

            if (currentLocationMarker != null) {
                currentLocationMarker.remove();
            }

            if (mapPin == null) {
                mapPin = GraphicUtils.resizeImage(getActivity(), Constants.MAP_MARKER_IMAGE_NAME, 100, 100);
            }

            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            placeCurrentLocationMarker(latLng);

            //move map camera
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, Constants.DEFAULT_ZOOM));
        }
    }
};  



/**
 * Places a marker with user image on the map on given location
 *
 * @param location GPS Location
 */
private void placeCurrentLocationMarker(LatLng location) {
    Bitmap bitmap = GraphicUtils.createContactBitmap(getActivity(), BitmapFactory.decodeResource(
            getActivity().getResources(),
            Integer.valueOf(((MainActivity) getActivity()).currentUser.getImgUrl())));
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(location);
    markerOptions.title(getString(R.string.you_are_here));
    markerOptions.icon((bitmap == null) ?
            BitmapDescriptorFactory.fromBitmap(mapPin) :
            BitmapDescriptorFactory.fromBitmap(bitmap));
    currentLocationMarker = map.addMarker(markerOptions);
}
...