如何在Android中显示地图中的实际道路路线驾驶模式

Eli*_*eth 7 java android google-maps driving-directions

我有一个Web应用程序,我们在其中添加lat和lng,在Web中它在地图中清楚地显示了行车路线.我已经使用json向android发送相同的详细信息,包括api,lat和经度.但在Android应用程序中,地图没有显示正确的路径.

这是我的地图活动

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    LatLng latLng;
    private SharedPreferenceHelper sharedPreferenceHelper;
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    MyAlertDialogFragment newFragment;
    public final String BEFORE_BUS_POSTION = "BEFORE_BUS_POSTION";
    public final String AFTER_BUS_POSTION = "AFTER_BUS_POSTION";
    public final String CURRENT_BUS_POSTION = "CURRENT_BUS_POSTION";

    public final String GREEN_COLOR_CODE = "#228b22";
    public final String ORANGE_COLOR_CODE = "#C56E00";


    private String[] mNavigationDrawerItemTitles;
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    Toolbar toolbar;
    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    android.support.v7.app.ActionBarDrawerToggle mDrawerToggle;
    private ProgressDialog progress;
    int count = 0;

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        mTitle = mDrawerTitle = getTitle();
        mNavigationDrawerItemTitles= getResources().getStringArray(R.array.navigation_drawer_items_array);
       ....


        sharedPreferenceHelper = new SharedPreferenceHelper(getApplicationContext());
        if (!sharedPreferenceHelper.getBooleanSharedPreferenceName("isRegistred")) {
            RegisterGCM();
        }
        sharedPreferenceHelper.WriteBooleanPreference("notification", true);

        /*Sharedpreference check wheather  app is running for firsttime.*/
        if (!sharedPreferenceHelper.getBooleanSharedPreferenceName("isfirsttime")) {
            sharedPreferenceHelper.WriteBooleanPreference("isfirsttime", true);
            sharedPreferenceHelper.WriteStringPreference("email", getIntent().getStringExtra("email"));
            sharedPreferenceHelper.WriteBooleanPreference("ringtone", true);
            sharedPreferenceHelper.WriteBooleanPreference("notification", true);
        }

        FragmentManager fm = getSupportFragmentManager();
        SupportMapFragment supportMapFragment =  SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.content_frame, supportMapFragment).commit();
        supportMapFragment.getMapAsync(this);
    }
    private class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);
        }

    }

    private void selectItem(int position) {

        AboutFragment aboutfragment = null;
        InfoFragment infofragment = null;
        switch (position) {
            case 0:
                startActivity(new Intent(this, MapsActivity.class));
                break;
            case 1:
                aboutfragment = new AboutFragment();
                break;
            case 2:
                infofragment= new InfoFragment();
                break;

            default:
                break;
        }

        if (aboutfragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, aboutfragment).commit();

            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(mNavigationDrawerItemTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);

        }else if (infofragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, infofragment).commit();

            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(mNavigationDrawerItemTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);

        } else {
            Log.e("MapActivity", "Error in creating fragment");
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }    
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getSupportActionBar().setTitle(mTitle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    void setupToolbar(){
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    void setupDrawerToggle(){
        mDrawerToggle = new android.support.v7.app.ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.app_name, R.string.app_name);
        //This is necessary to change the icon of the Drawer Toggle upon state change.
        mDrawerToggle.syncState();
    }
    private void RegisterGCM() {

        Log.i("HomeActivity", "This device is not supported.");
        if (checkPlayServices()) {

            // Start IntentService to register this application with GCM.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }

    }

    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                if(sharedPreferenceHelper.getBooleanSharedPreferenceName("googleplayservice")) {
                    showDialog();
                }
                Log.i("HomeActivity", "This device is not supported.");
            }
            return false;
        }
        return true;
    }    
    void showDialog() {
        newFragment = MyAlertDialogFragment.newInstance(R.string.google_play_service_not_found);
        newFragment.show(getSupportFragmentManager(), "dialog");
    }

    public static class MyAlertDialogFragment extends DialogFragment {

        AlertDialog alert;

        public static MyAlertDialogFragment newInstance(int title) {
            MyAlertDialogFragment frag = new MyAlertDialogFragment();
            Bundle args = new Bundle();
            args.putInt("title", title);
            frag.setArguments(args);
            return frag;
        }    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            int title = getArguments().getInt("title");

            return new AlertDialog.Builder(getActivity())
                    .setIcon(R.drawable.ic_info_black_24dp)
                    .setTitle(title)
                    .setMessage(R.string.google_play_service_not_found_message)
                    .setPositiveButton("Ok",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    ((MapsActivity)getActivity()).doPositiveClick();
                                }
                            }
                    )
                    .setNegativeButton("Don't show again",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    ((MapsActivity)getActivity()).doNegativeClick();
                                }
                            }
                    ).create();  
        }
    }

    public void doPositiveClick() {
        Log.i("FragmentAlertDialog", "Positive click!");
        newFragment.dismiss();
    }

    public void doNegativeClick() {
        newFragment.dismiss();
        sharedPreferenceHelper.WriteBooleanPreference("googleplayservice", true);
        Log.i("FragmentAlertDialog", "Negative click!");
    }
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        progress=new ProgressDialog(this);
        progress.setMessage("Map Loading");
        progress.show();
        progress.setCanceledOnTouchOutside(false);
        final Handler ha=new Handler();

        ha.postDelayed(new Runnable() {

            @Override
            public void run() {
                //call function
                setLocationFromServerWithRoute();
                ha.postDelayed(this, 2000);
            }
        }, 10000);

        // Add a marker in Sydney and move the camera
/*        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));*/
    }
    private void setLocationFromServerWithRoute() {

        RequestQueue queue = Volley.newRequestQueue(this);

        String email = new SharedPreferenceHelper(getApplicationContext()).getStringSharedPreferenceName("email");
        String url = LoginActivity.URL+ "read.jsp?email="+email;
        Log.d("email",email);

        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>(){
                    @Override
                    public void onResponse(String response) {

                        JSONArray array = new JSONArray();
                        Log.d("Response 10 secs",response);
                        try {
                            array = new JSONArray(response);
                            mMap.clear();
                            for(int n = 0; n < array.length()-1; n++) {

                                JSONObject jsonObject = array.getJSONObject(n);
                                JSONObject jsonObjectNext = array.getJSONObject(n+1);
                                LatLng latLng = new LatLng(jsonObject.getDouble("latitude"), jsonObject.getDouble("longitude"));
                                LatLng latLngNext = new LatLng(jsonObjectNext.getDouble("latitude"), jsonObjectNext.getDouble("longitude"));
                                String address = jsonObject.getString("routename");   
                                Log.d("Response",response);
                                if(jsonObjectNext.getString("busPosition").equals(CURRENT_BUS_POSTION) && n < array.length()-2 ) {
                                    jsonObjectNext = array.getJSONObject(n+2);
                                    latLngNext = new LatLng(jsonObjectNext.getDouble("latitude"), jsonObjectNext.getDouble("longitude"));

                                }                                    if(jsonObject.getString("busPosition").equals(CURRENT_BUS_POSTION)){

                                    mMap.addMarker(new MarkerOptions().position(latLng).title("" + address)
                                                .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_blue)));

                                    Log.d("CURRENT_BUS_POSTION","REACHED");

                                }else if(jsonObject.getString("busPosition").equals(AFTER_BUS_POSTION)){

                                    if(jsonObject.getBoolean("isBusStop")) {
                                        mMap.addMarker(new MarkerOptions().position(latLng).title("" + address)
                                                .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_orange)));
                                    }
                                    mMap.addPolyline(new PolylineOptions()
                                            .add(latLng,latLngNext)
                                            .width(5)
                                            .color(Color.parseColor(ORANGE_COLOR_CODE)));

                                }else if(jsonObject.getString("busPosition").equals(BEFORE_BUS_POSTION)){

                                    if(jsonObject.getBoolean("isBusStop")) {
                                        mMap.addMarker(new MarkerOptions().position(latLng).title("" + address)
                                                .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_green)));
                                    }
                                    mMap.addPolyline(new PolylineOptions()
                                            .add(latLng,latLngNext)
                                            .width(5)
                                            .color(Color.parseColor(GREEN_COLOR_CODE)));    
                                }    
                            }

                            JSONObject jsonObject = array.getJSONObject(array.length() - 1);
                            LatLng latLng = new LatLng(jsonObject.getDouble("latitude"), jsonObject.getDouble("longitude"));
                            String address = jsonObject.getString("routename");

                            if (jsonObject.getString("busPosition").equals(CURRENT_BUS_POSTION)) {
                                mMap.addMarker(new MarkerOptions().position(latLng).title("" + address)
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_blue)));
                            } else if (jsonObject.getString("busPosition").equals(AFTER_BUS_POSTION) && jsonObject.getBoolean("isBusStop")) {
                                mMap.addMarker(new MarkerOptions().position(latLng).title("" + address)
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_orange)));
                            } else if (jsonObject.getString("busPosition").equals(BEFORE_BUS_POSTION) && jsonObject.getBoolean("isBusStop")) {
                                mMap.addMarker(new MarkerOptions().position(latLng).title("" + address)
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_green)));
                            }
                            ;
                    if(count < 2) {

                        Log.v("count",""+count);
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                        mMap.animateCamera(CameraUpdateFactory.zoomTo(16.0f));
                        if(count == 1){
                            progress.hide();
                        }
                        }
                            count ++;
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }      
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                 Toast.makeText(getApplicationContext(),"Error:"+error.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });
        queue.add(stringRequest);    
    }


    private void setLocationFromServer() {  
        RequestQueue queue = Volley.newRequestQueue(this);    
        String email = new SharedPreferenceHelper(getApplicationContext()).getStringSharedPreferenceName("email");
        String url = LoginActivity.URL+ "read.jsp?email="+email;

        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>(){
                    @Override
                    public void onResponse(String response) {
                        Toast.makeText(getApplicationContext(),"Response:"+response,Toast.LENGTH_SHORT).show();
                        Log log = null;
                        log.v("response",""+response);
                        JSONObject jsonObject = null;
                        Double param1 = 0.0;
                        Double param2 = 0.0;
                        Long datecreated = null;
                        String dateCreated = null;
                        Date dateCREATED = null, twoHOURDate;

                        Calendar cal = Calendar.getInstance();
                        cal.add(Calendar.HOUR, -2);
                        Date twoHourBack = cal.getTime();
                        Log.v("twoHourBack::", "" + twoHourBack);
                        Toast.makeText(getApplicationContext(),"+twoHourBack:"+twoHourBack,Toast.LENGTH_SHORT).show();


                        JSONObject jsonObjectData = new JSONObject();
                        JSONArray array = new JSONArray();
                        try {
                            jsonObjectData = new JSONObject(response);
                            array = jsonObjectData.getJSONArray("route");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }


                        ArrayList<BusRoute> arrayList = new ArrayList();
                        for(int n = 0; n < array.length(); n++) {
                            try {
                                JSONObject object = array.getJSONObject(n);
                                BusRoute busRoute = new BusRoute();
                                busRoute.setId(object.getString("routeID"));
                                busRoute.setLatitude(object.getString("latitude"));
                                busRoute.setLongitude(object.getString("longitude"));
                                busRoute.setDate(object.getString("dateCreated"));
                                busRoute.setPlaceWeight(object.getString("busRouteweight"));
                                busRoute.setPlaceId(object.getString("routename"));
                                arrayList.add(busRoute);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                        Collections.sort(arrayList, new Comparator<BusRoute>() {
                            @Override
                            public int compare(BusRoute o1, BusRoute o2) {
                                return o1.getDate().compareTo(o2.getDate());
                            }
                        });




                        boolean isBusLocationPassed = false;
                        for(int n = 0; n < arrayList.size(); n++)
                        {
                            try {

                                BusRoute object = arrayList.get(n);

                                param1 = Double.parseDouble(object.getLatitude());
                                param2 = Double.parseDouble(object.getLongitude());

                                latLng = new LatLng(param1, param2);
                                Geocoder geocoder = new Geocoder(MapsActivity.this, Locale.getDefault());
                                List<Address> addresses = null;
                                try {
                                    addresses = geocoder.getFromLocation(param1, param2, 1);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                String cityName = addresses.get(0).getAddressLine(0);
                                String stateName = addresses.get(0).getAddressLine(1);
                                String countryName = addresses.get(0).getAddressLine(2);
                                log.v("cityName", "" + cityName);
                                log.v("lat", "" + param1);
                                log.v("log", "" + param2);

                                BusRoute objectnext = null;
                                if( n < arrayList.size()-1 ) {
                                    objectnext = arrayList.get(n + 1);
                                }
                                if(object.getId().trim() .equals(jsonObjectData.getString("prevStop").trim())){

                                    Polyline line = mMap.addPolyline(new PolylineOptions()
                                            .add(new LatLng(Double.parseDouble(object.getLatitude()), Double.parseDouble(object.getLongitude())), new LatLng(jsonObjectData.getDouble("latitude"), jsonObjectData.getDouble("Longitude")))
                                            .width(5)
                                            .color(Color.GREEN));
                                    if( objectnext != null ) {
                                        Polyline line2 = mMap.addPolyline(new PolylineOptions()
                                                .add(new LatLng(jsonObjectData.getDouble("Lattitude"), jsonObjectData.getDouble("Longitude")), new LatLng(Double.parseDouble(objectnext.getLatitude()), Double.parseDouble(objectnext.getLongitude())))
                                                .width(5)
                                                .color(Color.parseColor("#C56E00")));
                                    }

                                    log.v("done", "1 " + jsonObjectData.getString("nextStop"));
                                    LatLng latLngCurrent = new LatLng(jsonObjectData.getDouble("Lattitude"), jsonObjectData.getDouble("Longitude"));
                                    mMap.addMarker(new MarkerOptions().position(latLngCurrent).title("" + cityName + "" + stateName + "" + countryName)
                                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_blue)));
                                    mMap.addMarker(new MarkerOptions().position(latLng).title("" + cityName + "" + stateName + "" + countryName)
                                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_green)));
                                    isBusLocationPassed = true;
                                }else if(isBusLocationPassed){
                                    if( objectnext != null ) {

                                        Polyline line = mMap.addPolyline(new PolylineOptions()
                                                .add(new LatLng(Double.parseDouble(object.getLatitude()), Double.parseDouble(object.getLongitude())), new LatLng(Double.parseDouble(objectnext.getLatitude()), Double.parseDouble(objectnext.getLongitude())))
                                                .width(5)
                                                .color(Color.parseColor("#C56E00")));
                                    }
                                    log.v("done", "2 " + jsonObjectData.getString("nextStop"));

                                    mMap.addMarker(new MarkerOptions().position(latLng).title("" + cityName + "" + stateName + "" + countryName)
                                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_orange)));
                                }else{
                                    if( objectnext != null ) {

                                        Polyline line = mMap.addPolyline(new PolylineOptions()
                                                .add(new LatLng(Double.parseDouble(object.getLatitude()), Double.parseDouble(object.getLongitude())), new LatLng(Double.parseDouble(objectnext.getLatitude()), Double.parseDouble(objectnext.getLongitude())))
                                                .width(5)
                                                .color(Color.GREEN));
                                    }
                                    log.v("done", "3 " + jsonObjectData.getString("nextStop"));

                                    mMap.addMarker(new MarkerOptions().position(latLng).title("" + cityName + "" + stateName + "" + countryName)
                                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_green)));

                                }

                                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                                mMap.animateCamera(CameraUpdateFactory.zoomTo(10.0f));



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

                        }

                        Toast.makeText(getApplicationContext(), "Location received, Latitude:" + param1 + " Longitude:" + param2, Toast.LENGTH_SHORT).show();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),"Error:"+error.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });
        queue.add(stringRequest);    
    }       
}
Run Code Online (Sandbox Code Playgroud)

任何帮助?

更新:

我尝试了解决方案一解决方案二

在这两种情况下,我都收到错误:OVER_QUERY_LIMIT

任何人都有这个???

这就是我如何进入android map ..我希望他们在实际的道路上显示.

在此输入图像描述

在网站上,它显示正确...

在此输入图像描述

Fla*_*nix 1

错误

\n\n

超过查询限制意味着您每秒对 API 执行的查询过多或者超出了配额。

\n\n

为了进一步帮助您,我需要详细了解您正在使用哪些 API,因为我不知道我假设您正在使用 Google Maps Roads API,它确实为您提供了您想要的路径。

\n\n

使用限制

\n\n

每个 API 都有使用限制。对于 Roads API,您每秒只能进行 50 次查询 (QPS),并且还有其他限制。要查看有关此 API 的限制列表,我鼓励您检查以下链接:

\n\n\n\n

我没有使用 Roads API!

\n\n

如果您不使用 Roads API,您必须找到您正在使用的 API 及其限制。以下是 Google 地图提供的所有 API 的列表:

\n\n\n\n

好吧,我知道我正在使用哪个 API,而且我已经达到了极限。现在怎么办?

\n\n

一旦弄清楚前面的步骤,您通常有两个主要选择来避免达到限制:

\n\n
    \n
  • 缓存信息
  • \n
  • 限制请求
  • \n
\n\n

每个解决方案都是一个独立的世界,但我将为您提供一些有关概念的说明,以便您可以更轻松地遵循它们:

\n\n\n\n

我特别推荐最后一个链接,它指向官方文档并涵盖缓存和限制。

\n\n

希望能帮助到你 !

\n\n
\n\n

PS:我也对这个问题投了赞成票,但没有看到有人会反对它的真正原因。不过,我确实建议您添加一个最小工作示例,而不是发布所有代码,这会让更多的人愿意帮助您。

\n\n

在 Android 案例中,我通常建议从头开始创建一个尽可能简单的项目来复制您的问题。

\n