Intereting Posts
Советы по организации крупных проектов Android? Нажатие на Android Notification Actions не закрывает ящик уведомлений Какие разрешения могут предоставляться корневым устройствам? Кнопка в ViewPager перейдите к определенной странице Как обрабатывать уведомление, когда приложение находится в фоновом режиме в Firebase Как проверить доступное пространство на устройстве Android? На SD-карте? Распределение битмапа с использованием BitmapFactory.Options.inBitmap вызывает IllegalArgumentException Android / bitmap.h: Нет такого файла или каталога (после обновления инструментов Android SDK до версии 14) Как обновить электронную почту, адрес, псевдоним и т. Д. Контакта в Android? Диалог закрытия Android через 5 секунд? Требуется Gradle версии 1.8. Текущая версия – 1.6 GCM Error = MissingRegistration отправляет сообщения через JSON Как получить значения атрибутов темы Дополнительные разрешения, чтобы приложение отображалось на всех устройствах и включало дополнительные функции на некоторых устройствах? Как обращаться с намерением, у которого нет данных при первом вызове какого-либо действия?

Обработка перехода нескольких геообъектов с общей областью

Если у меня есть эти два геообъекта, после регистрации этих геозонов я должен получить уведомление, когда я вхожу или выходя из окружности этих кругов. Тем не менее, я не хочу, чтобы мое приложение отправляло уведомление, если я перемещаюсь по общей области, то есть от одного круга к другому.

Является ли это возможным? Если да, то как?

Изображение карты с двумя пересекающимися кругами

Solutions Collecting From Web of "Обработка перехода нескольких геообъектов с общей областью"

Вам нужно будет использовать класс для мониторинга вашего фехтования:

public class GeofenceReceiver extends BroadcastReceiver { Context context; Intent broadcastIntent = new Intent(); @Override public void onReceive(Context context, Intent intent) { this.context = context; broadcastIntent.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES); if (LocationClient.hasError(intent)) { handleError(intent); } else { handleEnterExit(intent); } } private void handleError(Intent intent){ // Get the error code int errorCode = LocationClient.getErrorCode(intent); // Get the error message String errorMessage = LocationServiceErrorMessages.getErrorString( context, errorCode); // Log the error Log.e(GeofenceUtils.APPTAG, context.getString(R.string.geofence_transition_error_detail, errorMessage)); // Set the action and error message for the broadcast intent broadcastIntent .setAction(GeofenceUtils.ACTION_GEOFENCE_ERROR) .putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, errorMessage); // Broadcast the error *locally* to other components in this app LocalBroadcastManager.getInstance(context).sendBroadcast( broadcastIntent); } private void handleEnterExit(Intent intent) { // Get the type of transition (entry or exit) int transition = LocationClient.getGeofenceTransition(intent); // Test that a valid transition was reported if ((transition == Geofence.GEOFENCE_TRANSITION_ENTER) || (transition == Geofence.GEOFENCE_TRANSITION_EXIT)) { // Post a notification List<Geofence> geofences = LocationClient .getTriggeringGeofences(intent); String[] geofenceIds = new String[geofences.size()]; String ids = TextUtils.join(GeofenceUtils.GEOFENCE_ID_DELIMITER, geofenceIds); String transitionType = GeofenceUtils .getTransitionString(transition); for (int index = 0; index < geofences.size(); index++) { Geofence geofence = geofences.get(index); ...do something with the geofence entry or exit. I'm saving them to a local sqlite db } // Create an Intent to broadcast to the app broadcastIntent .setAction(GeofenceUtils.ACTION_GEOFENCE_TRANSITION) .addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES) .putExtra(GeofenceUtils.EXTRA_GEOFENCE_ID, geofenceIds) .putExtra(GeofenceUtils.EXTRA_GEOFENCE_TRANSITION_TYPE, transitionType); LocalBroadcastManager.getInstance(MyApplication.getContext()) .sendBroadcast(broadcastIntent); // Log the transition type and a message Log.d(GeofenceUtils.APPTAG, transitionType + ": " + ids); Log.d(GeofenceUtils.APPTAG, context.getString(R.string.geofence_transition_notification_text)); // In debug mode, log the result Log.d(GeofenceUtils.APPTAG, "transition"); // An invalid transition was reported } else { // Always log as an error Log.e(GeofenceUtils.APPTAG, context.getString(R.string.geofence_transition_invalid_type, transition)); } } //Posts a notification in the notification bar when a transition private void sendNotification(String transitionType, String locationName) { // Create an explicit content Intent that starts the main Activity Intent notificationIntent = new Intent(context, MainActivity.class); // Construct a task stack TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); // Adds the main Activity to the task stack as the parent stackBuilder.addParentStack(MainActivity.class); // Push the content Intent onto the stack stackBuilder.addNextIntent(notificationIntent); // Get a PendingIntent containing the entire back stack PendingIntent notificationPendingIntent = stackBuilder .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); // Get a notification builder that's compatible with platform versions // >= 4 NotificationCompat.Builder builder = new NotificationCompat.Builder( context); // Set the notification contents builder.setSmallIcon(R.drawable.ic_notification) .setContentTitle(transitionType + ": " + locationName) .setContentText( context.getString(R.string.geofence_transition_notification_text)) .setContentIntent(notificationPendingIntent); // Get an instance of the Notification manager NotificationManager mNotificationManager = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); // Issue the notification mNotificationManager.notify(0, builder.build()); } 

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

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

Предполагая, что вы собираетесь вытащить многоугольник в виде некоторых точек Lat-Lon, вы можете сгенерировать сетку следующим образом:

 # Method to get the min and max values for the polygon def get_bounding_box(coords) # get max and min coords max = coords.inject({lat:0, lon:0}) do |max, c| max[:lon] = c[0] if c[0] > max[:lon] max[:lat] = c[1] if c[1] > max[:lat] max end min = coords.inject({lat:MAX_LAT, lon:MAX_LON}) do |min, c| min[:lon] = c[0] if c[0] < min[:lon] min[:lat] = c[1] if c[1] < min[:lat] min end # add a little padding to the max and min max.each {|k, v| max[k] += 1 } min.each {|k, v| min[k] -= 1 } {min: min, max: max} end def generate_grid(bounds) lon_range = bounds[:min][:lon]...bounds[:max][:lon] lat_range = bounds[:min][:lat]...bounds[:max][:lat] grid = [] lon_range.each do |lon| lat_range.each do |lat| grid << [lon + 0.25, lat + 0.25] grid << [lon + 0.25, lat + 0.75] grid << [lon + 0.75, lat + 0.25] grid << [lon + 0.75, lat + 0.75] end end grid end 

Такой подход позволяет достичь очень эффективного геообложения с помощью интеллектуальных сетей для мониторинга целевых областей:

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

Совсем недавно MongoDB также добавил поддержку Android , таким образом обеспечивая простой способ интеграции с Android-сервером. На самом деле, разработка геообъектов со смарт-распределенными данными, как ожидается, будет иметь все большее число приложений .

Это может быть альтернативой:

Все геообъекты имеют id; Я не уверен, что они должны быть уникальными, но для этого обсуждения предположим, что они должны быть уникальными. В примере с двумя примерами Geofence воспользуемся идентификаторами «fenceHome-1» и «fenceHome-2» для показанных, а третий – «someOther-1», который не показан.

Теперь то, что вы можете сделать, это создать переменную, в которой будет храниться текущий геозонс, в котором находится пользователь. В этом примере это будет строка с идентификатором geofence. Назовем это

 String currentGeofence = new String(); 

Когда пользователь вводит новую геозонность, вы можете проверить, совпадают ли значения geofenceIds.

  /** geofenceEntered get from the Intent. Should be "fenceHome-1" or "fenceHome-2" or "someOther=1" */ public void enteredGeoFence(String geofenceEntered) { // strip off the "-1" or "-2" geofenceEntered = geofenceEntered.stripOff(); if (currentGoofence.equals(geofenceEntered) == false} { // user entered a new geofence Ex: "SomeOther-1" to "fenceHome-1" sendNotification(geofenceEntered, .....); currentGeofence = geofencecEntered; } else { // user entered a geofence with in the same 'area'. Ex: "fenceHome-1" to "fenceHome-2" // do nothing } } 

Вот как я это сделаю. Сквозь всю эту математику слишком сложно. Просто установите умное соглашение об именах для идентификаторов геозонности. Ключ – это именование геообъектов .

В реальном мире currentGeofence должен быть Collection, поскольку пользователь может быть в нескольких геоформатах, и geofenceExit () должен был бы удалить из currentGeofence.

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

Очень схематично:

 boolean isTransition1, isTransition2, isTransition, insideCircle1, insideCircle2, insideUnion, insideUnionPrev; if (isTransition1 | isTransition2) { insideCircle1 = (dist(currPosition, centerCircle1) < radius1); insideCircle2 = (dist(currPosition, centerCircle2) < radius2); insideUnionPrev = insideUnion; insideUnion = insideCircle1 | insideCircle; isTransition = (insideUnion != insideUnionPrev); if (isTransition & insideUnion) println("Moved into region"); if (isTransition & !insideUnion) println("Moved out of region"); }