GPS veya internet kullanmadan Android'de kullanıcının mevcut konumunu alın


91

Kullanıcının mevcut konumunu GPS veya internet kullanmadan almak mümkün müdür? Mobil ağ sağlayıcısının yardımıyla demek istiyorum.


1
Kabul edilen cevap mükemmel çalışıyor mu? Benim için çalışmıyor ... !!!
Samitha Chathuranga

3
Maalesef kabul edilen cevap yanlış :-( Soruyu doğru yanıtlamasa da 28 olumlu oy almış olması şaşırtıcı!
David Wasser

@DavidWasser Değerli yorumlarınız için teşekkür ederiz. Ve konum ayrıntılarını internet veya GPS kullanmadan almanın bir yolu olmadığını düşünüyor musunuz? (bu hücre yayını mesajlarını kullanmak dışında)
Samitha Chathuranga

2
@SamithaChathuranga Şunu bir düşünün: GPS'iniz yoksa ve İnternetiniz yoksa, bu bilgiyi nereden alacaksınız? Hücre kimliği bilgilerini ağdan alabilirsiniz. Bu size yalnızca kimliği verir. Daha sonra kimliği gerçek bir koordinat veya adla eşlemek için bir yola ihtiyacınız olacaktır. Her zaman kendi hücre kimliği veritabanınızı oluşturabilir ve uygulamanıza dahil edebilirsiniz, ancak tüm bu verileri toplamak çok fazla iş gerektirir ve haritalama statik değildir: mobil operatörler yeni baz istasyonları kurup yeniden numaralandırdıkça değişir. ağları. Temel olarak, pratik cevap "hayır" dır.
David Wasser

@DavidWasser Cevap için teşekkürler. Ayrıca konumu internet veya GPS olmadan nasıl elde edeceğime büyük bir sürprizim oldu. Ancak birçok forumda stackoverflow dahil olmak üzere bunun mümkün olduğu söyleniyor. Bu yüzden mümkün olacağını düşündüm. Görünüşe göre pek çok insan da yanlış yola sapmış durumda.
Samitha Chathuranga

Yanıtlar:


87

Yapmak istediğiniz şey LocationManager.NETWORK_PROVIDERyerine kullanarak pozisyon almaktır LocationManager.GPS_PROVIDER. Mevcut NETWORK_PROVIDERolan GSM veya wifi üzerinde çözülür. Açıkçası, wifi kapalıyken, GSM kullanılacaktır. Hücre ağını kullanmanın temelde 500m kadar doğru olduğunu unutmayın.

http://developer.android.com/guide/topics/location/obtaining-user-location.html gerçekten harika bilgiler ve örnek kodlar içerir.

Kodun çoğunu tamamladıktan OnCreate()sonra şunu ekleyin:

// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Ayrıca aktivitenizin LocationListenersınıfı uygulamasını ve böylece aktivitenize uygulamasını da sağlayabilirsiniz onLocationChanged().


1
lütfen pil korumasıyla ilgili stratejilere göz atmayı unutmayın. Ayrıca, uygulamanıza bağlı olarak, PASSIVE_PROVIDER ve getLastKnownLocation'ı kullanmak, antenleri başka uygulamalar kullanıyorsa size çok fazla iş ve pil tasarrufu sağlayabilir.
Ian

2
Hey @ Ian, ben de aynı kodu kullandım .. Ama benim durumumda onLocationChanged () dinleyici metodu hiç çağrılmadı. OnResume () yönteminde requestLocationUpdates kullandım. yine de hiç aramadı .. Peki orada sorun neydi?
MS.

2
Hey @lan veya bana yardım edebilecek herhangi bir kişi yukarıdaki kodu uyguladım ama onLocationChanged yöntemi soruluyor, herhangi biri bana yardım edebilir mi lütfen .....
pareshm

1
Koordinatları internet olmadan almak mümkün mü? Bazı cihazlarda çalışmıyor gibi görünüyor.
iammilind

20
Bu cevap yanlış :-( OP, İnternet bağlantısı kullanmadan konumun nasıl alınacağını sordu. LOCATION_PROVIDER, Hücre Kimliği ve WIFI MAC adreslerinin bir koleksiyonunu coğrafi koordinatta çözmek için sunuculara erişmek için İnternet'i kullanmalıdır. İnternetiniz yoksa bağlantı bir koordinat alamayacaksınız. Bana bunun sizin için çalıştığını söylerseniz, bu ya bir İnternet bağlantınız olduğu ya da bir İnternet bağlantınız olduğu anlamına gelir (konum API'si indirir ve etrafınızdaki alanla ilgili bazı bilgileri önbelleğe alır) veya konum bilgisi eski (ve bu nedenle yanlış).
David Wasser

16

Bunu elde ederek getLastKnownLocationaslında bir düzeltmeyi kendiniz başlatmazsınız.

Bunun olabileceğinin farkında olun sağlayıcı başlatmak, ancak kullanıcının daha önce bir konum aldı, Size onun sanmıyorum. Dokümanlar bu konuda pek net değil.

Dokümanlara göre getLastKnownLocation:

Verilen sağlayıcıdan elde edilen son bilinen konum düzeltmesinden verileri gösteren bir Konum döndürür. Bu, sağlayıcıyı başlatmadan yapılabilir.

İşte hızlı bir pasaj:

import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import java.util.List;

public class UtilLocation {
    public static Location getLastKnownLoaction(boolean enabledProvidersOnly, Context context){
        LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Location utilLocation = null;
        List<String> providers = manager.getProviders(enabledProvidersOnly);
        for(String provider : providers){

            utilLocation = manager.getLastKnownLocation(provider);
            if(utilLocation != null) return utilLocation;
        }
        return null;
    }
}

Ayrıca şuna yeni izin eklemelisiniz AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Düşündüğüm şey şu: Mobil ağı kullanarak mevcut konumu elde etmek mümkün mü
Prabhu M

Dokümanları okumalısın. Arasındaki farkları öğrenin PASSIVE_PROVIDER, NETWORK_PROVIDERve GPS_PROVIDER.
hwrdprkns

1
Bu ideal olmasına rağmen, getTime () kullanarak son konumun saatini kontrol ederim. O halde, bunun kaç yaşında olmasına izin vereceğinize karar vermek yeterlidir. Çok eskiyse, gönderimi kullanarak yeni bir pozisyon alın.
Ian

1
@Ian Yeni veya taze bir yer nasıl alınır?
Archie.bpgc

5
GPS kapalıysa konum bulabilir miyiz
Prasad

4
boolean gps_enabled = false;
boolean network_enabled = false;

LocationManager lm = (LocationManager) mCtx
                .getSystemService(Context.LOCATION_SERVICE);

gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

Location net_loc = null, gps_loc = null, finalLoc = null;

if (gps_enabled)
    gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (network_enabled)
    net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (gps_loc != null && net_loc != null) {

    //smaller the number more accurate result will
    if (gps_loc.getAccuracy() > net_loc.getAccuracy()) 
        finalLoc = net_loc;
    else
        finalLoc = gps_loc;

        // I used this just to get an idea (if both avail, its upto you which you want to take as I've taken location with more accuracy)

} else {

    if (gps_loc != null) {
        finalLoc = gps_loc;
    } else if (net_loc != null) {
        finalLoc = net_loc;
    }
}

4

Hayır, GPS veya internet kullanmadan şu anda konum bilgisi alamazsınız.

WiFi, Hücresel veya Bluetooth'a dayalı konum teknikleri, sürekli güncellenen büyük bir veritabanı yardımıyla çalışır. Bir cihaz, verici kimliklerini tarar ve ardından bunları internet üzerinden bir sorguda Google, Apple veya Skyhook gibi bir hizmete gönderir . Bu hizmet, bilinen konumlardan önceki kablosuz anketlere dayalı bir konumla yanıt verir. İnternet erişimi olmadan, böyle bir veritabanının yerel bir kopyasına sahip olmanız ve bunu güncel tutmanız gerekir. Küresel kullanım için bu çok pratik değildir.

Teorik olarak, bir mobil sağlayıcı yalnızca yerel veri hizmeti sağlayabilir ancak internete erişim sağlayamaz ve ardından mobil cihazlardan konum sorgularını yanıtlayabilir. Mobil sağlayıcılar bunu yapmaz; hiç kimse bu tür kısıtlı veri erişimi için ödeme yapmak istemez. Mobil sağlayıcınız aracılığıyla veri hizmeti alıyorsanız, internet erişiminiz vardır.

Kısacası, konumu almak için LocationManager.NETWORK_PROVIDER veya android.hardware.location.network kullanmak internet kullanımını gerektirir.

Bilinen son konumu kullanmak, çok yakın zamanda GPS veya internet erişiminizin olmasını gerektirir. Yeni internetiniz varsa, muhtemelen tekrar internete girmek için konumunuzu veya ayarlarınızı değiştirebilirsiniz. Cihazınızın GPS veya internet erişimi yoksa, bilinen son konum özelliği size yardımcı olmayacaktır.

GPS veya internet olmadan şunları yapabilirsiniz:

  1. Gece gökyüzünün fotoğraflarını çekin ve bir yıldız haritasına göre konumunuzu tahmin etmek için geçerli saati kullanın. Bu muhtemelen resimlerinizin açılarının doğru şekilde ölçülmesini sağlamak için ek ekipman gerektirecektir.
  2. Bilinen bir konumdan başlayarak konumu izlemek için bir ivme ölçer kullanın. Bu tür bir yaklaşımdaki hata birikimi, çoğu durumda onu kullanışsız hale getirir.


2

Google Haritalar Coğrafi Konum API'sine bir göz attınız mı? Google Map Geolocation

Bu basit RestApi, sadece POST'a ihtiyacınız var, servis metre cinsinden doğrulukla bir konum döndürecektir.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.