Получение значений Lat и Long из FusedLocationProviderClient android - PullRequest
0 голосов
/ 27 апреля 2019

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

Manifest

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Макет: есть кнопка

build.gradle

implementation 'com.google.android.gms:play-services-location:16.0.0'

Java

ArrayList<String> Coord_Array;

Метод Inside OnCreate

private FusedLocationProviderClient client;
client = LocationServices.getFusedLocationProviderClient( ShowOutletParams.this );
Coord_Array = new ArrayList<String>();

Внешний метод OnCreate - я использую getLocation() внутри кнопки onclicklistener

private String getLocation() {
        if (ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        client.getLastLocation().addOnSuccessListener( ShowOutletParams.this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    String locat = location.toString();
                    String lat = locat.substring(15,24);
                    String longi = locat.substring(25,34);
                    Coord_Array.add(lat);
                    Coord_Array.add(longi);
                    //return Coord_Array;
                }
            }
        } );

    }

Когда я добавляю Log.i для записи значений lat и long, я могу видеть их в журнале, однако я хочу, чтобы они были сохранены как строки, которые я хочу использовать позже.
Я понимаю, void ничего не возвращает .... однако Coord_Array тоже не возвращает или печатает лат и лонг.

Ответы [ 3 ]

2 голосов
/ 27 апреля 2019

Основная проблема заключается в том, что ваш метод private String getLocation() возвращает до того, как какое-либо местоположение действительно станет доступным (и я почти уверен, что оно не скомпилируется при просмотре).

Когда вы здесь:

if (ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
   return;
}

вы все еще находитесь в стандартном потоке вашего метода.Но как только вы пройдете здесь:

client.getLastLocation().addOnSuccessListener(

весь код в вашем public void onSuccess(Location location) теперь выполняется ПОСЛЕ ваш вызов getLocation() уже возвращен!

Простое решение состоит в том, чтобы передать обратные вызовы в ваш метод getLocation(), чтобы они могли быть вызваны после , когда метод уже вернулся к своему вызывающему, например,

public interface LocationAvailableListener {
    public void onLocationAvailable(Location location)
}

public void getLocation(LocationAvailableListener locationAvaialbleCallback, Runnable locationNotAvailableCallback) {
...

Тогда, когдапроверяя разрешения, теперь вы можете вызвать ваш сбой обратного вызова:

if (ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
   locationNotAvailableCallback.run();

   return;
}

, а затем в вашем onSuccess

if (location != null) {
   locationAvaialbleCallback.onLocationAvailable(location);
}
else {
   locationNotAvailableCallback.run();
}

И затем использовать:

getLocation(
   location -> {
      String latitude = String.valueOf(location.getLatitude());
      String longitude = String.valueOf(location.getLongitude());

      // Add to your ArrayList here
      // Save to your database or wherever for later
   },
   { Log.i(TAG, "Failed to get Location"); })

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

1 голос
/ 27 апреля 2019

Вам следует попробовать:

client.getLastLocation().addOnSuccessListener( ShowOutletParams.this, new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
                    if (location != null) {
                        double mLatitude = location.getLatitude();
                        double mLongitude = location.getLongitude();                           
                    }
                });
            } else {
                Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
            }}

, если проблема не решена, для учебника

0 голосов
/ 27 апреля 2019

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

в Kotlin:

lat = location.latitude.toString()

и вЯва:

lat = location.getLatitude() + "";

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