当前位置: 首页 > 面试题库 >

定位用户当前位置并在Google地图中显示

鞠隐水
2023-03-14
问题内容

我正在开发一个包含3个活动的android应用程序,其中一个是map。我正在使用谷歌地图

我想要的是:

  1. 当用户打开活动(地图)时,它将向用户显示她的位置而不是坐标。

  2. 用户还应该能够通过使用大头针定位(固定)任何地方,而我的应用程序必须将此大头针的坐标存储在变量中,以便以后使用。

    public class LActivity extends MapActivity 
    {    
        /** Called when the activity is first created. */

        MapView mapView;
        GeoPoint geo;
        MapController mapController;
        LocationManager locationManager;
        CustomPinpoint itemizedoverlay;


        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mapView = (MapView) findViewById(R.id.mapView);
            // create a map view
            //LinearLayout linearLayout = (LinearLayout) findViewById(R.id.main);

            mapView.setBuiltInZoomControls(true);
            // Either satellite or 2d 
            mapView.setSatellite(true);
            mapController = mapView.getController();
            mapController.setZoom(14); // Zoon 1 is world view
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new GeoUpdateHandler());

            Drawable drawable = this.getResources().getDrawable(R.drawable.point);
            itemizedoverlay = new CustomPinpoint(drawable);
            createMarker();
        }

        public class GeoUpdateHandler implements LocationListener {

            @Override
            public void onLocationChanged(Location location) {
                int lat = (int) (location.getLatitude() * 1E6);
                int lng = (int) (location.getLongitude() * 1E6);
                GeoPoint point = new GeoPoint(lat, lng);
                createMarker();
                mapController.animateTo(point); // mapController.setCenter(point);
            }

            @Override
            public void onProviderDisabled(String provider) {
            }

            @Override
            public void onProviderEnabled(String provider) {
            }

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

        private void createMarker() {
            GeoPoint p = mapView.getMapCenter();
            OverlayItem overlayitem = new OverlayItem(p, "", "");
            itemizedoverlay.addOverlay(overlayitem);
            mapView.getOverlays().add(itemizedoverlay);
        }

        @Override
        protected boolean isRouteDisplayed() {
            // TODO Auto-generated method stub
            return false;
        }
    }

这是CustomPinpoint类

    public class CustomPinpoint extends ItemizedOverlay<OverlayItem> {

        static int maxNum = 3;
        OverlayItem overlays[] = new OverlayItem[maxNum];
        int index = 0;
        boolean full = false;
        CustomPinpoint itemizedoverlay;

        public CustomPinpoint(Drawable defaultMarker) {
            super(boundCenterBottom(defaultMarker));
        }

        @Override
        protected OverlayItem createItem(int i) {
            return overlays[i];
        }

        @Override
        public int size() {
            if (full) {
                return overlays.length;
            } else {
                return index;
            }
        }

        public void addOverlay(OverlayItem overlay) {
            if (index < maxNum) {
                overlays[index] = overlay;
            } else {
                index = 0;
                full = true;
                overlays[index] = overlay;
            }
            index++;
            populate();
        }

    }

问题答案:

我已经实现了您想要的相同的东西。我为您提供示例代码。在这种情况下,我在获取位置时也实现了ProgressDialog。

这是获取位置的起点。 我将此命名为AndroidLocationActivity。这是您的应用启动时开始的第一项活动。

String provider;
    public double latitude, longitude = 0;
    CurrentPositionTask getCurrentLocation;
    Location currentLocation;
    LocationListener locationListener;
    LocationManager locationManager;
    private long time=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        try {
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            setCriteria();
            currentLocation = AndroidLocationActivity.this.locationManager.getLastKnownLocation(provider);

            if (currentLocation == null) {
                currentLocation = new Location(provider);
            }
            time = currentLocation.getTime();

            if (latitude == 0 && longitude == 0) {
                latitude = currentLocation.getLatitude();
                longitude = currentLocation.getLongitude();    
            }
            Toast.makeText(AndroidLocationActivity.this, String.valueOf(time), Toast.LENGTH_LONG).show();

如果时间不超过1分钟,请在此处设置时间,而不是不更新位置。

            if (time >= 100000) {
                latitude = 0;
                longitude = 0;
            }
        } catch (NullPointerException e) {
            // TODO: handle exception
            System.out.println("Null");
            e.printStackTrace();
        } 
        catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        runAsyncTask();    
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        locationManager.removeUpdates(locationListener);
    }

    public void setCriteria() {
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
        provider = locationManager.getBestProvider(criteria, true);
        Toast.makeText(getApplicationContext(), "Provider - " + provider, Toast.LENGTH_SHORT).show();
        if (provider == null) {
            provider = LocationManager.GPS_PROVIDER;
        }
    }


    public void runAsyncTask() {
        // TODO Auto-generated method stub
        if (getCurrentLocation == null) {
            getCurrentLocation = new CurrentPositionTask();    
        }

        if (getCurrentLocation != null) {
            getCurrentLocation.execute("Searching for Location");    
        }
    }

    public boolean checkConnection()
    {
        //ARE WE CONNECTED TO THE NET

        ConnectivityManager conMgr = (ConnectivityManager) getSystemService (AndroidLocationActivity.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable()&& conMgr.getActiveNetworkInfo().isConnected()) {
            return true;
        } else {
            return false;
        }
    }


    private class CurrentPositionTask extends AsyncTask<String, Void, Void>
    {
        private ProgressDialog Dialog = new ProgressDialog(AndroidLocationActivity.this);
        private boolean flag = true;

        public CurrentPositionTask() {
            locationListener = new MyLocationListener();
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            try {
                if (checkConnection()) {
                    Dialog.setTitle("Loading");
                    Dialog.setMessage("Searching for Location");
                    Dialog.show();
                    locationManager.requestLocationUpdates(provider, 0, 0, locationListener);
                }
                else {
                    Toast.makeText(getApplicationContext(), "Internet is Not Available", Toast.LENGTH_LONG).show();
                }    
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }

        @Override
        protected Void doInBackground(String... params) {
            // TODO Auto-generated method stub
            while (flag) {
                if (latitude !=0 && longitude != 0) {
                    flag=false;
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            Toast.makeText(AndroidLocationActivity.this, "Location Floats:- " + latitude + "," + longitude, Toast.LENGTH_LONG).show();

            super.onPostExecute(result);
            if (Dialog != null && Dialog.isShowing()) {
                Dialog.dismiss();
                time=0;
                Intent homeIntent = new Intent(AndroidLocationActivity.this.getApplicationContext(), HomeMenuActivity.class);

在此处设置经纬度并开始新的活动

            homeIntent.putExtra("lat", latitude);
    homeIntent.putExtra("lng", longitude);
            startActivity(homeIntent);
            }
            locationManager.removeUpdates(locationListener);
        }
    }

    class MyLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
            if (location != null) {
                latitude = location.getLatitude();
                longitude = location.getLongitude();    
            }
        }

        @Override
        public void onProviderDisabled(String arg0) {
            // TODO Auto-generated method stub
            Toast.makeText( getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProviderEnabled(String arg0) {
            // TODO Auto-generated method stub
            Toast.makeText( getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            // TODO Auto-generated method stub
        }
    }

这是我正在显示地图的功能。 这是HomeMenuActivity

public static Context context;
onCreate(..) {
    context = getApplicationContext(); // it will be used in Itemized Overlay
     latitude = getIntent().getDoubleExtra("lat", 0);//get the lat & lng
     longitude = getIntent().getDoubleExtra("lng", 0);
}


public void showMap() {

    // TODO Auto-generated method stub
    try {

        geoPoint = new GeoPoint((int)(latitude * 1E6),(int)(longitude * 1E6));

        mapview = (MapView)findViewById(R.id.mapview);

        mapControll= mapview.getController();

        mapview.setBuiltInZoomControls(true);

        mapview.setStreetView(true);

        mapview.setTraffic(true);

        mapControll.setZoom(16);

        mapControll.animateTo(geoPoint);



        userPic = this.getResources().getDrawable(your pic....);

        userPicOverlay = new MyItemizedOverlay(userPic);

        OverlayItem overlayItem = new OverlayItem(geoPoint, "", null);

        userPicOverlay.addOverlay(overlayItem);

        mapview.getOverlays().add(userPicOverlay);
        //Added symbols will be displayed when map is redrawn so force redraw now

        mapview.postInvalidate();

    } catch (Exception e) {

        // TODO: handle exception

        e.printStackTrace();

    }

}

ItemizedOverlay类

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {



    private ArrayList<OverlayItem> myOverlays ;



    public MyItemizedOverlay(Drawable defaultMarker) {

        super(boundCenterBottom(defaultMarker));

        myOverlays = new ArrayList<OverlayItem>();

        populate();

    }



    public void addOverlay(OverlayItem overlay){

        myOverlays.add(overlay);

        populate();

    }



    @Override

    protected OverlayItem createItem(int i) {

        return myOverlays.get(i);

    }



    // Removes overlay item i

    public void removeItem(int i){

        myOverlays.remove(i);

        populate();

    }



    // Returns present number of items in list

    @Override

    public int size() {

        return myOverlays.size();

    }





    public void addOverlayItem(OverlayItem overlayItem) {

        myOverlays.add(overlayItem);

        populate();

    }





    public void addOverlayItem(int lat, int lon, String title) {

        try {

            GeoPoint point = new GeoPoint(lat, lon);

            OverlayItem overlayItem = new OverlayItem(point, title, null);

            addOverlayItem(overlayItem);

        } catch (Exception e) {

            // TODO: handle exception

            e.printStackTrace();

        }

    }



    @Override

    protected boolean onTap(int index) {

        // TODO Auto-generated method stub

        String title = myOverlays.get(index).getTitle();

        Toast.makeText(HomeMenuActivity.context, title, Toast.LENGTH_LONG).show();

        return super.onTap(index);

    }

}

希望这会有所帮助.....



 类似资料:
  • 问题内容: 最后,我成功显示了地图,现在,我想显示我的当前位置,我尝试使用这些代码,但是当我单击右上角的我的位置按钮时,它不起作用。 AndroidManifest.xml MapsActivity.java 问题答案: 将此代码用于当前位置:

  • 本文向大家介绍如何使用HTML5地理位置和Google Maps显示当前位置?,包括了如何使用HTML5地理位置和Google Maps显示当前位置?的使用技巧和注意事项,需要的朋友参考一下 HTML5 Geolocation API使您可以与自己喜欢的网站共享位置。Javascript可以捕获您的纬度和经度,并且可以发送到后端Web服务器,并可以进行精美的位置感知操作,例如查找本地商家或在映射上

  • 问题内容: 我正在学习如何使用新的Swift语言(只有Swift,没有Objective-C)。为此,我想用地图()做一个简单的视图。我想查找并更新用户的位置(例如在Apple Map应用程序中)。 我试过了,但是什么也没发生: 请你帮助我好吗? 问题答案: 您必须重写(CLLocationManagerDelegate的一部分)才能在位置管理器检索当前位置时得到通知: 注意:如果目标是iOS 8

  • 问题内容: 因此,我已经能够通过开发人员的android页面获取我当前位置的定期更新,从而使您的应用知道位置。现在,只要我的位置发生变化,我就可以获取该位置的纬度和经度。但是,谁可以在Google Maps中实现呢? 下面的这一行在地图上实现了一个按钮,该按钮可找到我的当前位置并在其上放置一个蓝点/标记(不接收定期更新) mMap.setMyLocationEnabled(true); 我应该在活

  • 本文向大家介绍js+html5获取用户地理位置信息并在Google地图上显示的方法,包括了js+html5获取用户地理位置信息并在Google地图上显示的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js+html5获取用户地理位置信息并在Google地图上显示的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的web程序设计有所帮助。

  • 本文向大家介绍基于JavaScript定位当前的地理位置,包括了基于JavaScript定位当前的地理位置的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js定位当前地理位置的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。