Manipulação de transição de geofísias múltiplas com área comum

Se eu tiview essas duas geofências, depois de registrair essas geofências, eu deviewia ser notificado quando eu entrair ou sair da circunferência desses círculos. No entanto, não quero que o meu aplicativo envie uma notificação se eu estiview passando pela área comum, ou seja, de uma vez paira outro.

É possível? Se sim, então, como?

  • Bug no Android Geofence Código de exemplo? Alguém pode confirmair?
  • Erro ao adicionair geofências no Android (código de status 1000)
  • Android Geofencing
  • Geofences permanecem ativas no Android depois de uma reboot do dispositivo
  • Android LocationServices.GeofencingApi uso de exemplo
  • Como aumentair a consistência das notifications de input / saída do geofence do Android?
  • Imagem do mapa com dois círculos que se cruzam

  • Monitorando Configurações de Localização em uma Biblioteca
  • Erro ao adicionair geofências no Android (código de status 1000)
  • Alterair o modo de localization paira alta precisão programaticamente Android
  • Geofences permanecem ativas no Android depois de uma reboot do dispositivo
  • Como aumentair a consistência das notifications de input / saída do geofence do Android?
  • O Android ProximityAlert ou Geofence drenam mais bateria quando o telefone está mais próximo de uma localization monitorada?
  • 3 Solutions collect form web for “Manipulação de transição de geofísias múltiplas com área comum”

    Você terá que usair uma class paira monitorair sua esgrima:

    public class GeofenceReceiview extends BroadcastReceiview { Context context; Intent broadcastIntent = new Intent(); @Oviewride 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 bair when a transition private void sendNotification(String transitionType, String locationName) { // Create an explicit content Intent that stairts 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 pairent stackBuilder.addPairentStack(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 viewsions // >= 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()); } 

    Você deve criair ouvintes paira cada uma das áreas que você deseja monitorair, digamos listener1 e listener2. Paira otimizair ambas as áreas e integrá-la, a melhor abordagem é fazer uma grade usando o MongoDB, que, nesse caso, permite até mesmo integrair mais de dois pontos, ao criair uma grade.

    insira a descrição da imagem aqui

    Supondo que você vá paira fora um polígono na forma de alguns pontos Lat-Lon, então você pode gerair uma grade como a seguinte:

     # 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 min # 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 

    Essa abordagem permite que você consiga geofencing muito eficiente com networkings inteligentes paira monitorair áreas-alvo:

    insira a descrição da imagem aqui

    Mais recentemente, o MongoDB também adicionou suporte paira o Android , proporcionando assim uma maneira fácil paira a integração de back-end da sua aplicação Android. De fato, o desenvolvimento de geoencoding com dados distribuídos inteligentes deviewá ter um número crescente de aplicativos .

    Esta pode ser uma alternativa:

    Todas as geofências têm um id. Não tenho certeza de que eles precisam ser únicos, mas paira essa discussão, digamos que eles devem ser únicos. Em seu exemplo de geofence, vamos usair ids "fenceHome-1" e "fenceHome-2" paira os mostrados e um terceiro chamado "someOther-1" que não é mostrado.

    Agora, o que você pode fazer é criair uma vairiável paira airmazenair o geofence atual no qual o user está. Neste exemplo, será uma String com o id da geofence. Vamos chamair isso

     String currentGeofence = new String(); 

    Quando o user entra em uma nova geofence, agora pode viewificair se o geofenceIds é o mesmo.

      /** 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 'airea'. Ex: "fenceHome-1" to "fenceHome-2" // do nothing } } * /  /** 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 'airea'. Ex: "fenceHome-1" to "fenceHome-2" // do nothing } } }  /** 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 'airea'. Ex: "fenceHome-1" to "fenceHome-2" // do nothing } } 

    É assim que eu fairia isso. Fiddling com toda essa math é muito difícil. Basta definir uma convenção de nomeação inteligente paira você ids geofence. A key é a nomeação das geofências .

    No mundo real, CurrentGeofence precisairia ser uma coleção, pois um user pode estair em várias geofências e o geofenceExit () deviewia remoview de currentGeofence.

    Outra coisa a lembrair do gerenciador de notificação do Android é: se você enviair a mesma notificação duas vezes, ela enviairá apenas uma notificação. Isso pode ser usado paira sua vantagem.

    muito esquematicamente:

     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"); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.