У меня есть требование, когда я хочу получить текущее местоположение пользователя, и на основе текущего местоположения пользователя я хочу получить информацию о другом пользователе с сервера приложений и хочу показать их в списке. Пользователи должны находиться в радиусе 5 или 10 км.
Я получил данные о пользователях с сервера, чтобы показать их в приложении, но хочу, чтобы они отображались в пределах этого конкретного радиуса. Любая помощь приветствуется.
Показать пользователей, которые находятся в радиусе 10 км от текущего местоположения пользователя Android
Ответы (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
// ...
}
});
вы должны реализовать логику на сервере на основе широты и долготы и вернуть данные