如何让公交车在谷歌地图上移动?

时间:2017-03-09 05:55:42

标签: android google-maps

我正在创建总线跟踪Android应用程序和下面的代码工作正常。现在我想要的是当公共汽车从一个地方移动到另一个地方时我从m web服务获得新的经度和经度,所以公共汽车显示在新的位置,但它没有从旧地方移除。同样发生在用户当前位置。我想每隔15秒清除用户和公交车的旧位置。我怎样才能做到这一点?

public class MapActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, OnMapReadyCallback, DirectionFinderListener {

    private SQLiteHandler db;
    private SessionManager session;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    PendingResult<LocationSettingsResult> result;
    final static int REQUEST_LOCATION = 199;
    ImageView btnPreference, btnLocation, btnPassword, btnProfile;
    Spinner spinnerShift, spinnerStops;
    List<String> ShiftArrayList = new ArrayList<String>();
    final List<Integer> ShiftValueArrayList = new ArrayList<Integer>();
    List<String> StopArrayList = new ArrayList<String>();
    final List<Integer> StopValueArrayList = new ArrayList<Integer>();
    int selected_shift, selected_stop;
    GridView gridView;
    private List<Routes> routeList = new ArrayList<Routes>();
    private CustomListAdapter adapter;
    GPSTracker gps;
    List<Marker> originMarkers = new ArrayList<>();
    List<Marker> currentLoc = new ArrayList<>();
    List<Marker> MyLocation1 = new ArrayList<>();
    List<Marker> waypointsMarkers = new ArrayList<>();
    GoogleMap mMap;
    List<Marker> buslocation = new ArrayList<>();
    List<Marker> destinationMarkers = new ArrayList<>();
    List<Polyline> polylinePaths = new ArrayList<>();
    android.os.Handler handler;
    boolean doubleBackToExitPressedOnce = false;
    ConnectionDetector cd;
    Boolean isInternetPresent = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        FindViewById();

        CheckGpsStatus();

        ButtonCLickEvent();

    }

    public void FindViewById() {

        btnPreference = (ImageView) findViewById(R.id.btnPreference);
        btnLocation = (ImageView) findViewById(R.id.btnLocation);
        btnPassword = (ImageView) findViewById(R.id.btnPassword);
        btnProfile = (ImageView) findViewById(R.id.btnProfile);
        spinnerShift = (Spinner) findViewById(R.id.spinnerShift);
        spinnerStops = (Spinner) findViewById(R.id.spinnerStops);
        gridView = (GridView) findViewById(R.id.gridView);
    }

    public void ButtonCLickEvent() {

        btnPreference.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MapActivity.this, SetPreferenceActivity.class);
                startActivity(intent);
            }
        });

        btnPassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MapActivity.this, ResetPasswordActivity.class);
                startActivity(intent);
            }
        });

        btnProfile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MapActivity.this, ProfileActivity.class);
                startActivity(intent);
            }
        });

    }

    public void CheckGpsStatus() {

        final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();
            mGoogleApiClient.connect();

            cd = new ConnectionDetector(getApplicationContext());
            isInternetPresent = cd.isConnectingToInternet();

            if (isInternetPresent){
                apiShift();
            }else {
                final SweetAlertDialog alert = new SweetAlertDialog(MapActivity.this, SweetAlertDialog.WARNING_TYPE);
                alert.setTitleText("No Internet");
                alert.setContentText("Please connect to internet..");
                alert.show();
            }



            handler = new Handler();
            handler.postDelayed(runLocation, 15000);


            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);

        } else {

            apiShift();

            handler = new Handler();
            handler.postDelayed(runLocation, 15000);


            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }
    }

    public void apiShift() {

        VolleyWebService.makeJsonObjectRequest(MapActivity.this, Request.Method.GET, AppConfig.ShiftData, null, new VolleyResponseListener() {
            @Override
            public void onResponse(JSONObject response) {

                try {

                    JSONObject jObj = new JSONObject(String.valueOf(response));
                    JSONArray json_user = jObj.getJSONArray("Message");
                    for (int i = 0; i < json_user.length(); i++) {

                        try {

                            JSONObject obj = json_user.getJSONObject(i);
                            ShiftArrayList.add(obj.getString("shift_name"));
                            ShiftValueArrayList.add(Integer.valueOf(obj.getString("shift_id")));

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

                    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(MapActivity.this, R.layout.spinner, ShiftArrayList);
                    dataAdapter.notifyDataSetChanged();
                    spinnerShift.setAdapter(dataAdapter);

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

            @Override
            public void onError(String message) {
                Toast.makeText(MapActivity.this, "Server not responding..", Toast.LENGTH_SHORT).show();
            }
        });

        spinnerShift.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                selected_shift = Integer.parseInt(ShiftValueArrayList.get(position).toString());
                String shift_id = ShiftValueArrayList.get(position).toString();

                apiRoutes(shift_id);

                apiStops(shift_id);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }

    public void apiStops(final String shiftId) {

        String url = AppConfig.StopData + "shift_id=" + shiftId;

        VolleyWebService.makeJsonObjectRequest(MapActivity.this, Request.Method.GET, url, null, new VolleyResponseListener() {
            @Override
            public void onResponse(JSONObject response) {

                try {
                    StopArrayList.clear();
                    StopValueArrayList.clear();
                    JSONObject jObj = new JSONObject(String.valueOf(response));
                    JSONArray json_user = jObj.getJSONArray("Message");

                    for (int i = 0; i < json_user.length(); i++) {

                        try {

                            JSONObject obj = json_user.getJSONObject(i);
                            StopArrayList.add(obj.getString("stop_name"));
                            StopValueArrayList.add(Integer.valueOf(obj.getString("stop_id")));

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

                    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(MapActivity.this, R.layout.spinner_stop, StopArrayList);
                    dataAdapter.notifyDataSetChanged();
                    spinnerStops.setAdapter(dataAdapter);

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

            @Override
            public void onError(String message) {
                Toast.makeText(MapActivity.this, "Server not responding..", Toast.LENGTH_SHORT).show();
            }
        });

        spinnerStops.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                selected_stop = Integer.parseInt(StopValueArrayList.get(position).toString());
                String stop_id = StopValueArrayList.get(position).toString();

                apiDrawRoute(shiftId, stop_id);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

    }

    public void apiRoutes(String shift_id) {

        String url = AppConfig.RouteData + "shift_id_tabular=" + shift_id;

        VolleyWebService.makeJsonObjectRequest(MapActivity.this, Request.Method.GET, url, null, new VolleyResponseListener() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONObject mainObj = new JSONObject(String.valueOf(response));
                    if (mainObj != null) {
                        routeList.clear();
                        JSONArray list = mainObj.getJSONArray("Message");
                        if (list != null) {
                            for (int i = 0; i < list.length(); i++) {
                                JSONObject elem = list.getJSONObject(i);

                                Routes routes = new Routes();
                                routes.setSrNo(elem.getString("rn"));
                                routes.setName(elem.getString("location"));
                                routes.setTime(elem.getString("actual_time"));
                                routes.setStatus(elem.getString("run_status"));
                                routeList.add(routes);

                                }
                            }
                        }
                    }
                    adapter = new CustomListAdapter(MapActivity.this, routeList);
                    gridView.setAdapter(adapter);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onError(String message) {
                Toast.makeText(MapActivity.this, "Server not responding", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public void onConnected(Bundle bundle) {

        mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setInterval(30 * 1000);
        mLocationRequest.setFastestInterval(5 * 1000);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
        builder.setAlwaysShow(true);

        result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult result) {
                final Status status = result.getStatus();

                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:

                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

                        try {

                            status.startResolutionForResult(
                                    MapActivity.this,
                                    REQUEST_LOCATION);
                        } catch (IntentSender.SendIntentException e) {

                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

                        break;
                }
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("onActivityResult()", Integer.toString(resultCode));


        switch (requestCode) {
            case REQUEST_LOCATION:
                switch (resultCode) {
                    case Activity.RESULT_OK: {

                        break;
                    }
                    case Activity.RESULT_CANCELED: {

                        finish();
                        break;
                    }
                    default: {
                        break;
                    }
                }
                break;
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        super.onOptionsItemSelected(item);

        switch (item.getItemId()) {
            case R.id.logout:
                db = new SQLiteHandler(getApplicationContext());
                session = new SessionManager(getApplicationContext());
                session.setLogin(false);
                db.deleteUsers();


                Intent intent = new Intent(MapActivity.this, LoginActivity.class);
                startActivity(intent);
                finish();
        }
        return true;
    }

    public void apiDrawRoute(String shiftId, String stopId) {
        String url = AppConfig.RouteData + "shiftid=" + shiftId + "&stopid=" + stopId;
        VolleyWebService.makeJsonObjectRequest(MapActivity.this, Request.Method.GET, url, null, new VolleyResponseListener() {
            @Override
            public void onResponse(JSONObject response) {

                try {

                    JSONObject jObj = new JSONObject(String.valueOf(response));
                    JSONArray json_user = jObj.getJSONArray("Message");

                    for (int i = 0; i < json_user.length(); i++) {

                        try {

                            JSONObject obj = json_user.getJSONObject(i);

                            List<String> wp = new ArrayList<String>();

                            for (int w1 = 0; w1 < json_user.length(); w1++) {
                                wp.add(obj.getString("waypoints_latitude") + ',' + obj.getString("waypoints_longitude") + '|');
                            }
                            sendRequest(obj.getString("start_location"), obj.getString("end_location"), wp);

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

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

            @Override
            public void onError(String message) {
                Toast.makeText(MapActivity.this, "Server not responding..", Toast.LENGTH_SHORT).show();
            }
        });

        spinnerShift.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                selected_shift = Integer.parseInt(ShiftValueArrayList.get(position).toString());
                String shift_id = ShiftValueArrayList.get(position).toString();

                apiRoutes(shift_id);

                apiStops(shift_id);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.clear();
        MyLocation1.clear();
        gps = new GPSTracker(MapActivity.this);
        if (gps.CanGetLocation()) {
            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();

            LatLng mylocation = new LatLng(latitude, longitude);

            if (MyLocation1 != null) {
                for (Marker marker : MyLocation1) {
                    marker.remove();
                }
            }
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mylocation, 10));

            MyLocation1.add(mMap.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.curr_location))
                    .title("My Location")
                    .position(mylocation)));
            Circle circle = mMap.addCircle(new CircleOptions()
                    .center(mylocation)
                    .radius(1000)
                    .strokeColor(0x10000000)
                    .fillColor(0x10000000));
        } else {
            //gps.showSettingsAlert();
        }
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {


            return;
        }
        mMap.setMyLocationEnabled(true);
    }


    public Runnable runLocation = new Runnable() {
        @Override
        public void run() {

            gps = new GPSTracker(MapActivity.this);

            MyLocation1.clear();
            if (gps.CanGetLocation()) {
                double latitude = gps.getLatitude();
                double longitude = gps.getLongitude();
                LatLng mylocation = new LatLng(latitude, longitude);

                if (MyLocation1 != null) {
                    for (Marker marker : MyLocation1) {
                        marker.remove();
                    }
                }

                MyLocation1.add(mMap.addMarker(new MarkerOptions()
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.curr_location))
                        .title("My Location")
                        .position(mylocation)));
                Circle circle = mMap.addCircle(new CircleOptions()
                        .center(mylocation)
                        .radius(1000)
                        .strokeColor(0x10000000)
                        .fillColor(0x10000000));
            } else {
                // gps.showSettingsAlert();
            }
            String tag_json_obj = "json_obj_req";
            String url = AppConfig.RouteData + "i=1&" + "y=1";

            JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    try {

                        JSONObject jObj = new JSONObject(String.valueOf(response));
                        JSONArray json_user = jObj.getJSONArray("Message");
                        currentLoc.clear();
                        for (int i = 0; i < json_user.length(); i++) {

                            try {

                                JSONObject obj = json_user.getJSONObject(i);

                                Double currLat = obj.getDouble("actual_lat");
                                Double currLong = obj.getDouble("actual_long");
                                LatLng hcmus = new LatLng(currLat, currLong);
                                currentLoc.add(mMap.addMarker(new MarkerOptions()
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus))
                                        .title("Bus No" + obj.getString("bus_id"))
                                        .position(hcmus)));

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

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MapActivity.this, "Server not responding..", Toast.LENGTH_SHORT).show();
                }
            });

            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

            MapActivity.this.handler.postDelayed(MapActivity.this.runLocation, 15000);
        }

    };

    private void sendRequest(String Sl, String El, List Wp) {
        String origin = Sl.toString();
        String destination = El.toString();
        List waypoints = Wp;
        if (origin.isEmpty()) {
            Toast.makeText(this, "Please enter origin address!", Toast.LENGTH_SHORT).show();
            return;
        }
        if (destination.isEmpty()) {
            Toast.makeText(this, "Please enter destination address!", Toast.LENGTH_SHORT).show();
            return;
        }

        try {
            new DirectionFinder(MapActivity.this, origin, destination, waypoints).execute();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDirectionFinderStart() {


        if (originMarkers != null) {
            for (Marker marker : originMarkers) {
                marker.remove();
            }
        }

        if (destinationMarkers != null) {
            for (Marker marker : destinationMarkers) {
                marker.remove();
            }
        }

        if (polylinePaths != null) {
            for (Polyline polyline : polylinePaths) {
                polyline.remove();
            }
        }
    }

    @Override
    public void onDirectionFinderSuccess(List<Route> routes) {
        polylinePaths = new ArrayList<>();
        originMarkers = new ArrayList<>();
        destinationMarkers = new ArrayList<>();
        waypointsMarkers = new ArrayList<>();
        buslocation = new ArrayList<>();
        mMap.clear();

        for (Route route : routes) {
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(route.startLocation, 16));
            ((TextView) findViewById(R.id.tvDuration)).setText(route.duration.text);
            ((TextView) findViewById(R.id.tvDistance)).setText(route.distance.text);

            originMarkers.add(mMap.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))
                    .title(route.startAddress)
                    .position(route.startLocation)));
//            waypointsMarkers.add(mMap.addMarker(new MarkerOptions()
//                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.end_green))
//                    .title(route.waypointsAddress)
//                    .position(route.waypointsLocation)));
            for (int i = 0; i < route.jlegs.size(); i++) {
                destinationMarkers.add(mMap.addMarker(new MarkerOptions()
                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE))
                        .title(route.jaddress.get(i))
                        .position(route.jlegs.get(i))));
            }
            destinationMarkers.add(mMap.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE))
                    .title(route.endAddress)
                    .position(route.endLocation)));
//            final LatLng MELBOURNE = new LatLng(24.571982, 73.725597);
//            buslocation.add(mMap.addMarker(new MarkerOptions()
//                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus))
//                    .title("Bus Location")
//                    .position(MELBOURNE)));
//            final LatLng MELBOURNE = new LatLng(24.571982, 73.725597);


            PolylineOptions polylineOptions = new PolylineOptions().
                    geodesic(true).
                    color(Color.BLUE).
                    width(5);

            for (int i = 0; i < route.points.size(); i++)
                polylineOptions.add(route.points.get(i));

            polylinePaths.add(mMap.addPolyline(polylineOptions));

//            setUpMapIfNeeded();
        }
    }



    @Override
    public void onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            return;
        }

        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    }
}

1 个答案:

答案 0 :(得分:2)

在每次更新时清理并重新加载您的位置列表。!