Autore Topic: Geofence inefficace  (Letto 847 volte)

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Geofence inefficace
« il: 16 Gennaio 2014, 10:46:21 CET »
0
Salve. Seguendo una guida sto cercando di definire una Geofence circolare con un certo raggio. Se si entra o si esce da questa zona
il telefono deve vibrare. Ecco beh, in realtà non accade proprio nulla! Oddio in realtà in un momento casuale ha vibrato ma non so
perché xD

Questo è il codice:

IntentService

Codice: [Seleziona]
public class GeofenceService extends IntentService {

    private static final String TAG_LOG = GeofenceService.class.getName();

    public GeofenceService() {
        super("GeofenceService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //Inizialmente cerchiamo un errore. Nel caso mostriamo un messaggio di errore
        if(LocationClient.hasError(intent)) {
            //Prendiamo il codice dell'errore
            final int errorCode = LocationClient.getErrorCode(intent);
            //Mostriamo il messaggio di errore
            Log.e(TAG_LOG, "Errore nel Geofence Service: " + Integer.toString(errorCode));
            Log.d(TAG_LOG, "Errore nel Geofence Service: " + Integer.toString(errorCode));
        }
        //Se tutto è corretto prendiamo le informazioni a proposito
        //del transactionId dell'evento
        else {
            final int transactionId = LocationClient.getGeofenceTransition(intent);
            if(transactionId == Geofence.GEOFENCE_TRANSITION_ENTER ||
                    transactionId == Geofence.GEOFENCE_TRANSITION_EXIT) {
                List<Geofence> geofences = LocationClient.getTriggeringGeofences(intent);
                for(Geofence geofence : geofences) {
                    Log.d(TAG_LOG, "Geofence: " + geofence.getRequestId());
                    Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
                    v.vibrate(500);
                }
            }
            else {
                Log.d(TAG_LOG, "No transactionId into the received Intent");
            }
        }
    }
}

Altra roba nella main activity

Codice: [Seleziona]
private List<Geofence> mCurrentGeofences;        //Lista di Geofence
    private Circle mCurrentCircle;                   //Area circolare utilizzata per individuare una Geofence

public void onMapClick(LatLng latLng) {
        //Rimozione della Geofence
        if (mCurrentCircle != null) {
            //Calcoliamo la distanza dal centro del cerchio al punto cliccato
            final LatLng centerPoint = mCurrentCircle.getCenter();
            final LatLng clickedPoint = latLng;
            final double distance = getDistance(centerPoint, clickedPoint);
            if (distance < mCurrentCircle.getRadius()) {
                //Rimuoviamo il cerchio
                mCurrentCircle.remove();
                mCurrentCircle = null;
                //Rimuoviamo la Geofence
                final String[] geoFenceToRemove = new String[]{GEOFENCE_REQUEST_ID};
                mLocationClient.removeGeofences(Arrays.asList(geoFenceToRemove), mOnRemoveGeofencesResultListener);
            }
        }
    }
//Aggiunge una geofence nel punto cliccato
    public void onMapLongClick(LatLng latLng) {
        //Se esiste già un altro cerchio lo rimuoviamo
        if (mCurrentCircle != null) {
            mCurrentCircle.remove();
            mCurrentGeofences.clear();
            //Rimuoviamo la Geofence
            final String[] geoFenceToRemove = new String[]{GEOFENCE_REQUEST_ID};
            mLocationClient.removeGeofences(Arrays.asList(geoFenceToRemove), mOnRemoveGeofencesResultListener);
        }
        //Creiamo un nuovo cerchio
        final CircleOptions circleOptions = new CircleOptions()
                .center(latLng)
                .radius(DEFAULT_RADIUS)
                .strokeColor(Color.BLUE)
                .strokeWidth(2.0f)
                .fillColor(Color.parseColor("#66FF0000"));
        mCurrentCircle = mGoogleMap.addCircle(circleOptions);
        //Creo una geofence nel punto cliccato con raggio di default (10 m)
        //che permane nel tempo (Geofence.NEVER_EXPIRE).
        //Siamo interessati sia ad un evento di ingresso che di uscita:
        //Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT.
        Geofence.Builder fenceBuilder = new Geofence.Builder()
                .setCircularRegion(latLng.latitude, latLng.longitude, DEFAULT_RADIUS)
                .setExpirationDuration(Geofence.NEVER_EXPIRE)
                .setRequestId(GEOFENCE_REQUEST_ID)
                .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT);
        //Creo il PendingIntent da lanciare quando avviene l'evento
        final Intent fenceIntent = new Intent(getApplicationContext(), GeofenceService.class);
        final PendingIntent fencePendingIntent = PendingIntent.getService(getApplicationContext(), 0, fenceIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mCurrentGeofences.add(fenceBuilder.build());
        //Aggiungo il Geofence al LocationManager
        mLocationClient.addGeofences(mCurrentGeofences, fencePendingIntent,
                mOnAddGeofencesResultListener);
    }

    //Interfaccia da implementare per gestire le Geofence (Implementazione vuota)
    private LocationClient.OnAddGeofencesResultListener mOnAddGeofencesResultListener = new LocationClient.OnAddGeofencesResultListener() {

        @Override
        public void onAddGeofencesResult(int statusCode, String[] geofenceRequestIds) {
            if (LocationStatusCodes.SUCCESS == statusCode) {
                //Il servizio per la Geofence è partito correttamente
                Log.d(TAG_LOG, "Geofence ok");
            } else {
                //Errore nella gestione delle Geofence
                Log.d(TAG_LOG, "Geofence error");
            }
        }
    };

    //Interfaccia da implementare per la rimozione di una geofence (Implementazione vuota)
    private LocationClient.OnRemoveGeofencesResultListener mOnRemoveGeofencesResultListener =
        new LocationClient.OnRemoveGeofencesResultListener() {
            @Override
            public void onRemoveGeofencesByRequestIdsResult(int i, String[] strings) {
                Log.d(TAG_LOG, "Geofence removed");
            }

            @Override
            public void onRemoveGeofencesByPendingIntentResult(int i, PendingIntent pendingIntent) {
                Log.d(TAG_LOG, "Geofence removed");
            }
    };

Geofence ok e Geofence removed vengono stampati, però se entro od esco dalla zona non accade una cippa :(

Post unito: 16 Gennaio 2014, 10:55:56 CET
Ah ho aggiunto anche queste righe al manifest:

Codice: [Seleziona]
<uses-permission android:name="android.permission.VIBRATE"/>
<service android:name=".GeofenceService"/>

E tutti i permessi per internet, gps.. ecc..
« Ultima modifica: 16 Gennaio 2014, 10:55:56 CET da Elmvor, Reason: Merged DoublePost »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Geofence inefficace
« Risposta #1 il: 16 Gennaio 2014, 13:39:22 CET »
0
quant'è il raggio di geofence?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Geofence inefficace
« Risposta #2 il: 16 Gennaio 2014, 13:46:04 CET »
0
10 metri.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Geofence inefficace
« Risposta #3 il: 16 Gennaio 2014, 13:55:06 CET »
0
10 metri.

10 metri con le inaccuratezze del GPS potresti non entrarci mai, anche se fisicamente ci sei seduto sopra.

Per provare, metti 100 metri e vedi come va.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Geofence inefficace
« Risposta #4 il: 16 Gennaio 2014, 13:56:44 CET »
0
Farò una prova. Anche se a guardar la mappa il pallino azzurro ci entra dentro..

Post unito: 16 Gennaio 2014, 14:05:37 CET
Ho creato la geofence sopra la mia posizione ed in effetti ha vibrato  :-o Farò delle prove con raggi più piccoli perché 100 metri è un po
troppo per il mio scopo. Grazie  ;-)
« Ultima modifica: 16 Gennaio 2014, 14:05:37 CET da Elmvor, Reason: Merged DoublePost »