Показать пользователей, которые находятся в радиусе 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
// ...
}
});
Вы должны реализовать логику на сервере на основе широты и долготы и вернуть данные