Coğrafi sınır çizme, kullanıcının mevcut konumu ile kullanıcının bulunduğu konum hakkındaki farkındalığı birleştirir. İlginizi çekebilecek konuma yakınlık. Bir enlem ve boylam bilgisini belirtirsiniz. İşletmenin yakınlığını ayarlamak için bir yarıçap eklersiniz. Enlem, boylam ve yarıçap bir coğrafi sınır tanımlar ve bir dairesel alan veya bir çitlik gösterebilirsiniz.
Etkin durumdaki birden fazla coğrafi sınır olabilir. Bunlar cihaz kullanıcısı başına uygulama başına en fazla 100 olabilir. Her bir coğrafi sınır varsa, Konum Hizmetleri'nden size giriş ve çıkış etkinlikleri göndermesini isteyebilir veya coğrafi sınır dahilinde bir etkinlik tetiklemeden önce beklenecek veya beklemede tutulacak bir süre. Siz milisaniye cinsinden bir süre sonu belirterek coğrafi sınırların süresini sınırlayabilir. Coğrafi sınır sona erdikten sonra Konum Hizmetleri bunu otomatik olarak kaldırır.
![](https://developer.android.com/static/images/training/geofence_2x.png?authuser=19&hl=tr)
Bu derste, coğrafi sınırların nasıl ekleneceği ve kaldırılacağı ve ardından coğrafi sınır geçişlerinin nasıl kullanılacağı gösterilmektedir
BroadcastReceiver
kullanarak.
Not: Wear cihazlarda Coğrafi Sınırlama API'leri güç. Bu API'ler Wear'da önerilmez. Okunanlar Daha fazla bilgi için güç ve pil tasarrufu yapın.
Coğrafi sınır izleme için kurulum
Coğrafi sınır izleme isteğinde bulunmanın ilk adımı, izin verir. Coğrafi sınır çizmeyi kullanmak için uygulamanızın aşağıdakileri istemesi gerekir:
-
ACCESS_FINE_LOCATION
-
ACCESS_BACKGROUND_LOCATION
. Uygulamanız Android 10 (API düzeyi 29) veya sonraki sürümleri hedefliyorsa
Daha fazla bilgi edinmek için konum izni isteme.
Coğrafi sınır geçişlerini dinlemek için bir BroadcastReceiver
kullanmak isterseniz
hizmet adını belirten bir öğe ekleyin. Bu öğe
<application>
öğesinin bir alt öğesi:
<application android:allowBackup="true"> ... <receiver android:name=".GeofenceBroadcastReceiver"/> <application/>
Konum API'lerine erişmek için Coğrafi sınır çizme istemcisi. İstemcinizi nasıl bağlayacağınızı öğrenmek için:
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); }
Coğrafi sınırlar oluşturma ve ekleme
Uygulamanızın, konum API'sinin derleyici sınıfını kullanarak coğrafi sınırlar oluşturup eklemesi gerekiyor
ve bunların eklenmesine ilişkin kolaylık sınıfı hakkında bilgi edineceksiniz. Ayrıca,
coğrafi sınır geçişleri gerçekleştiğinde Konum Hizmetleri'nden gönderilen intent'ler, bir
PendingIntent
olarak görünür.
Not: Tek kullanıcılı cihazlarda uygulama başına 100 coğrafi sınır sınırı vardır. Çok kullanıcılı cihazlarda sınır, cihaz kullanıcısı başına uygulama başına 100 coğrafi sınırdır.
Coğrafi sınır nesneleri oluşturma
Öncelikle, coğrafi sınır oluşturmak için
Geofence.Builder
kullanarak istediğiniz yarıçapı, süreyi ve
geçiş türlerini inceleyeceğiz. Örneğin, bir liste nesnesini doldurmak için:
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());
Bu örnek, bir sabit değer dosyasından veri çeker. Uygulamalar aslında kullanıcının konumuna göre dinamik olarak coğrafi sınırlar oluşturabilir.
Coğrafi sınırları ve ilk tetikleyicileri belirtin
Aşağıdaki snippet
GeofencingRequest
sınıfını kullanmaktadır
ve iç içe yerleştirilmiş
GeofencingRequestBuilder
sınıfını
izlenecek coğrafi sınırları belirleyin ve ilgili coğrafi sınır etkinliklerinin nasıl tetikleneceğini ayarlayın:
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(); }
Bu örnekte iki coğrafi sınır tetikleyicisinin kullanımı gösterilmektedir.
GEOFENCE_TRANSITION_ENTER
Geçiş, cihaz coğrafi sınıra girdiğinde tetiklenir ve
GEOFENCE_TRANSITION_EXIT
Geçişi, bir cihaz coğrafi sınırdan çıktığında tetiklenir. Belirtme
INITIAL_TRIGGER_ENTER
, Konum hizmetlerine şunları söylüyor:
GEOFENCE_TRANSITION_ENTER
cihaz zaten coğrafi sınır içindeyse tetiklenmelidir.
Çoğu durumda, bunun yerine
INITIAL_TRIGGER_DWELL
kullanılması tercih edilir.
Yalnızca kullanıcı bir coğrafi sınır içinde tanımlı bir süre durduğunda etkinlikleri tetikleyen tetikleyiciler.
Bu yaklaşım, "uyarı spam'lerinin" azaltılmasına yardımcı olabilir bir kullanıcı bir web sitesini ziyaret ettiğinde çok sayıda bildirim
Cihaz kısa bir süreliğine coğrafi sınırlara girip çıkar. Reklamlarınızdan en iyi sonuçları almak için diğer bir strateji
coğrafi sınır 100 metrelik bir yarıçap belirlemektir. Bu, konum doğruluğunun belirlenmesine yardımcı olur
ve cihazın güç tüketimini azaltmaya yardımcı olur.
Geofence geçişleri için yayın alıcı tanımlama
Konum Hizmetleri'nden gönderilen bir Intent
,
ancak bir etkinlik veya parça başlatmasını sağlamamalısınız. Bunun nedeni, bileşenlerin
yalnızca kullanıcı işlemine yanıt olarak görünür hale gelmelidir. Çoğu durumda, coğrafi sınır geçişini yönetmek için BroadcastReceiver
iyi bir yöntemdir. CEVAP
BroadcastReceiver
, şunlar gibi bir etkinlik gerçekleştiğinde güncelleme alır:
bir coğrafi çite girip çıkması ve uzun süre çalışan arka plana başlanması
iş yeri.
Aşağıdaki snippet, Google Ads'deki
(BroadcastReceiver
) başlayan bir PendingIntent
tanımlamak için:
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; }
Coğrafi sınır ekleme
Coğrafi sınır eklemek için
yöntemini kullanın.
GeofencingClient.addGeofences()
GeofencingRequest
nesnesini ve PendingIntent
öğesini sağlayın.
Aşağıdaki snippet, sonuçların işlenmesini gösterir:
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 // ... } });
Coğrafi sınır geçişlerini yönetme
Konum Hizmetleri, kullanıcının coğrafi sınıra girdiğini veya sınırdan çıktığını algıladığında
PendingIntent
içeriğinde bulunan Intent
öğesini gönderir
coğrafi sınır ekleme isteğinde bulunduğunuzu belirtmiştiniz. Şu gibi bir yayın alıcı:
GeofenceBroadcastReceiver
, Intent
öğesinin çağrıldığını fark eder ve
daha sonra istekten coğrafi sınır çizme etkinliğini alabilir, Coğrafi sınır geçişlerinin türünü belirleyebilir,
ve tanımlanan coğrafi sınırlardan hangisinin tetiklendiğini belirleyebilirsiniz. Yayın
alıcı bir uygulamayı arka planda çalışmaya başlaması için yönlendirebilir veya
çıkış olarak bir bildirim gönderin.
Not: Android 8.0 (API düzeyi 26) ve sonraki sürümlerde, coğrafi sınır izlenirken arka planda çalışıyorsa birkaç dakikada bir coğrafi sınır çizme etkinliklerine yanıt verir. Yeni koşullara uyum sağlamayı öğrenmek için bu yanıt sınırlarına uymasını sağlamak için Genel bilgi Konum Sınırları.
Aşağıdaki snippet, bir
BroadcastReceiver
.
coğrafi sınır geçişi gerçekleştiğinde bir bildirim yayınlayan. Kullanıcı
bildirimi tıkladığında, uygulamanın ana etkinliği görünür:
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)); } } }
Geçiş etkinliğini PendingIntent
aracılığıyla tespit ettikten sonra
BroadcastReceiver
coğrafi sınır geçiş türünü alır ve
uygulamanın tetiklemek için kullandığı etkinliklerden biri olup olmadığını test eder
diğer bildirimlerden biri
GEOFENCE_TRANSITION_ENTER
veya GEOFENCE_TRANSITION_EXIT
seçmemiz gerekir. Hizmet, daha sonra bir bildirim gönderir ve geçiş ayrıntılarını günlüğe kaydeder.
Coğrafi sınır izlemeyi durdur
Artık ihtiyaç duyulmadığında veya istenmediğinde coğrafi sınır izlemeyi durdurmak pil tasarrufuna yardımcı olabilir
ve CPU döngüleri değişir. Coğrafi sınır izlemeyi durdurabilirsiniz
coğrafi sınır eklemek ve kaldırmak için kullanılan ana etkinlikte; coğrafi sınır kaldırıldığında
hemen teslim edebilirsiniz. API,
istek kimlikleriyle veya belirli bir veriyle ilişkilendirilen coğrafi sınırları kaldırarak coğrafi sınırları kaldırma
PendingIntent
Aşağıdaki snippet PendingIntent
tarihine kadar coğrafi sınırları kaldırarak tüm
Cihaz daha önce eklenen coğrafi sınırlara girdiğinde veya bu sınırlardan çıktığında başka bildirim:
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 // ... } });
Coğrafi sınır belirlemeyi, düzenli konum güncellemeleri gibi konuma duyarlı diğer özelliklerle birleştirebilirsiniz. Daha fazla bilgi için bu sınıftaki diğer derslere bakın.
Coğrafi sınır çizme için en iyi uygulamaları kullanma
Bu bölümde, konumla birlikte coğrafi sınır çizmeyi kullanmaya ilişkin öneriler yer almaktadır Android için API'ler.
Güç tüketimini azaltın
Coğrafi sınır çizme kullanan uygulamalarınızda güç tüketimini optimize etmek için aşağıdaki teknikleri kullanabilirsiniz:
ayarlayın bildirim yanıtlama düzeyini daha yüksek bir değere ayarlayabilirsiniz. Bu şekilde güç tüketimi şu şekilde artar: Coğrafi sınır uyarılarının gecikmesini artırır. Örneğin, yanıt verme süresini beş olarak ayarlarsanız dakika, uygulamanızın giriş veya çıkış uyarısı olup olmadığını yalnızca beş dakikada bir kontrol etmesi. Daha düşük değerler ayarlamak kullanıcıların bu zaman aralığı içinde bildirim alacağı anlamına gelmez (örneğin, 5 saniye olarak bir değer ayarlarsanız, uyarısını) inceleyin.
Kullanıcının uzun süre geçirdiği yerler için daha geniş coğrafi sınır yarıçapı kullanın. örneğin ev veya iş yeri gibi. Daha büyük bir yarıçap, güç tüketimini doğrudan azaltmaz ancak uygulamanın giriş veya çıkış olup olmadığını kontrol etme sıklığı, genel gücü etkili bir şekilde düşürür tüketim.
Coğrafi sınır için en uygun yarıçapı seçin
En iyi sonuçlar için coğrafi sınırların minimum yarıçapı 100 - 150 metre arasında ayarlanmalıdır. Kablosuz bağlantı kullanılabildiğinde konum doğruluğu genellikle 20 - 50 metre arasındadır. İç mekandayken konum kullanılabilirse, doğruluk aralığı 5 metre kadar küçük olabilir. Kapalı mekanı bilmiyorsanız coğrafi sınır içinde konum bilgisi varsa, Kablosuz konumu doğruluğunun yaklaşık 50 metre.
Kablosuz konumu kullanılamadığında (örneğin, kırsal alanlarda araç kullanıyorsanız) konum doğruluğu azalır. Doğruluk aralığı, yaklaşık 300 metre ila birkaç yüz metre olabilir birkaç kilometre. Bu gibi durumlarda, daha büyük bir yarıçap kullanarak coğrafi sınır çizmeniz gerekir.
Kullanıcılara uygulamanızda neden coğrafi sınır çizmeyi kullandığını açıklayın
Coğrafi sınır çizmeyi kullandığınızda uygulamanız arka planda konuma eriştiği için uygulamanızın kullanıcılara nasıl fayda sağladığını düşünün. Nedenini net bir şekilde açıklayın uygulamanızın, kullanıcıların anlayışını ve şeffaflığını artırmak için bu erişime ihtiyacı var.
Konum erişimiyle ilgili en iyi uygulamalar hakkında daha fazla bilgi için hakkında daha fazla bilgi için gizliliğe ilişkin en iyi uygulamalar sayfasını ziyaret edin.
Spam uyarıları azaltmak için bekleme geçişi türünü kullanın
Coğrafi çitten kısa bir süre geçerken çok sayıda uyarı alırsanız, hedefinize ulaşmanın en iyi yolu
GEOFENCE_TRANSITION_ENTER
yerine
GEOFENCE_TRANSITION_DWELL
geçiş türünü kullanmaktır. Böylece, konut uyarısı yalnızca kullanıcı durduğunda gönderilir.
coğrafi sınır içinde belirli bir süre boyunca. Bu süreyi,
takılma gecikmesi.
Coğrafi sınırları yalnızca gerektiğinde yeniden kaydet
Kayıtlı coğrafi sınırlar, sahibi olduğu com.google.process.location
işleminde saklanır.
com.google.android.gms
paketi.
Uygulamanın aşağıdaki etkinlikleri işlemek için herhangi bir işlem yapması gerekmez çünkü sistem
şu etkinliklerden sonra coğrafi sınırları geri yükler:
- Google Play Hizmetleri yükseltildi.
- Kaynak kısıtlaması nedeniyle Google Play hizmetleri sistem tarafından sonlandırılıp yeniden başlatılır.
- Konum işlemi kilitleniyor.
Aşağıdaki etkinliklerden sonra hâlâ ihtiyaç duyulması halinde uygulama coğrafi sınırları yeniden kaydetmelidir; çünkü sistem aşağıdaki durumlarda coğrafi sınırları kurtaramaz:
- Cihaz yeniden başlatılır. Uygulama, cihazın başlatma işlemini tamamlamadan önce dinlemeli ve ardından gerekli coğrafi sınırları kaydetme.
- Uygulama kaldırılır ve yeniden yüklenir.
- Uygulamanın verileri temizlenir.
- Google Play Hizmetleri verileri temizlendi.
- Uygulama bir
GEOFENCE_NOT_AVAILABLE
aldı uyarı. Bu durum genelde NLP (Android'in Ağ Konum Sağlayıcısı) devre dışı bırakıldıktan sonra.
Coğrafi sınır giriş etkinliğiyle ilgili sorunları giderme
Cihaz coğrafi sınıra girdiğinde coğrafi sınırlar tetiklenmiyorsa
(
GEOFENCE_TRANSITION_ENTER
uyarısı tetiklenmez) önce coğrafi sınırlarınızın
gerektiği gibi kaydettirilmelidir.
Uyarıların beklendiği gibi çalışmamasının bazı olası nedenleri aşağıda belirtilmiştir:
- Coğrafi sınır içinde doğru konum mevcut değil veya coğrafi sınır çok fazla küçük olmalıdır. Çoğu cihazda, coğrafi sınır hizmeti coğrafi sınır için yalnızca ağ konumunu kullanır tetiklemek. Ağ konumu çok daha az veri tükettiği için hizmet bu yaklaşımı kullanır ayrı konumlara ulaşmak daha az zaman alır ve en önemlisi, bunların iç mekanlarda kullanılabilir.
Cihazda kablosuz bağlantı kapalı. Kablosuz bağlantının açık olması önemli ölçüde iyileşebilir Konum doğruluğu, dolayısıyla kablosuz bağlantı kapalıysa uygulamanız hiçbir zaman coğrafi sınır uyarıları almayabilir coğrafi sınırın yarıçapı, cihaz modeli veya Android sürümü. Android 4.3 (API düzeyi 18) sürümünden itibaren, "Kablosuz ağ taraması" özelliğini ekledik. yalnızca mod"u seçin. Çok iyi kullanıcıya istem gösterme alıştırması yapma ve kullanıcıya yalnızca kablosuz ağ taramasını etkinleştirmesi için bir kısayol sunma alıştırması yapma devre dışı bırakılmışsa modunu açar. kullan SettingsClient (Ayarlar istemcisi), cihazın sistem ayarlarının optimum kullanıcı için doğru şekilde yapılandırılmasını sağlar Konum Algılama'ya dokunun.
Not: Uygulamanız Android 10 (API düzeyi 29) veya değeri düşükse doğrudan
WifiManager.setEnabled()
Uygulamanız bir sistem uygulaması veya cihaz politikası olmalıdır denetleyicisini (DPC) kullanın. Bunun yerine, ayarlar panelini açın.- Coğrafi sınır içinde güvenilir bir ağ bağlantısı yoktur. Varsa güvenilir veri bağlantısı olmadığından uyarı oluşturulmayabilir. Bunun nedeni, coğrafi sınır hizmetinin Veri bağlantısı gerektiren ağ konumu sağlayıcısına bağlıdır.
- Uyarılar gecikebilir. Geofence hizmeti, konumu, bu nedenle uyarıları alırken biraz gecikme olabilir. Gecikme genellikle 2'den azdır dakika, hatta cihaz hareket ederken daha az. Eğer Genel bilgi Konum Sınırları geçerli. Gecikme ortalama 2-3 dakika kadar. Cihaz uzun bir süre hareketsiz kaldıysa gecikme artabilir (6 dakikaya kadar).
Ek kaynaklar
Coğrafi sınır çizme hakkında daha fazla bilgi edinmek için aşağıdaki materyalleri görüntüleyin:
Örnekler
Coğrafi sınırlar oluşturmak ve izlemek için kullanılan örnek uygulama.