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.
![](https://developer.android.google.cn/static/images/training/geofence_2x.png?authuser=19&hl=de)
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:
-
ACCESS_FINE_LOCATION
-
ACCESS_BACKGROUND_LOCATION
Ihre App ist auf Android 10 (API-Level 29) oder höher ausgerichtet.
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
, um Geofences hinzuzufügen.
Geben Sie die Objekte GeofencingClient.addGeofences()
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