-1

я обдумывал и веб-серфинг на это в течение дней, но после того, как вокруг производительности в течение недели я решил задать этот вопрос неясного. Мой вопрос. Может ли кто-нибудь рассказать мне, как реализовать направления в моем проекте Android?Отчаянно нужно добавить направления к андроиду проекту

Чтобы уточнить, точная функция, о которой я прошу, выделена в следующем абзаце.

Цель для моего проекта: всякий раз, когда пользователь набирает место (он будет скрывать клавиатуру после нажатия кнопки «идти»), он переместится в это место и поместит там маркер. Затем он отобразит маршрут с наименьшим временем прохождения между текущим местоположением и маркером. Я не знаю, как ограничить страну, в которой пользователь может искать местоположения внутри, но я уверен, что это будет легко. У меня уже есть кусочки моей конечной цели, но не совсем то, что мне нужно.

И, наконец, это моя MainActivity. Я ссылаться несколько классов я не добавил вот так, просто спросите, если вам нужно, чтобы запустить этот код в свой собственный компилятор или иным образом:

public class MainActivity extends FragmentActivity 
     implements GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    @SuppressWarnings("unused") 
    private static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9002; 
    @SuppressWarnings("unused") 
    private static final String LOGTAG = "Maps"; 

    private static final int GPS_ERRORDIALOG_REQUEST = 9001; 
    private static final float DEFAULTZOOM = 15; 
    private GoogleApiClient mGoogleApiClient; 
    private LocationListener mListener; 
    private Marker marker; 

    ArrayList<LatLng> mMarkerPoints; 
    GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (servicesOK()) { 
      setContentView(R.layout.activity_main); 

      if (initMap()) { 
       mGoogleApiClient = new GoogleApiClient.Builder(this) 
         .addApi(LocationServices.API) 
         .addConnectionCallbacks(this) 
         .addOnConnectionFailedListener(this) 
         .build(); 
      } else { 
       Toast.makeText(this, "Hmmm. Maps didn't load.", Toast.LENGTH_SHORT).show(); 
      } 
     } else { 
      Toast.makeText(this, "There's something wrong with your play services", Toast.LENGTH_SHORT).show(); 
     } 

     UiSettings config = mMap.getUiSettings(); 
     config.setMapToolbarEnabled(false); 
     config.setZoomControlsEnabled(false); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 

      case R.id.legal: 
       Intent intent = new Intent(this, LicenseActivity.class); 
       startActivity(intent); 
       break; 

      default: 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mListener); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     MapStateManager mgr = new MapStateManager(this); 
     CameraPosition position = mgr.getSavedCameraPosition(); 
     if (position != null) { 
      CameraUpdate update = CameraUpdateFactory.newCameraPosition(position); 
      mMap.moveCamera(update); 
      mMap.setMapType(mgr.getSavedMapType()); 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     MapStateManager mgr = new MapStateManager(this); 
     mgr.saveMapState(mMap); 
     if (mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    public boolean servicesOK() { 
     int isAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 

     if (isAvailable == ConnectionResult.SUCCESS) { 
      return true; 
     } else if (GooglePlayServicesUtil.isUserRecoverableError(isAvailable)) { 
      Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isAvailable, this, GPS_ERRORDIALOG_REQUEST); 
      dialog.show(); 
     } else { 
      Toast.makeText(this, "Can't connect to Google Play services", Toast.LENGTH_SHORT).show(); 
     } 
     return false; 
    } 

    private boolean initMap() { 
     if (mMap == null) { 
      MapFragment mapFrag = 
        (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
      mMap = mapFrag.getMap(); 
     } 
     return (mMap != null); 
    } 

    @SuppressWarnings("unused") 
    private void gotoLocation(double lat, double lng) { 
     LatLng ll = new LatLng(lat, lng); 
     CameraUpdate update = CameraUpdateFactory.newLatLng(ll); 
     mMap.moveCamera(update); 
    } 

    private void gotoLocation(double lat, double lng, 
           float zoom) { 
     LatLng ll = new LatLng(lat, lng); 
     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, zoom); 
     mMap.moveCamera(update); 
    } 

    public void geoLocate(View v) throws IOException { 

     EditText et = (EditText) findViewById(R.id.editText1); 
     String location = et.getText().toString(); 
     if (location.length() == 0) { 
      Toast.makeText(this, "Please enter a location", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     hideSoftKeyboard(v); 

     Geocoder gc = new Geocoder(this); 
     List<Address> list = gc.getFromLocationName(location, 1); 
     Address add = list.get(0); 
     String locality = add.getLocality(); 
     Toast.makeText(this, locality, Toast.LENGTH_LONG).show(); 

     double lat = add.getLatitude(); 
     double lng = add.getLongitude(); 

     gotoLocation(lat, lng, DEFAULTZOOM); 

     if (marker != null) { 
      marker.remove(); 
     } 

     MarkerOptions options = new MarkerOptions() 
       .position(new LatLng(lat, lng)); 
     marker = mMap.addMarker(options); 
    } 

    private void hideSoftKeyboard(View v) { 
     InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
    } 

    public void showCurrentLocation(MenuItem item) { 
     int permCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION); 
     if (permCheck != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1); 
     } else { 
      Location currentlocation = LocationServices.FusedLocationApi 
        .getLastLocation(mGoogleApiClient); 
      if (currentlocation == null) { 
       Toast.makeText(this, "Couldn't find you!", Toast.LENGTH_SHORT).show(); 
      } else { 
       LatLng latlng = new LatLng(
         currentlocation.getLatitude(), 
         currentlocation.getLongitude() 
       ); 
       CameraUpdate update = CameraUpdateFactory.newLatLngZoom(
         latlng, 15 
       ); 
       mMap.animateCamera(update); 
      } 
     } 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     int permCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION); 
     if (permCheck != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1); 
     } else { 
      Toast.makeText(this, "Go go go!", Toast.LENGTH_SHORT).show(); 

      mListener = new LocationListener() { 
       @Override 
       public void onLocationChanged(Location location) { 
        gotoLocation(location.getLatitude(), location.getLongitude(), 15); 
       } 
      }; 

      LocationRequest request = LocationRequest.create(); 
      request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
      request.setInterval(20000); 
      request.setFastestInterval(0); 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, request, mListener 
      ); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 
} 
+0

Это было juuuuust спрошено: http://stackoverflow.com/questions/38400355/google-directions-api-implementation-on-android/38400815 – mastrgamr

+0

@mastrgamr wow! Когда я вводил этот вопрос, он не появлялся, как я был связан, и я не нашел этого раньше (очевидно, потому что это произошло час назад). Спасибо большое! –

ответ

-1

проверить эту библиотеку на GitHub:

jd-alexander/Google-Directions-Android

Я использую его в своих проектах, и вы можете клонировать его и изменять его в соответствии с вашими конкретными потребностями.

Логика, которую вы имеете в вопросе, кажется звуковой на первый взгляд, но для ограничения местоположений поиска я бы, вероятно, просто взял любой запрос в поле поиска и сравнил его, чтобы узнать, находится ли он в указанном LatLngBounds, который вы предоставляете.

+0

Привет, спасибо за быстрый ответ. Не удалось ответить раньше, потому что я не ожидал, что ответ будет таким быстрым (отправил AFK в бесконечный поиск хорошего кофе)! Что касается вашего ответа, я не совсем понимаю, о чем идет проект github. Должен ли я добавить его через maven или gradle, чтобы я стал легко использовать? Пожалуйста, объясните мой изначальный разум! –

+0

@Rainbowteddycoderguy Если вы немного прокрутите страницу на странице, вы можете найти инструкции по ее использованию. Вы добавляете его через gradle, добавляете RoutingListener в свой класс, который ссылается на «GoogleMap», и обрабатывайте его, как показано на этой странице: https://github.com/jd-alexander/Google-Directions-Android/blob/master/ sample/src/main/java/com/directions/sample/MainActivity.java # L382 – mastrgamr

+0

Я уже прокрутил страницу и понял некоторые вещи (извините, я не упоминал об этом раньше). Как указать, где должен пройти маршрут? –