MapView MyLocationOverlay 首次运行问题

Posted

技术标签:

【中文标题】MapView MyLocationOverlay 首次运行问题【英文标题】:MapView MyLocationOverlay First Run issue 【发布时间】:2012-08-12 13:49:41 【问题描述】:

我在我的应用中使用定位服务。如果我通过 DDMS 将经度和纬度发送到模拟器,蓝点将动画到那里。但是如果我关闭应用程序并重新启动,蓝点就不会出现。如果看到蓝点,则必须发送新的经度和纬度。 我希望每次应用启动时都显示蓝点。

我能做什么?

onCreate:

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)

            
        

onResume 和 onPause

@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();
    

【问题讨论】:

【参考方案1】:

在模拟器中,每次要调用 onLocationChanged 方法时都必须发送位置。 在设备上,如果 GPS 打开,它会自动完成。但我只会在您的设备通过 GPS 或网络接收到位置数据时显示“蓝点”。

【讨论】:

selam, türkçe anlatabilmek daha iyi olacak :) 模拟器 üzerinde 经度 ve 纬度 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 本 mavi noktayı göstermek istiyorum。 Aynı konumda kaldığımda zaten onLocationChange fonksiyonuna girmiyor。 Abicim, MyLocationOverlay zaten kendisi bir SensorThread açiyor。 Onunla LocationListener'ın alakası yok zaten。布努乌努特玛。我告诉这个人,locationoverlay 会打开它自己的 SensorThread。 (我上面的答案的翻译)Şöyle,emülatörde GPS günellemesini manuel yapmak zorundasın。 Yani 她的 seferinde konum bilgisi göndermen lazım。 Aygıt üzerinde ise bu otomatik olarak yapılıyor。 Yani bunun için endişelenmene gerek yok. Şuanda HTC One X , HTC Wildfire S ve Samsung Galaxy Wonder modellerinde deniyorum uygulamayı。一个 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。 Ama ICS de tepki yok。 Boş haritaya bakıyorum :) Telefonu internete bağlayıp deneyebilir misin? İinternete erişimi olursa network üzerinden konumunu bulup mavi noktayı gösterir。 Eğer bu çalışırsa telefonun GPS cihazında sorun var demektir。 Ya da kapalı mekandaysan GPS sinyali almıyor olabilir。【参考方案2】:

让你的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());
            
    );
    ....

它会按照你想要的方式工作。这就是我目前在我自己的应用程序中的方式。

【讨论】:

不,您的应用程序在 onCreate() 中有。只需将其放入onResume()。即使它没有达到你想要的效果,它也会是一个更好的方法。 我明白,我照你说的做了。但是没有任何变化。感谢您展示更好的方法,但我还没有解决问题:) 编辑了我的答案。我忘记了一条重要的线。现在可以试试了吗? 我注意到它并修复了您的代码,但没有任何变化。

以上是关于MapView MyLocationOverlay 首次运行问题的主要内容,如果未能解决你的问题,请参考以下文章

MyLocationOverlay.enableCompass() 停止在 Google Map API 7 和 8 上工作

Android 谷歌地图 myLocationOverlay 消失了?

如何为 MyLocationOverlay 中的“你在这里”点使用自定义位图?

Android 百度地图开发

如何在mapview中为标记(叠加)图像设置动画

如何使用 Mapview 设置布局