Показать пользователей, которые находятся в радиусе 10 км от текущего местоположения пользователя Android

У меня есть требование, когда я хочу получить текущее местоположение пользователя, и на основе текущего местоположения пользователя я хочу получить информацию о другом пользователе с сервера приложений и хочу показать их в списке. Пользователи должны находиться в радиусе 5 или 10 км.
Я получил данные о пользователях с сервера, чтобы показать их в приложении, но хочу, чтобы они отображались в пределах этого конкретного радиуса. Любая помощь приветствуется.


person Community    schedule 20.12.2017    source источник
comment
В основном вам нужно рассчитать расстояние между двумя точками карты Google. соответственно, вы можете установить логику текущего местоположения погоды внутри или за пределами расчетного радиуса.   -  person Radhey    schedule 20.12.2017
comment
ИЛИ вы можете использовать developers.google.com/android/ ссылка/com/google/android/gms/ там.   -  person Radhey    schedule 20.12.2017
comment
я хочу показать данные в режиме просмотра ресайклера, а не на карте   -  person    schedule 20.12.2017
comment
Пользователи должны находиться в радиусе 5 или 10 км. эта логика должна быть реализована на стороне сервера. Тогда где вы застряли!   -  person Radhey    schedule 20.12.2017
comment
на самом деле я не понял, как сравнить текущее местоположение с местоположениями, хранящимися в базе данных (используя широту и долготу или по имени местоположения) и как проверить радиус широты и долготы.   -  person    schedule 20.12.2017
comment
Вам нужно отправить местоположение вашего устройства (широта, долгота) на сервер. Внутри этого API на стороне сервера должна быть реализована эта логика (диапазон 100 м). В ответ на этот API вы получите #list of users (devices) в пределах 100 м. Затем отобразите этот список в представлении ресайклера. Имейте смысл!   -  person Radhey    schedule 20.12.2017


Ответы (2)


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

Давайте посмотрим, как это работает.

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

У вас может быть несколько активных геозон, не более 100 на пользователя устройства.

введите здесь описание изображения

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

Настройка мониторинга геозон

Первым шагом в запросе мониторинга геозоны является запрос необходимого разрешения. Чтобы использовать геозону, ваше приложение должно запросить ACCESS_FINE_LOCATION. Чтобы запросить это разрешение, добавьте следующий элемент в качестве дочернего элемента <manifest> в манифесте приложения:

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

Если вы хотите использовать IntentService для прослушивания переходов между геозонами, добавьте элемент, определяющий имя службы. Этот элемент должен быть дочерним по отношению к элементу <application>:

<application
   android:allowBackup="true">
   ...
   <service android:name=".GeofenceTransitionsIntentService"/>
<application/>

Чтобы получить доступ к API местоположения, вам необходимо создать экземпляр клиента Geofencing. Чтобы узнать, как подключить клиент:

private GeofencingClient mGeofencingClient;

// ...

mGeofencingClient = LocationServices.getGeofencingClient(this);

Создание и добавление геозон

Примечание. На однопользовательских устройствах существует ограничение в 100 геозон на приложение. Для многопользовательских устройств ограничение составляет 100 геозон на приложение на пользователя устройства.

  • Создание объектов геозон

Сначала используйте Geofence.Builder. для создания геозоны, задав желаемый радиус, продолжительность и типы перехода для геозоны. Например, чтобы заполнить объект списка с именем mGeofenceList:

 mGeofenceList.add(new Geofence.Builder()
    // Set the request ID of the geofence. This is a string to identify this
    // geofence.
    .setRequestId(entry.getKey())

    .setCircularRegion(
            entry.getValue().latitude,
            entry.getValue().longitude,
            Constants.GEOFENCE_RADIUS_IN_METERS
    )
    .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
    .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
            Geofence.GEOFENCE_TRANSITION_EXIT)
    .build());

Укажите геозоны и начальные триггеры

В следующем фрагменте кода используется класс GeofencingRequest и его вложенный класс GeofencingRequestBuilder для указания геозоны для мониторинга и настройки того, как инициируются связанные события геозоны:

private GeofencingRequest getGeofencingRequest() {
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
    builder.addGeofences(mGeofenceList);
    return builder.build();
}

Определите намерение для переходов между геозонами

Намерение, отправленное из Служб геолокации, может инициировать различные действия в вашем приложении, но вы не должны запускать активность или фрагмент, потому что компоненты должны становиться видимыми только в ответ на действие пользователя. Во многих случаях IntentService является хорошим способом обработки намерений. . IntentService может публиковать уведомления, выполнять длительную фоновую работу, отправлять намерения другим службам или отправлять широковещательные намерения. В следующем фрагменте показано, как определить PendingIntent, который запускает IntentService:

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (mGeofencePendingIntent != null) {
            return mGeofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceTransitionsIntentService.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        mGeofencePendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        return mGeofencePendingIntent;
    }

Добавить геозоны

Чтобы добавить геозоны, используйте GeofencingClient.addGeofences(). Укажите объект GeofencingRequest и PendingIntent. Следующий фрагмент демонстрирует обработку результатов:

mGeofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences added
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to add geofences
                // ...
            }
        });

Управление переходами между геозонами

Примечание. В Android 8.0 (уровень API 26) и выше, если приложение работает в фоновом режиме во время мониторинга геозоны, устройство реагирует на события геозоны каждые пару минут. Чтобы узнать, как адаптировать ваше приложение к этим ограничениям ответов, см. Ограничения фонового местоположения.

public class GeofenceTransitionsIntentService extends IntentService {
    // ...
    protected void onHandleIntent(Intent intent) {
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if (geofencingEvent.hasError()) {
            String errorMessage = GeofenceErrorMessages.getErrorString(this,
                    geofencingEvent.getErrorCode());
            Log.e(TAG, errorMessage);
            return;
        }

        // Get the transition type.
        int geofenceTransition = geofencingEvent.getGeofenceTransition();

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

            // Get the transition details as a String.
            String geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            );

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails);
            Log.i(TAG, geofenceTransitionDetails);
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition));
        }
    }

Остановить мониторинг геозоны

mGeofencingClient.removeGeofences(getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences removed
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to remove geofences
                // ...
            }
        });
person Fenil Patel    schedule 20.12.2017

вы должны реализовать логику на сервере на основе широты и долготы и вернуть данные

person Durgam Thirupathi    schedule 20.12.2017