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

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

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
                // ...
            }
        });

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

Другие вопросы по тегам