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

Я пытаюсь найти свое текущее местоположение для проекта 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();
}

Ответы [ 7 ]

35 голосов
/ 26 марта 2012

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(), где он проверяет, включен ли поставщик сети.если нет, то используется последнее известное местоположение.если он включен, он регистрируется для получения обновлений местоположения.

8 голосов
/ 26 марта 2012

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

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"/>
0 голосов
/ 01 апреля 2019

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

List<String> providers = mLocationManager.getProviders(true);

до ...

List<String> providers = locationManager.getAllProviders();

Это сработало для меня, и убедитесь, что в вашем файле AndroidManifest.xml есть следующее ...

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
0 голосов
/ 10 января 2019

включите ваш 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 голосов
/ 04 декабря 2016

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

0 голосов
/ 21 марта 2013

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

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 голосов
/ 26 марта 2012

Вы пытались изменить код?Например, если (location == null), то print это местоположение равно нулю, а в противном случае местоположение печати не равно нулю.Однажды я получил эту проблему, и это, казалось, исправило ее (я не знаю почему).Попробуйте.

Если это не сработает, возможно, API карт Google возвращает нулевое значение, и в этом случае возникает проблема с GM-API или с методом вызова.Любая из них может быть проблемой.

Надеюсь, это поможет,

-JXP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...