it-swarm.com.ru

Мое текущее местоположение всегда возвращает ноль. Как я могу это исправить?

Я пытаюсь найти свое текущее местоположение для проекта Android. Когда приложение загружено, мое текущее местоположение всегда равно нулю. Я установил разрешения в манифесте и т.д. Когда я найду текущее местоположение, я намерен использовать координаты, чтобы найти расстояния до других мест на карте. Мой фрагмент кода ниже. Почему я всегда получаю нулевое значение? 

locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);          
Criteria crit = new Criteria();     
towers = locMan.getBestProvider(crit, false);
location = locMan.getLastKnownLocation(towers);    

if (location != null) {                 
    System.out.println("Location is not null!");
    lat = (int) (location.getLatitude() *1E6);
    longi = (int) (location.getLongitude() * 1E6);
    GeoPoint ourLocation = new GeoPoint(lati, longi);
    OverlayItem overlayItem = new OverlayItem(ourLocation, "1st String",
                                                            "2nd String");
    CustomPinpoint custom = new CustomPinpoint(d, MainMap.this);
    custom.insertPinpoint(overlayItem);
    overlayList.add(custom);
    overlayList.clear();
} else {
   System.out.println("Location is null! " + towers);
   Toast.makeText(MainMap.this, "Couldn't get provider",Toast.LENGTH_SHORT)
                                                                    .show();
}
16
devinefergal

getLastKnownLocation() использует местоположение (я), ранее найденное другими приложениями. если ни одно приложение не сделало этого, то getLastKnownLocation() вернет ноль.

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

private Location getLastKnownLocation() {
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        ALog.d("last known location, provider: %s, location: %s", provider,
                l);

        if (l == null) {
            continue;
        }
        if (bestLocation == null
                || l.getAccuracy() < bestLocation.getAccuracy()) {
            ALog.d("found best last known location: %s", l);
            bestLocation = l;
        }
    }
    if (bestLocation == null) {
        return null;
    }
    return bestLocation;
}

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

https://github.com/farble1670/autobright/blob/master/src/org/jtb/autobright/EventService.Java

см. метод onStartCommand(), где он проверяет, включен ли сетевой поставщик. если нет, то используется последнее известное местоположение. если он включен, он регистрируется для получения обновлений местоположения.

34
Jeffrey Blattman

если вы находите текущее местоположение устройств, используйте следующий метод в основном классе

public void find_Location(Context con) {
    Log.d("Find Location", "in find_location");
    this.con = con;
    String location_context = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) con.getSystemService(location_context);
    List<String> providers = locationManager.getProviders(true);
    for (String provider : providers) {
        locationManager.requestLocationUpdates(provider, 1000, 0,
            new LocationListener() {

                public void onLocationChanged(Location location) {}

                public void onProviderDisabled(String provider) {}

                public void onProviderEnabled(String provider) {}

                public void onStatusChanged(String provider, int status,
                        Bundle extras) {}
            });
        Location location = locationManager.getLastKnownLocation(provider);
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
            addr = ConvertPointToLocation(latitude, longitude);
            String temp_c = SendToUrl(addr);
        }
    }
}

И добавить метод разрешения пользователя в свой файл манифеста

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
8
Akash Singh

включите GPS, используя метод ниже. это поможет вам показать ваше текущее местоположение без каких-либо ошибок. позвони в onCreate

public void displayLocationSettingsRequest(Context context, int requestCode) {
    GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
            .addApi(LocationServices.API).build();
    googleApiClient.connect();

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(10000 / 2);

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

    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(result1 -> {
        final Status status = result1.getStatus();
        if (status.getStatusCode() == LocationSettingsStatusCodes.RESOLUTION_REQUIRED)
            try {
                status.startResolutionForResult((Activity) context, requestCode);
            } catch (IntentSender.SendIntentException ignored) {
            }
    });
0
Mosayeb Masoumi

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

0
Thanga balaji.s

Попробуйте это, это не даст вам нулевое текущее местоположение

class GetLastLocation extends TimerTask {

    LocationManager mlocManager = (LocationManager) 
            getSystemService(Context.LOCATION_SERVICE);
    LocationListener mlocListenerTmp = new CustomLocationListener();
    private final Handler mLocHandler;

    public GetLastLocation(Handler mLocHandler) {
        this.mLocHandler = mLocHandler;
    }

    @Override
    public void run() {
        timer.cancel();
        mlocManager.removeUpdates(mlocListenerTmp);
        Location location = mlocManager
                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        {
            if (mlocListenerTmp != null) {
                mlocManager.removeUpdates(mlocListenerTmp);
            }
            currentLocation = location;
        }
        if (location != null) {
            String message = String.format(
                "Location \n Longitude: %1$s \n Latitude: %2$s",
                location.getLongitude(), location.getLatitude());
            Log.d("loc", " :" + message);
            Bundle b = new Bundle();
            {
                b.putBoolean("locationRetrieved", true);
                {
                    Message msg = Message.obtain();
                    {
                        msg.setData(b);
                        mLocHandler.sendMessage(msg);
                    }
                }
            }
        } else {
            Log.d(
                "loc",
                ":No GPS or network signal please fill the location manually!");
            location = mlocManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (location != null) {
                currentLocation = location;
                Bundle b = new Bundle();
                {
                    b.putBoolean("locationRetrieved", true);
                    {
                        Message msg = Message.obtain();
                        {
                            msg.setData(b);
                            mLocHandler.sendMessage(msg);
                        }
                    }
                }
            } else {
                Bundle b = new Bundle();
                {
                    b.putBoolean("locationRetrieved", false);
                    {
                        Message msg = Message.obtain();
                        {
                            msg.setData(b);
                            mLocHandler.sendMessage(msg);
                        }
                    }
                }
            }
        }
    }
}

называть это так

timer.schedule(new GetLastLocation(mLocHandler), 3000);

и customLocationclass выглядит следующим образом

public class CustomLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location loc) {
        loc.getLatitude();
        loc.getLongitude();
        currentLocation = loc;
        String Text = "My current location is: " + "Latitud = "
            + loc.getLatitude() + "Longitud = " + loc.getLongitude();
        Log.d("loc", "onLocationChanged" + Text);
    }

    @Override
    public void onProviderDisabled(String provider) {}

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
}
0
Bhushan Shirsath