SORU
29 HAZİRAN 2010, Salı


Ve en sağlam, en basit şekilde kullanıcı'Android içinde geçerli konumu s nedir?

Android LocationManager API, kullanıcının konum ve zaman zaman kaba bir yaklaşım gerektiren bir uygulama için kullanmak için bir ağrı biraz var gibi görünüyor.

Üzerinde çalıştığım uygulama gerçekten Konum bir uygulama başına değil, ama yakın işletmelerin bir listesini görüntülemek için Kullanıcı yerini almak istiyor. Eğer kullanıcı etrafında falan hareket ediyorsa konusunda endişelenmenize gerek yok.

Yapmak istediğim şey şu:

  1. Kullanıcı yakındaki yerlerin listesini gösterir.
  2. Aktivite X ihtiyacım var, kullanılabilir olacak, böylece kullanıcının konumu önceden.
  3. Özellikle güncelleştirin. doğruluğunu veya frekans umurunda değil Sadece bir yer kapma yeterli yol olmadığı sürece. Belki de fantezi olmak istiyorum eğer Konum bir kez her birkaç dakika gelişmeleri aktaracağım, ama büyük bir öncelik değil.
  4. Herhangi bir cihaz ya da bir GPS veya Ağ Konumu sağlayıcısı olduğu sürece iş.

O kadar da zor olmayacak gibi görünüyor, ama iki farklı yer sağlayıcılar (GPS ve AĞ) hazırlansın ve her yaşam döngüsü yönetmek için var olduğunu bana görünüyor. Sadece bu değil, ama birden fazla etkinliği aynı kod #2 tatmin etmek için, çoğaltmak için var. Denedim kullanarak getBestProvider() geçtiğimiz kesmek çözüm için sadece kullanarak bir konum sağlayıcı, ama o gibi görünüyor sadece. sen de en iyi "teorik" provider yerine sağlayıcısı bu aslında verecek en iyi sonuçlar.

Daha basit bir şekilde bunu yapmak için var mı?

CEVAP
30 HAZİRAN 2010, ÇARŞAMBA


Yaptığım şey şu:

  1. Öncelikle sağlayıcıları etkin ne olduğunu kontrol edin. Bazı aygıt devre dışı bırakılmış olabilir, Bazı uygulama bildirimi devre dışı bırakılabilir.
  2. Eğer herhangi bir sağlayıcı varsa konum dinleyici ve zaman aşımı zamanlayıcı başlıyorum. Benim örnekte 20 saniye, büyütmek, böylece GPS için yeterli olmayabilir.
  3. Eğer konum dinleyici güncelleme alırsam sağlanan değeri kullanın. Dinleyici ve timer I Durdur.
  4. Eğer herhangi bir güncelleme ve zamanlayıcı sona erdiğinde umurumda bile bilinen son değerleri kullanmak zorundayım.
  5. Kullanılabilir sağlayıcılar en son bilinen değerleri alıp onları en son seçin.

Benim Dersim kullanın:

LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(Location location){
        //Got the location!
    }
};
MyLocation myLocation = new MyLocation();
myLocation.getLocation(this, locationResult);

Ve burada MyLocation sınıf:

import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class MyLocation {
    Timer timer1;
    LocationManager lm;
    LocationResult locationResult;
    boolean gps_enabled=false;
    boolean network_enabled=false;

    public boolean getLocation(Context context, LocationResult result)
    {
        //I use LocationResult callback class to pass location value from MyLocation to user code.
        locationResult=result;
        if(lm==null)
            lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        //exceptions will be thrown if provider is not permitted.
        try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
        try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

        //don't start listeners if no provider is enabled
        if(!gps_enabled && !network_enabled)
            return false;

        if(gps_enabled)
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
        if(network_enabled)
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
        timer1=new Timer();
        timer1.schedule(new GetLastLocation(), 20000);
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerNetwork);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerGps);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    class GetLastLocation extends TimerTask {
        @Override
        public void run() {
             lm.removeUpdates(locationListenerGps);
             lm.removeUpdates(locationListenerNetwork);

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

             //if there are both values use the latest one
             if(gps_loc!=null && net_loc!=null){
                 if(gps_loc.getTime()>net_loc.getTime())
                     locationResult.gotLocation(gps_loc);
                 else
                     locationResult.gotLocation(net_loc);
                 return;
             }

             if(gps_loc!=null){
                 locationResult.gotLocation(gps_loc);
                 return;
             }
             if(net_loc!=null){
                 locationResult.gotLocation(net_loc);
                 return;
             }
             locationResult.gotLocation(null);
        }
    }

    public static abstract class LocationResult{
        public abstract void gotLocation(Location location);
    }
}

Biri de benim mantığı değiştirmek isteyebilirsiniz. Eğer alırsanız örneğin Ağ sağlayıcısından güncelleme dinleyicileri dur ama beklemeye devam yok. GPS için beklemeye değer çok daha doğru veri verir. Zamanlayıcı sona erdiğinde ve Şebeke güncelleme var ama GPS çalışmıyor, değer şebekeden sağlanan kullanabilirsiniz.

Diğer bir yöntem LocationClient http://developer.android.com/training/location/retrieve-current.html kullanmaktır. Ama Google Play Hizmetleri apk kullanıcı cihaz üzerinde yüklü olmasını gerektirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DrakeVEVO

    DrakeVEVO

    17 AĞUSTOS 2009
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011
  • wafflepwn

    wafflepwn

    14 AĞUSTOS 2008