如何在android中更改位置更改时刷新地图(如Swiggy / uber App)

时间:2019-01-02 13:09:49

标签: android google-maps

我想更新我的问题。 Cocncept是客户和驱动程序。当驾驶员在路上时,应该相应地刷新位置。地图上的跟踪器可以工作,但是标记不会移动,折线路径也保持不变(不会删除并设置在当前移动位置)。我需要移动标记和折线进行相应设置。我在下面实现了以下逻辑:请帮助

代码:

public class MapActivity extends AppCompatActivity implements OnMapReadyCallback,Tracker.LocationCallback {
        GoogleMap map;
        ArrayList<LatLng> markerPoints;
        TextView tvDistanceDuration;
        String latpick, latdrop, lngpick, lngdrop;
        Marker markerfrom, markerto;
        LatLng fromLatLong, toLatLong;
        @BindView(R.id.btn_back)
        Button btnBack;
        @BindView(R.id.txt_title)
        TextView txtTitle;
        String fromaddress,toaddress,titleone,titletwo;
        Tracker tracker;
        Polyline polyline;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_map);
            ButterKnife.bind(this);
            tracker = new Tracker(this,this);

            try {
                if (getIntent() != null) {
                    latpick = getIntent().getStringExtra("pickuplat");
                    lngpick = getIntent().getStringExtra("pickuplng");
                    latdrop = getIntent().getStringExtra("droplat");
                    lngdrop = getIntent().getStringExtra("droplng");
                    titleone = getIntent().getStringExtra("titleone");
                    titletwo = getIntent().getStringExtra("titletwo");

                    Log.e("LATPICK", latpick);
                    Log.e("LATPICK", lngpick);
                    Log.e("LATPICK", latdrop);Log.e("LATPICK", lngdrop);
                    if(!latpick.equalsIgnoreCase("0")){


                    }



                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            btnBack.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });

            markerPoints = new ArrayList<LatLng>();

            ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                return;
            }



        }
        public void getAddressFromLocation(final double latitude, final double longitude,
                                           final Context context) {
            Thread thread = new Thread() {
                @Override
                public void run() {
                    Geocoder geocoder = new Geocoder(context, Locale.getDefault());
                    String result = null;
                    try {
                        List<Address> addressList = geocoder.getFromLocation(
                                latitude, longitude, 1);
                        if (addressList != null && addressList.size() > 0) {
                            Address address = addressList.get(0);

                            final String addressone = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                            Log.e("addressone",addressone);
                            final String city = addressList.get(0).getLocality();
                            String state = addressList.get(0).getAdminArea();
                            String country = addressList.get(0).getCountryName();
                            String postalCode = addressList.get(0).getPostalCode();
                            String knownName = addressList.get(0).getFeatureName(); // Only if available else return NULL


                            try {


                               runOnUiThread(new Runnable() {

                                    @Override
                                    public void run() {
                                        fromaddress = addressone;
                                        markerfrom = map.addMarker(new MarkerOptions()
                                                .position(fromLatLong)
                                                .title(titleone)
                                                .snippet(fromaddress)
                                                .icon(BitmapDescriptorFactory
                                                        .defaultMarker(
                                                                BitmapDescriptorFactory.HUE_AZURE)));

                                        markerfrom.showInfoWindow();

                                    }
                                });


                            } catch (Exception e) {
                                e.printStackTrace();
                            }


                        }
                    } catch (IOException e) {
                        Log.e("Address", "Unable connect to Geocoder", e);
                    }
                }
            };
            thread.start();
        }

        public void getAddressFromLocation2(final double latitude, final double longitude,
                                           final Context context) {
            Thread thread = new Thread() {
                @Override
                public void run() {
                    Geocoder geocoder = new Geocoder(context, Locale.getDefault());
                    String result = null;
                    try {
                        List<Address> addressList = geocoder.getFromLocation(
                                latitude, longitude, 1);
                        if (addressList != null && addressList.size() > 0) {
                            Address address = addressList.get(0);

                            final String addressone = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                            final String city = addressList.get(0).getLocality();
                            String state = addressList.get(0).getAdminArea();
                            String country = addressList.get(0).getCountryName();
                            String postalCode = addressList.get(0).getPostalCode();
                            String knownName = addressList.get(0).getFeatureName(); // Only if available else return NULL


                            try {


                                runOnUiThread(new Runnable() {

                                    @Override
                                    public void run() {
                                        Log.e("addressone",addressone);
                                        toaddress = addressone;

                                        markerto = map.addMarker(new MarkerOptions()
                                                .position(toLatLong)
                                                .title(titletwo)
                                                .snippet(toaddress)
                                                .icon(BitmapDescriptorFactory
                                                        .defaultMarker(
                                                                BitmapDescriptorFactory.HUE_GREEN)));

                                        markerto.showInfoWindow();

                                    }
                                });


                            } catch (Exception e) {
                                e.printStackTrace();
                            }


                        }
                    } catch (IOException e) {
                        Log.e("Address", "Unable connect to Geocoder", e);
                    }
                }
            };
            thread.start();
        }

        private String getDirectionsUrl(String pickuplat, String pickuplng, String droplat, String droplng) {
            Log.e("TAG", "INSIDE DIRECTIONS");

            // Origin of route
            String str_origin = "origin=" + latpick + "," + lngpick;

            // Destination of route
            String str_dest = "destination=" + latdrop + "," + lngdrop;

            // Sensor enabled
            String sensor = "sensor=false";

            // Building the parameters to the web service
            String parameters = str_origin + "&" + str_dest + "&" + sensor;

            // Output format
            String output = "json";

            String MY_API_KEY = "API KEY"; 

            // Building the url to the web service This IP, site or mobile application is not authorized to use this API key. Request received from IP address 122.178.84.38, with empty referer
            String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters + "&key=" + MY_API_KEY;

            Log.e("", url);

            return url;
        }

        /**
         * A method to download json data from url
         */
        private String downloadUrl(String strUrl) throws IOException {
            String data = "";
            InputStream iStream = null;
            HttpURLConnection urlConnection = null;
            try {
                URL url = new URL(strUrl);

                // Creating an http connection to communicate with url
                urlConnection = (HttpURLConnection) url.openConnection();

                // Connecting to url
                urlConnection.connect();

                // Reading data from url
                iStream = urlConnection.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

                StringBuffer sb = new StringBuffer();

                String line = "";
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }

                data = sb.toString();

                br.close();

            } catch (Exception e) {
                Log.d(" while downloading url", e.toString());
            } finally {
                iStream.close();
                urlConnection.disconnect();
            }
            return data;
        }

        @Override
        public void onMapReady(GoogleMap googleMap) {
            map = googleMap;
            if (ActivityCompat.checkSelfPermission(MapActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MapActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            googleMap.setMyLocationEnabled(true);
            if (googleMap != null) {
                googleMap.getUiSettings().setMapToolbarEnabled(false);
                googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
                    @Override
                    public void onMyLocationChange(Location arg0) {
                        // if(initialocation==0){
                        Location newHotSpot = new Location("My Location");
                        newHotSpot.setLatitude(arg0.getLatitude());
                        newHotSpot.setLongitude(arg0.getLongitude());
                        LatLng latLng = new LatLng(arg0.getLatitude(), arg0.getLongitude());
                        //  }
                    }
                });
                try {



                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }


                   }

        }

        @Override
        protected void onResume() {
            super.onResume();
            tracker.connectClient();
        }

        @Override
        protected void onPause() {
            super.onPause();
            tracker.disConnectClient();
        }

        @Override
        public void onLocationReceived(Location location) {
            if(location!=null){

                latpick = String.valueOf(location.getLatitude());
                lngpick = String.valueOf(location.getLongitude());


                Log.e("location receiver","lattidute"+lngpick+" "+latpick);
                if (markerfrom!=null){
                    markerfrom.remove();
                }            map.clear();

                fromLatLong = new LatLng(Double.parseDouble(latpick), Double.parseDouble(lngpick));


                markerfrom = map.addMarker(new MarkerOptions()
                        .position(fromLatLong)
                        .title(titleone)
                        .snippet(fromaddress)
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(
                                        BitmapDescriptorFactory.HUE_AZURE)));
                markerfrom.showInfoWindow();
                clearPath();

                try {



                    fromLatLong = new LatLng(Double.parseDouble(latpick), Double.parseDouble(lngpick));


                    toLatLong = new LatLng(Double.parseDouble(latdrop), Double.parseDouble(lngdrop));

                    String url = getDirectionsUrl(latpick, lngpick, latdrop, lngdrop);

                    DownloadTask downloadTask = new DownloadTask();

                    // Start downloading json data from Google Directions API
                    downloadTask.execute(url);


                    map.animateCamera(CameraUpdateFactory.newLatLngZoom(fromLatLong, 10));

                    double lat1 = Double.parseDouble(latpick);
                    double log1 = Double.parseDouble(lngpick);
                    map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat1, log1), 13.0f));

                    getAddressFromLocation2(Double.parseDouble(latdrop),Double.parseDouble(lngdrop),MapActivity.this);
                    getAddressFromLocation(Double.parseDouble(latpick),Double.parseDouble(lngdrop),MapActivity.this);


                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }
            }

           // tracker.stopLocationUpdates();
        }
        private void clearPath() {
            if (polyline != null)
                polyline.remove();
            polyline = null;    }
        // Fetches data from url passed
        private class DownloadTask extends AsyncTask<String, Void, String> {

            // Downloading data in non-ui thread
            @Override
            protected String doInBackground(String... url) {

                // For storing data from web service
                String data = "";

                try {
                    // Fetching the data from web service
                    data = downloadUrl(url[0]);
                } catch (Exception e) {
                    Log.d("Background Task", e.toString());
                }
                return data;
            }

            // Executes in UI thread, after the execution of
            // doInBackground()
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);

                ParserTask parserTask = new ParserTask();

                // Invokes the thread for parsing the JSON data
                parserTask.execute(result);
            }
        }

        /**
         * A class to parse the Google Places in JSON format
         */
        private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

            // Parsing the data in non-ui thread
            @Override
            protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

                JSONObject jObject;
                List<List<HashMap<String, String>>> routes = null;

                try {
                    jObject = new JSONObject(jsonData[0]);
                    DirectionsJSONParser parser = new DirectionsJSONParser();

                    // Starts parsing data
                    routes = parser.parse(jObject);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return routes;
            }

            // Executes in UI thread, after the parsing process
            @Override
            protected void onPostExecute(List<List<HashMap<String, String>>> result) {
                ArrayList<LatLng> points = null;
                PolylineOptions lineOptions = null;
                MarkerOptions markerOptions = new MarkerOptions();
                String distance = "";
                String duration = "";

                if (result.size() < 1) {
                    Toast.makeText(getBaseContext(), "No Points", Toast.LENGTH_SHORT).show();
                    return;
                }

                // Traversing through all the routes
                for (int i = 0; i < result.size(); i++) {
                    points = new ArrayList<LatLng>();
                    lineOptions = new PolylineOptions();

                    // Fetching i-th route
                    List<HashMap<String, String>> path = result.get(i);

                    // Fetching all the points in i-th route
                    for (int j = 0; j < path.size(); j++) {
                        HashMap<String, String> point = path.get(j);

                        if (j == 0) {    // Get distance from the list
                            distance = (String) point.get("distance");
                            continue;
                        } else if (j == 1) { // Get duration from the list
                            duration = (String) point.get("duration");

                            continue;
                        }


                        double lat = Double.parseDouble(point.get("lat"));
                        double lng = Double.parseDouble(point.get("lng"));

                        LatLng position = new LatLng(lat, lng);
                        points.add(position);

                    }

                    lineOptions.addAll(points);
                    lineOptions.width(4);
                    lineOptions.color(Color.RED);
                }

                map.addPolyline(lineOptions);
            }
        }


    } 

2 个答案:

答案 0 :(得分:0)

您可以从com.google.android.gms.location包中实现 LocationListener

然后使用 onLocationChanged 方法处理逻辑。

编辑:

将您的课程声明更改为:

public class MapActivity extends AppCompatActivity implements OnMapReadyCallback,Tracker.LocationCallback, LocationListener {

然后添加方法:

 /**
 * Callback that fires when the location changes.
 */
@Override
public void onLocationChanged(Location location) {
    //your logic to move polyline / markers here
}

答案 1 :(得分:0)

您可以从github Google Play Location Samples那里获取android位置示例存储库,您可以使用Foreground Service查看位置更新 并参考Google Maps APIs | Google Developers