Gestione di transizioni geofene multiple con area comune

Se ho queste due geofene, dopo aver registrato queste geofene, dovrò essere avvisato quando entrerò o uscendo dalla circonferenza di questi cerchi. Tuttavia, non voglio che la mia app invii una notifica se sto passando attraverso l'area comune, cioè da un cerchio all'altro.

È ansible? Se è così, allora come?

  • Ottieni la posizione del touch all'interno dell'image in android
  • Android - Qualsiasi cosa simile al Call Delegato di SDK di iPhone?
  • Errore di puntatore null con hideSoftInputFromWindow
  • Se utilizzo una nuova libreria "V7 Appcompat", ho ancora bisogno di "V4 Support Library" per un minimo SDK = 7?
  • Sbarazzarsi del gradiente in cima ad un'attività (Android)
  • come get la data da millisecondi in android
  • Immagine della mappa con due cerchi intersecanti

  • Rimuovere un cerchio dall'API API Google Maps API v2 senza eliminare la mappa
  • è giusto creare l'assistente di database ORMLite nella class Application?
  • API di ricerche di immagini inversa di Google
  • C'è qualche modo di chiedere authorization a livello di programma?
  • Cancellazione e impostazione dell'applicazione home di default
  • Deselect il metodo alternativo di RadioButton
  • 3 Solutions collect form web for “Gestione di transizioni geofene multiple con area comune”

    Dovrai usare una class per controllare la tua scherma:

    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()); } 

    Dovresti creare ascoltatori per ognuna delle aree che desideri monitorare, diciamo listener1 e listenener2. Per ottimizzare entrambe le aree e integrarla, l'approccio migliore è quello di creare una griglia utilizzando MongoDB, che in tal caso consente anche di integrare più di due punti in quanto si crea una griglia.

    immettere qui la descrizione dell'immagine

    Supponendo che si sta per uscire da un poligono sotto forma di alcuni punti Lat-Lon, è ansible generare una griglia come il seguente:

     # 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 

    Tale approccio consente di realizzare una geofisica molto efficiente con smart grids per il monitoraggio delle aree target:

    immettere qui la descrizione dell'immagine

    Più recentemente MongoDB ha anche aggiunto il supporto per Android , fornendo così un modo semplice per l'integrazione back-end di Android App. Infatti lo sviluppo geofisso con dati intelligenti distribuiti dovrebbe avere un numero crescente di applicazioni .

    Questa può essere un'alternativa:

    Tutte le geofene hanno un id; Non sono sicuro che hanno bisogno di essere unici, ma per questa discussione diciamo che devono essere unici. Nel tuo esempio di geofence usiamo ids "fenceHome-1" e "fenceHome-2" per quelli mostrati e un terzo chiamato "someOther-1" che non è mostrato.

    Adesso ciò che puoi fare è creare una variabile per memorizzare la geofence corrente in cui l'utente è presente. In questo esempio sarà una string con l'ID geofence. Chiamiamolo

     String currentGeofence = new String(); 

    Quando l'utente inserisce una nuova geofence, è ora ansible verificare se le geofenceIds sono le stesse.

      /** 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 } } 

    Ecco come farlo. La sfrenata con tutta quella math è troppo difficile. Basta impostare una convenzione di nomi di nomi per geofence ids. La chiave è la denominazione delle geofene .

    Nel mondo reale, la GeoFence dovrebbe essere una collezione in quanto l'utente può essere in geofensi multipli e la geofenceExit () dovrà rimuovere dalla currentGeofence.

    Un'altra cosa da ricordare del gestore di notifica di Android è: se invii la stessa notifica due volte, invierà solo una notifica. Questo potrebbe essere utilizzato a vostro vantaggio.

    molto schematicamente:

     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"); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.