Google地图每秒更新当前位置

时间:2014-01-28 10:35:12

标签: android google-maps google-maps-api-3 location geometry

Hello stackoferflow用户。

我正在开发Android应用程序和此应用程序实现Google Play Service

我已经获得了我的位置,并在我的地图上设置了一个别针和一个圆圈。

我想要实现的是每当我移动到某个地方时,圆圈也会移动并将我的位置设置为中心位置。

我的问题是:

  1. 如何每2-5秒更新一次当前位置,该圈子也将移至我当前的新位置

  2. 如何将我的圆圈区域设置为标记所在的区域,因此如果标记不在我的圆圈区域内,则不会显示在地图上。

  3. 谢谢

    这是我用于地图的代码:

        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setCompassEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
        mMap.getUiSettings().setRotateGesturesEnabled(true);
    
        locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
        // Creating a criteria object to retrieve provider
        Criteria criteria = new Criteria();
    
        // Getting the name of the best provider
        String provider = locationManager.getBestProvider(criteria, true);
    
        // Getting Current Location
        Location location = locationManager.getLastKnownLocation(provider);
    
        mMap.setInfoWindowAdapter(new InfoWindowAdapter() {
    
            @Override
            public View getInfoWindow(Marker arg0) {
                return null;
            }
    
            @Override
            public View getInfoContents(Marker marker) {
                View v = getLayoutInflater().inflate(R.layout.marker, null);
                TextView title= (TextView) v.findViewById(R.id.title);
                TextView info= (TextView) v.findViewById(R.id.info);
                title.setText(marker.getTitle().toString());
                info.setText(marker.getSnippet().toString());
                return v;
            }
        });
    
        if(location != null){
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            myPosition = new LatLng(latitude, longitude);   
    
            CameraUpdate center = CameraUpdateFactory.newLatLngZoom(myPosition, 15);
            mMap.moveCamera(center);
            mMap.addMarker(new MarkerOptions()
                .position(myPosition)
                .alpha(0.8f)
                .anchor(0.0f, 1.0f)
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.blue_pin))
                .title("Your position :\n ")
                .snippet(latitude + " and " + longitude));
    
            CircleOptions circleOptions = new CircleOptions()
              .center(myPosition)   //set center
              .radius(rad)   //set radius in meters
              .fillColor(0x402092fd)  //default
              .strokeColor(Color.LTGRAY)
              .strokeWidth(5);
              circle = mMap.addCircle(circleOptions);   
    
              CameraPosition cameraPosition = CameraPosition.builder()
                      .target(myPosition)
                      .zoom(15)
                      .bearing(90)
                      .build();
    
             mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition),2000, null);
        }
    

    谢谢=)

3 个答案:

答案 0 :(得分:3)

您好每次更新您的位置必须使用broadcast.using这个您的服务开始,所以可以把您的地图代码放在线程中,你把延迟1秒,所以你得到位置每秒。你也把这个方法放在广播接收器类。

    public void onReceive(final Context context, Intent intent) {
        this.context = context;
        Log.i(TAG, "onReceive");

        locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            listener = new LocationListener() {

                @Override
                public void onLocationChanged(Location location) {
                    // double valueLatitude = location.getLatitude();
                    // double valueLongitude= location.getLongitude();
                    double precision = Math.pow(10, 6);
                    double valueLatitude = ((int) (precision * location
                            .getLatitude())) / precision;
                    double valueLongitude = ((int) (precision * location
                            .getLongitude())) / precision;
                    Log.i(TAG, "onLocationChanged");
                    Log.v(TAG, "LAT: " + valueLatitude + " & LONG: "
                            + valueLongitude);
                    String lat = String.valueOf(valueLatitude);
                    String lng = String.valueOf(valueLongitude);
                    SessionManager.saveLocation(valueLatitude, valueLongitude, context);
                    Log.v(TAG, "LAT: SESSION" + SessionManager.getlattitude(context));
                    try {
                        if (!SessionManager.getlattitude(context).equals(
                                valueLatitude)
                                || !SessionManager.getlongitude(context)
                                .equals(valueLongitude)) {

                            SessionManager.saveLocation(valueLatitude,
                                    valueLongitude, context);
//                            if (Utils.progrsDia.isShowing()) {
//                                Utils.progrsDia.dismiss();
//                            }
//                            CategoryNearbyFragment.callGetNearByFlyerListListner
//                                    .callGetNearByFlyer(lat, lng);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }

                @Override
                public void onProviderDisabled(String arg0) {
                }

                @Override
                public void onProviderEnabled(String arg0) {
                }

                @Override
                public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
                }

            };
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            locationManager.requestSingleUpdate(
                    LocationManager.NETWORK_PROVIDER, listener, null);
        } else {
            // GlobalData.showSettingsAlert(context);
        }
    }

答案 1 :(得分:0)

第一个问题How to update my current location every 2-5 second and the circle will also move to my new current location

我建议您在Googles Receiving Location Updates指南中查看优秀且完整的示例。

它包含示例代码和您可以立即在ADT中导入的Android项目。

位置服务调用以向您的应用发送位置更新的回调方法在LocationListener接口的onLocationChanged()方法中指定。

您可以更新相机。

对于您的查询How to set my circle area as an area where the marker will place,请按this链接

答案 2 :(得分:0)

我建议使用onLocationChange()方法将刷新的coords加载到lat long变量中,然后使用处理器定时5秒或10秒来使用moveCamera()函数更新map对象,这样你就会获得不太经常烦人的稳定更新!