Проблема первого запуска MapView MyLocationOverlay

Я использую службы определения местоположения в своем приложении. Если я отправлю долготу и широту в эмулятор через DDMS, туда анимируется синяя точка. Но если я закрою приложение и снова перезапущу, синяя точка не появится. Если вы видите синюю точку, вы должны отправить новую долготу и широту. Я хочу показывать синюю точку каждый раз при запуске приложения.

Что я могу сделать ?

при создании:

mc = mapView.getController();
        mapView.setBuiltInZoomControls(true);
        mc.setZoom(15);
        myLocOverlay = new MyLocationOverlay(this, mapView);
        mapView.getOverlays().add(myLocOverlay); 
        myLocOverlay.runOnFirstFix(new Runnable() {
            public void run() {
                mc.animateTo(myLocOverlay.getMyLocation());
                }
        });

        mapView.postInvalidate();

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();       
        provider = lm.getBestProvider(criteria, false);

        Location location = lm.getLastKnownLocation(provider);

        if (location != null) {
            onLocationChanged(location);
            }

onLocationChanged(Местоположение)

String PK="";

        double lat = location.getLatitude();
        double lng = location.getLongitude();
        Geocoder gc = new Geocoder(this,Locale.getDefault());
        try{

            List<Address> adresler = gc.getFromLocation(lat, lng, 1);
            StringBuilder sb = new StringBuilder();
            if(adresler.size()>0){
                Address adres = adresler.get(0);
                boolean sayi = false;
                for(int i=0;i<adres.getMaxAddressLineIndex();i++){
                    if(i!=2){
                        sb.append(adres.getAddressLine(i)).append("\n");
                    }
                    else{
                        String full = adres.getAddressLine(i).toString();
                        char chars[] = full.toCharArray();
                        for(int k=0;k<chars.length;k++){
                            sayi = Character.isDigit(chars[k]);
                            if(sayi){
                                PK=PK+chars[k];
                            }
                        }
                    }

                }   
                adresString = sb.toString();
                new gpsYerBilgisiAS(PK).execute();
            }
        }
            catch(IOException e){

            }
        }

при возобновлении и приостановке

@Override   
    protected void onResume() {  
        super.onResume();  
        lm.requestLocationUpdates(provider, 400, 1, this);      
        myLocOverlay.enableMyLocation();

    }
    @Override   
    protected void onPause() {    
        super.onPause();
        lm.removeUpdates(this); 
        myLocOverlay.disableMyLocation();
    }

person Melih Mucuk    schedule 16.08.2012    source источник


Ответы (2)


В эмуляторе вы должны отправлять позицию каждый раз, когда хотите вызвать метод onLocationChanged. На устройстве это делается автоматически, если GPS открыт. Но я буду отображать только «синюю точку», когда ваше устройство получает данные о местоположении через GPS или сеть.

person Serdar Samancıoğlu    schedule 16.08.2012
comment
selam, türkçe anlatabilmek daha iyi olacak :) Эмулятор üzerinde долготы и широты gönderdiğimde konuma hareketleniyor. Ancak telefona attığımda eğer lokasyon değişmediyse mavi nokta çıkmıyor. Lokasyon aynıda kalsa değişsede ben mavi noktayı göstermek istiyorum. Aynı konumda kaldığımda zaten onLocationChange fonksiyonuna girmiyor. - person Melih Mucuk; 16.08.2012
comment
Abicim, MyLocationOverlay zaten kendisi bir SensorThread açiyor. Onunla LocationListener'in alakası yok zaten. Буну унутма. Я говорил этому человеку, что оверлей местоположения открывает собственный SensorThread. - person tolgap; 16.08.2012
comment
(Перевод моего ответа выше) Şöyle, emülatörde GPS güncellemesini manuel yapmak zorundasın. Яни ее seferinde konum bilgisi göndermen lazım. Aygıt üzerinde ise otomatik olarak yapılıyor. Yani bunun için endişelenmene gerek yok. - person Serdar Samancıoğlu; 16.08.2012
comment
Вы можете использовать HTC One X, HTC Wildfire S и Samsung Galaxy Wonder, чтобы получить максимальное количество моделей. One X ICS kullanıyor diğer ikisi пряники. Gingerbreadlerde sorun yok lokasyon aynıda olsa her seferinde lokasyonu veriyor ve mavi nokta gözüküyor. Ама ICS де тепки йок. Бош харитая бакиёрум :) - person Melih Mucuk; 16.08.2012
comment
@tolgap onLocationChanged всегда вызывается, когда ваш экземпляр MyLocationOverlay получает местоположение. Попробуйте создать свой собственный класс, расширяющий класс MyLocationOverlay, и переопределите его метод onLocationChanged, и посмотрите. Melih Telefon ayarlarından GPS modülünü aktive etmeyi dene. Muhtemelen aktif değildir. - person Serdar Samancıoğlu; 16.08.2012
comment
hayır aktif, zaten gps aktif olmadığında yönlendirilecek başka bir sayfa var. Карта sayfasının başlangıcında gps kontrolü yapıyorum zaten aktifse map sayfasına giriyor. Sorunun пе olduğunu cidden bilmiyorum. Bu arada sayfa açıldığında GPS simgeside yukarıda beliriyor zaten ama herhangi bir veri alışverişi yapmıyor sanırım. Карты Google я açtım orda konumu buluyor. - person Melih Mucuk; 16.08.2012
comment
Telefonu internete bağlayıp deneyebilir misin? İnternete erişimi olursa network üzerinden konumunu bulup mavi noktayı gösterir. Eğer bu çalışırsa telefonun GPS cihazında sorun var demektir. Я да kapalı mekandaysan GPS sinyali almıyor olabilir. - person Serdar Samancıoğlu; 16.08.2012
comment
Şimdi öncelikle phone internete bağlı. Mavi nokta hala gözükmüyor. GPS cihazında sorun olsa google maps de konumu bulmaması gerekmez mi? Google карты де konum buluyor. Kapalı mekandayım ancak diğer iki cihaz konumu buluyor. Şuanda bir galaxy note üzerinde de deniyorum ICS yüklü, ve onda da sorun olmadan mavi nokta her şekilde çıkıyor. Sorun HTC One X является gerçekten anlamıyorum sorunun ne olduğunu. Yardımın için teşekkürler yapıcak bir şey yok sanırım. - person Melih Mucuk; 16.08.2012

Сделайте свой onResume() таким:

protected void onResume() {
    ....
    myLocOverlay = new MyLocationOverlay(this, mapView);
    myLocOverlay.enableMyLocation();
    mapView.getOverlays().add(myLocOverlay); 
    myLocOverlay.runOnFirstFix(new Runnable() {
        public void run() {
            mc.animateTo(myLocOverlay.getMyLocation());
            }
    });
    ....
}

И это будет работать так, как вы хотите. Вот как это у меня сейчас в моем собственном приложении.

person tolgap    schedule 16.08.2012
comment
Нет, в вашем приложении это есть в файле onCreate(). Просто вставьте его в onResume(). Даже если это не принесет желаемого эффекта для вас, это будет лучший способ. - person tolgap; 16.08.2012
comment
Я понял, и я сделал то, что вы говорите. Но нет никакого изменения. Спасибо, что показали лучший способ, но я еще не решил проблему :) - person Melih Mucuk; 16.08.2012
comment
Отредактировал мой ответ. Я забыл важную строчку. Можешь попробовать сейчас? - person tolgap; 16.08.2012
comment
Я заметил это и исправил ваш код, но никаких изменений нет. - person Melih Mucuk; 16.08.2012