Geofences erstellen und überwachen

Geofencing kombiniert die Wahrnehmung des aktuellen Standorts des Nutzers mit der Wahrnehmung der Nähe zu Orten, die von Interesse sein könnten. So markieren Sie Ort von Interesse, geben Sie den Breiten- und Längengrad an. Um die Entfernung für den Standort hinzufügen, fügen Sie einen Umkreis hinzu. Breitengrad, Längengrad und Radius definieren einen Geofence, kreisförmiger Fläche oder Zaun um den betreffenden Ort herum.

Sie können mehrere aktive Geofences mit maximal 100 Geofences pro App und Gerätenutzer haben. Für jede können Sie die Standortdienste bitten, Ihnen Eingangs- und Ausstiegsereignisse zu senden. Sie können aber auch Ein Verweildauer bzw. eine Wartezeit im Geofence-Bereich, bevor ein Ereignis ausgelöst wird. Ich kann die Dauer eines Geofence durch Angabe einer Ablaufzeit in Millisekunden begrenzen. Danach wird er von den Standortdiensten automatisch entfernt.

In dieser Lektion erfahren Sie, wie Sie Geofences hinzufügen und entfernen und wie Sie Geofence-Übergänge erkennen. mit BroadcastReceiver.

Hinweis:Auf Wear-Geräten nutzen die Geofencing APIs nicht effizient Energie. Wir raten von diesen APIs für Wear ab. Gelesen Weitere Informationen zur Schonung des Akkus und zur Energieeinsparung

Für Geofence-Monitoring einrichten

Der erste Schritt beim Anfordern von Geofencing-Monitoring besteht darin, Berechtigungen. Damit Sie Geofencing verwenden können, muss Ihre App Folgendes anfordern:

Weitere Informationen finden Sie im Leitfaden zur Berechtigungen zur Standortermittlung anfordern

Wenn Sie eine BroadcastReceiver verwenden möchten, um Geofence-Übergänge zu überwachen, Fügen Sie ein Element hinzu, das den Dienstnamen angibt. Dieses Element muss Ein untergeordnetes Element des <application>-Elements:

<application
   android:allowBackup="true">
   ...
   <receiver android:name=".GeofenceBroadcastReceiver"/>
<application/>

Für den Zugriff auf die Standort-APIs müssen Sie eine Instanz der Geofencing-Kunde So verbinden Sie Ihren Client:

Kotlin

lateinit var geofencingClient: GeofencingClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this)
}

Java

private GeofencingClient geofencingClient;

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this);
}

Geofences erstellen und hinzufügen

Ihre App muss Geofences mithilfe der Builder-Klasse der Location API für Erstellen von Geofence-Objekten und die Convenience-Klasse für das Hinzufügen dieser Objekte. Für die Verarbeitung der Intents, die von Standortdiensten bei Geofence-Übergängen gesendet werden, können Sie PendingIntent, wie in diesem Abschnitt gezeigt.

Hinweis:Auf Einzelnutzergeräten gilt ein Limit von 100 Geofences pro App. Für Geräte mit mehreren Nutzern sind 100 Geofences pro App und Gerätenutzer zulässig.

Geofence-Objekte erstellen

Erstellen Sie zuerst mit Geofence.Builder einen Geofence und legen Sie den gewünschten Radius, die Dauer und für den Geofence. So füllen Sie beispielsweise ein Listenobjekt:

Kotlin

geofenceList.add(Geofence.Builder()
        // Set the request ID of the geofence. This is a string to identify this
        // geofence.
        .setRequestId(entry.key)

        // Set the circular region of this geofence.
        .setCircularRegion(
                entry.value.latitude,
                entry.value.longitude,
                Constants.GEOFENCE_RADIUS_IN_METERS
        )

        // Set the expiration duration of the geofence. This geofence gets automatically
        // removed after this period of time.
        .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)

        // Set the transition types of interest. Alerts are only generated for these
        // transition. We track entry and exit transitions in this sample.
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)

        // Create the geofence.
        .build())

Java

geofenceList.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());

In diesem Beispiel werden Daten aus einer Konstantendatei abgerufen. In der Praxis können Apps basierend auf dem Standort des Nutzers dynamisch Geofences erstellen.

Geofences und anfängliche Trigger angeben

Im folgenden Snippet wird die Klasse GeofencingRequest verwendet. und der verschachtelten GeofencingRequestBuilder-Klasse Geben Sie die zu überwachenden Geofences an und legen Sie fest, wie verwandte Geofence-Ereignisse ausgelöst werden:

Kotlin

private fun getGeofencingRequest(): GeofencingRequest {
    return GeofencingRequest.Builder().apply {
        setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
        addGeofences(geofenceList)
    }.build()
}

Java

private GeofencingRequest getGeofencingRequest() {
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
    builder.addGeofences(geofenceList);
    return builder.build();
}

Dieses Beispiel zeigt die Verwendung von zwei Geofence-Triggern. Das GEOFENCE_TRANSITION_ENTER Der Übergang wird ausgelöst, wenn ein Gerät in einen Geofence übergeht, und der GEOFENCE_TRANSITION_EXIT wird ausgelöst, wenn ein Gerät einen Geofence verlässt. Angabe INITIAL_TRIGGER_ENTER teilt den Standortdiensten mit, GEOFENCE_TRANSITION_ENTER sollte ausgelöst werden, wenn sich das Gerät bereits innerhalb des Geofence befindet.

In vielen Fällen empfiehlt es sich, stattdessen INITIAL_TRIGGER_DWELL, Dadurch werden nur dann Ereignisse ausgelöst, wenn der Nutzer für eine festgelegte Dauer innerhalb eines Geofence anhält. Dieser Ansatz kann dazu beitragen, „Benachrichtigungs-Spam“ zu reduzieren die sich aufgrund einer hohen Anzahl an Benachrichtigungen die Geofences kurzzeitig betreten und verlassen. Eine weitere Strategie zur Erzielung der besten Ergebnisse für Geofencings einen Mindestradius von 100 Metern. Dadurch wird die Standortgenauigkeit berücksichtigt, und trägt dazu bei, den Stromverbrauch der Geräte zu senken.

Übertragungsempfänger für Geofence-Übergänge definieren

Eine Intent, die von den Standortdiensten gesendet wird, kann verschiedene Aktionen auslösen in: Ihrer App an. Sie sollten jedoch keine Aktivität oder Fragmentierung starten, da Komponenten nur als Reaktion auf eine Nutzeraktion sichtbar werden sollen. In vielen Fällen ist ein BroadcastReceiver eine gute Möglichkeit, einen Geofence-Übergang zu verarbeiten. A BroadcastReceiver wird benachrichtigt, wenn ein Ereignis eintritt, z. B. den Wechsel in einen oder aus einem Geofence und kann einen lang andauernden Hintergrund verwenden, arbeiten.

Das folgende Snippet zeigt, zum Definieren eines PendingIntent-Objekts, das einen BroadcastReceiver startet:

Kotlin

class MainActivity : AppCompatActivity() {

    // ...

    private val geofencePendingIntent: PendingIntent by lazy {
        val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
}

Java

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (geofencePendingIntent != null) {
            return geofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        return geofencePendingIntent;
    }

Geofences hinzufügen

Verwenden Sie die Methode GeofencingClient.addGeofences(), um Geofences hinzuzufügen. Geben Sie die Objekte GeofencingRequest und PendingIntent an. Das folgende Snippet veranschaulicht die Verarbeitung der Ergebnisse:

Kotlin

geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences added
        // ...
    }
    addOnFailureListener {
        // Failed to add geofences
        // ...
    }
}

Java

geofencingClient.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
                // ...
            }
        });

Geofence-Übergänge verarbeiten

Wenn die Standortdienste erkennen, dass der Nutzer einen Geofence betreten oder verlassen hat, sendet das Intent in der PendingIntent die Sie in die Anfrage zum Hinzufügen von Geofences aufgenommen haben. Ein Übertragungsempfänger wie GeofenceBroadcastReceiver bemerkt, dass Intent aufgerufen wurde und kann dann das Geofencing-Ereignis aus dem Intent abrufen, die Art der Geofence-Übergänge bestimmen, und ermitteln, welcher der definierten Geofences ausgelöst wurde. Die Übertragung Empfänger einer App anweisen können, mit der Ausführung von Aufgaben im Hintergrund zu beginnen. eine Benachrichtigung als Ausgabe senden.

Hinweis:Wenn eine App unter Android 8.0 (API-Level 26) und höher im Hintergrund ausgeführt wird, während ein Geofence überwacht wird, auf Geofencing-Ereignisse alle paar Minuten reagiert. Um zu erfahren, wie Sie Ihrer App diese Antwortlimits einhalten, finden Sie unter Hintergrund Standortbeschränkungen.

Das folgende Snippet zeigt, wie ein BroadcastReceiver die bei einem Geofence-Übergang eine Benachrichtigung sendet. Wenn Nutzende auf die Benachrichtigung klickt, wird die Hauptaktivität der App angezeigt:

Kotlin

class GeofenceBroadcastReceiver : BroadcastReceiver() {
    // ...
    override fun onReceive(context: Context?, intent: Intent?) {
        val geofencingEvent = GeofencingEvent.fromIntent(intent)
        if (geofencingEvent.hasError()) {
            val errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(geofencingEvent.errorCode)
            Log.e(TAG, errorMessage)
            return
        }

        // Get the transition type.
        val geofenceTransition = geofencingEvent.geofenceTransition

        // 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.
            val triggeringGeofences = geofencingEvent.triggeringGeofences

            // Get the transition details as a String.
            val 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))
        }
    }
}

Java

public class GeofenceBroadcastReceiver extends BroadcastReceiver {
    // ...
    protected void onReceive(Context context, Intent intent) {
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if (geofencingEvent.hasError()) {
            String errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(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));
        }
    }
}

Nachdem das Übergangsereignis über PendingIntent erkannt wurde, BroadcastReceiver erhält den Geofence-Übergangstyp und prüft, ob es eines der Ereignisse ist, die die App zum Auslösen verwendet Benachrichtigungen entweder GEOFENCE_TRANSITION_ENTER oder GEOFENCE_TRANSITION_EXIT in diesem Fall. Der Dienst sendet dann eine Benachrichtigung und protokolliert die Details zur Umstellung.

Geofence-Monitoring beenden

Durch das Beenden der Geofencing-Überwachung, wenn sie nicht mehr benötigt oder erwünscht ist, kann der Akku geschont werden. die Stromversorgung und CPU-Zyklen des Geräts. Sie können das Geofence-Monitoring beenden in der Hauptaktivität zum Hinzufügen und Entfernen von Geofences; Durch das Entfernen eines Geofence wird dieser gestoppt sofort. Die API bietet Methoden zur Entfernen von Geofences entweder durch Anfrage-IDs oder durch Entfernen von Geofences, die mit einer bestimmten PendingIntent

Das folgende Snippet entfernt Geofences durch PendingIntent und stoppt alle eine weitere Benachrichtigung, wenn das Gerät zuvor hinzugefügte Geofences erreicht oder verlässt:

Kotlin

geofencingClient?.removeGeofences(geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences removed
        // ...
    }
    addOnFailureListener {
        // Failed to remove geofences
        // ...
    }
}

Java

geofencingClient.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
                // ...
            }
        });

Sie können Geofencing mit anderen standortbezogenen Funktionen kombinieren, z. B. mit regelmäßigen Standortupdates. Weitere Informationen findest du in den anderen Lektionen dieses Kurses.

Best Practices für Geofencing

In diesem Abschnitt finden Sie Empfehlungen zur Verwendung von Geofencing mit dem Standort. APIs für Android

Stromverbrauch reduzieren

Mit den folgenden Methoden können Sie den Stromverbrauch in Apps mit Geofencing optimieren:

  • Legen Sie fest. die Reaktionszeit von Benachrichtigungen auf einen höheren Wert. Dadurch wird der Stromverbrauch um die Latenz von Geofencing-Benachrichtigungen erhöht. Wenn Sie beispielsweise für die Reaktionsfähigkeit -Minuten, sucht Ihre App nur alle fünf Minuten nach Eingangs- oder Ausgangsbenachrichtigungen. Niedrigere Werte bedeuten nicht unbedingt, dass Nutzer innerhalb dieses Zeitraums benachrichtigt werden. Wenn Sie beispielsweise einen Wert von 5 Sekunden festlegen, kann es etwas länger dauern, bis der Benachrichtigung).

  • Verwenden Sie für Standorte, an denen Nutzer viel Zeit verbringen, einen größeren Geofence-Radius. wie "Zuhause" oder "Arbeit". Ein größerer Umkreis reduziert den Stromverbrauch zwar nicht direkt, Die Häufigkeit, mit der die App den Eingang oder das Verlassen prüft, wodurch die Gesamtleistung reduziert wird konsumiert wird.

Optimalen Radius für Ihren Geofence auswählen

Die besten Ergebnisse erzielen Sie, wenn der Mindestradius des Geofence zwischen 100 und 150 Metern liegt. Wenn WLAN verfügbar ist, liegt die Standortgenauigkeit in der Regel zwischen 20 und 50 Metern. In Innenräumen Standort verfügbar ist, kann die Genauigkeit bis zu fünf Meter betragen. Außer in Innenräumen Standort innerhalb des Geofence verfügbar ist, nehmen wir an, dass die WLAN-Standortgenauigkeit 50 Meter.

Wenn die WLAN-Standortermittlung nicht verfügbar ist, z. B. beim Fahren in ländlicher Umgebung, verschlechtert sich. Der Genauigkeitsbereich kann zwischen mehreren Hundert Metern mehrere Kilometer. In solchen Fällen sollten Sie Geofences mit einem größeren Radius erstellen.

Nutzern erklären, warum in Ihrer App Geofencing verwendet wird

Da Ihre App bei Verwendung von Geofencing im Hintergrund auf den Standort zugreift, welche Vorteile Ihre App den Nutzenden bietet. Erläutern Sie klar, warum Ihre App benötigt diesen Zugriff, um das Verständnis der Nutzer zu verbessern und die Transparenz zu erhöhen.

Weitere Informationen zu Best Practices für den Standortzugriff einschließlich Geofencing, finden Sie hier .

Verwenden Sie den Übergangstyp für die Verweildauer, um Warnmeldungen-Spam zu reduzieren

Wenn Sie beim Durchfahren eines Geofence sehr viele Warnungen erhalten, ist es am besten, zur Reduzierung der Benachrichtigungen ist die Verwendung des Übergangstyps GEOFENCE_TRANSITION_DWELL anstelle von GEOFENCE_TRANSITION_ENTER. Auf diese Weise wird die Wohnungswarnung nur gesendet, wenn der Nutzer die Wohnung aufhält. innerhalb eines Geofence. Sie können die Dauer festlegen, indem Sie eine <ph type="x-smartling-placeholder"></ph> Loitering-Verzögerung.

Geofences nur bei Bedarf neu registrieren

Registrierte Geofences werden im com.google.process.location-Prozess beibehalten, der Eigentum von com.google.android.gms-Paket. Die App muss nichts weiter tun, um die folgenden Ereignisse zu verarbeiten, weil das System stellt Geofences nach folgenden Ereignissen wieder her:

  • Die Google Play-Dienste wurden aktualisiert.
  • Google Play-Dienste werden aufgrund von Ressourceneinschränkungen vom System beendet und neu gestartet.
  • Der Standortprozess stürzt ab.

Die Anwendung muss Geofences neu registrieren, wenn sie nach den folgenden Ereignissen immer noch benötigt werden. In den folgenden Fällen kann das System die Geofences nicht wiederherstellen:

  • Das Gerät wird neu gestartet. Die App sollte auf den Abschluss des Startvorgangs des Geräts warten und dann noch einmal die erforderlichen Geofences zu registrieren.
  • Die App wird deinstalliert und neu installiert.
  • Die App-Daten werden gelöscht.
  • Die Daten der Google Play-Dienste werden gelöscht.
  • Die App hat ein GEOFENCE_NOT_AVAILABLE erhalten Benachrichtigung. Dies geschieht in der Regel nachdem NLP, der Network Location Provider von Android, deaktiviert wurde.

Fehler beim Geofence-Einstiegsereignis beheben

Wenn keine Geofences ausgelöst werden, wenn das Gerät in einen Geofence eintritt (Die GEOFENCE_TRANSITION_ENTER-Benachrichtigung wird nicht ausgelöst). Vergewissern Sie sich zuerst, dass Ihre Geofences wie in diesem Leitfaden beschrieben ordnungsgemäß registriert.

Wenn Benachrichtigungen nicht wie erwartet funktionieren, kann das folgende Gründe haben:

  • Der genaue Standort ist innerhalb Ihres Geofence nicht verfügbar oder zu Ihrem Geofence klein. Auf den meisten Geräten verwendet der Geofence-Dienst nur den Netzwerkstandort für Geofence Auslöser. Der Dienst verwendet diesen Ansatz, da der Netzwerkstandort viel weniger Energie verbraucht. ist die Standortermittlung auch in Innenräumen erforderlich.
  • WLAN ist auf dem Gerät deaktiviert. Mit aktiviertem WLAN kann die Funktion Die Standortgenauigkeit. Wenn WLAN deaktiviert ist, erhält Ihre Anwendung möglicherweise keine Geofence-Benachrichtigungen. von verschiedenen Einstellungen wie dem Radius des Geofence, des Gerätemodells Android-Version Ab Android 4.3 (API-Level 18) haben wir die Funktion „WLAN-Scan aktiviert, in dem das WLAN deaktiviert und der Netzwerkstandort trotzdem gut ermittelt werden kann. Gut Üben Sie, den Nutzer aufzufordern und ihm eine Verknüpfung zu geben, damit er nur die WLAN- oder WLAN-Funktion aktivieren kann. wenn beide deaktiviert sind. verwenden SettingsClient, um sicherzustellen, dass die Systemeinstellungen des Geräts richtig konfiguriert sind. Standorterkennung.

    Hinweis : Wenn Ihre App auf Android 10 (API-Level 29) oder höher können Sie WifiManager.setEnabled() nur dann direkt anrufen, Deine App ist eine System-App oder eine Geräterichtlinie. Controller (DPC). Verwenden Sie stattdessen eine Einstellungen.

  • Innerhalb Ihres Geofence gibt es keine zuverlässige Netzwerkverbindung. Wenn es keine zuverlässige Datenverbindung vorhanden ist, werden möglicherweise keine Benachrichtigungen generiert. Das liegt daran, dass der Geofencing-Dienst hängt vom Netzwerkstandortanbieter ab, der wiederum eine Datenverbindung erfordert.
  • Benachrichtigungen können sich verspäten. Der Geofence-Dienst fragt nicht ständig nach Standort. Daher ist mit einer gewissen Verzögerung beim Empfang von Benachrichtigungen zu rechnen. In der Regel beträgt die Latenz weniger als 2 Minuten und sogar noch kürzer, wenn das Gerät in Bewegung ist. Wenn Hintergrund Standortbeschränkungen gelten, beträgt die Latenz im Durchschnitt etwa 2 bis 3 Minuten. Wenn das Gerät längere Zeit nicht aktiv war, erhöht sich die Latenz kann ansteigen (bis zu 6 Minuten).

Weitere Informationen

Weitere Informationen zu Geofencing finden Sie in den folgenden Materialien:

Produktproben

<ph type="x-smartling-placeholder"></ph> Beispielanwendung zum Erstellen und Überwachen von Geofences