2017-04-18 38 views
2

我的目標是要完成一個特定的類以下任務繪製路線。如何兩點之間的MapFragment使用谷歌地圖API的Android

我想在谷歌Android地圖API兩個指針(當前位置導航抽屜&預先固定位置)之間給出方向。

  1. 是否有可能或者我需要Directions API?無法在Android Maps API本身中完成指示?

  2. 我的目標是隻使用一個活動或Java文件一樣獲取當前位置,並顯示在地圖中的目的地指針(我做了)的所有任務。現在我想給這兩個指針的路由,當前綴指針或位置被使用改變時,路由必須改變。

通過前綴,我的意思是我已經在onNavigationItemSelected()的if中給出的位置。

請參考下面的代碼這是MainActivity.java - 我的目標是完成所有的任務在一個Java類本身。

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback, LocationListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private GoogleMap mMap; 
private GoogleApiClient client; 

Location location; 
LocationManager locationManager; 

Marker marker; 

String title; 
String subTitle; 
LatLng latLon; 

double latitude; 
double longitude; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.activity_main); 

    isConnectionAvailable(); 
    isGpsAvailable(); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

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

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 

} 

private boolean isConnectionAvailable() { 

    boolean netCon = false; 

    try { 

     //Internet & network information "Object" initialization 
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
     //Internet enable & connectivity checking 
     if ("WIFI".equals(networkInfo.getTypeName()) || "MOBILE".equals(networkInfo.getTypeName()) && networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnectedOrConnecting()) { 
      netCon = true; 
     } 
    } catch (Exception e) { 
     new AlertDialog.Builder(this) 
       .setIcon(android.R.drawable.ic_dialog_alert) 
       .setTitle("No Network Connection!") 
       .setMessage("Please connect your device to either WiFi or switch on Mobile Data, operator charges may apply!") 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         dialog.cancel(); 
         finish(); 
        } 
       }).show(); 
    } 
    return netCon; 
} 

private boolean isGpsAvailable() { 

    boolean gpsCon = false; 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     Toast.makeText(this, "GPS is Enabled.", Toast.LENGTH_SHORT).show(); 
     gpsCon = true; 
    } else { 
     new AlertDialog.Builder(this) 
       .setIcon(android.R.drawable.ic_dialog_alert) 
       .setTitle("GPS is disabled!") 
       .setMessage("Without GPS this application will not work! Would you like to enable the GPS?") 
       .setCancelable(false) 
       .setPositiveButton("Enable GPS", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         Intent callGpsSetting = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
         startActivity(callGpsSetting); 
        } 
       }) 
       .setNegativeButton("Exit.", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         dialog.cancel(); 
         finish(); 
        } 
       }) 
       .show(); 
    } 
    return gpsCon; 
} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     client.disconnect(); 
     super.onBackPressed(); 
    } 
} 

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

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    if (id == R.id.redBuilding){ 
     latitude = 13.0827; 
     longitude = 80.2707; 

     title = "Chennai"; 
     subTitle = "TN"; 

     latLon = new LatLng(latitude, longitude); 
    } 
    mMap.clear(); 
    mMap.addMarker(new MarkerOptions().position(latLon).title(title).snippet(subTitle)).showInfoWindow(); 
    CameraPosition cameraPosition = new CameraPosition.Builder().target(latLon).tilt(30).zoom(20).build(); 
    mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

    if (id == R.id.nav_share) { 
    } else if (id == R.id.nav_send) { 
    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    mMap.setMyLocationEnabled(true); 
    buildGoogleApiClient(); 
} 

private synchronized void buildGoogleApiClient() { 
    client = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    client.connect(); 
} 

public Action getIndexApiAction() { 
    Thing object = new Thing.Builder() 
      .setName("CEG") // TODO: Define a title for the content shown. 
      // TODO: Make sure this auto-generated URL is correct. 
      .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) 
      .build(); 
    return new Action.Builder(Action.TYPE_VIEW) 
      .setObject(object) 
      .setActionStatus(Action.STATUS_TYPE_COMPLETED) 
      .build(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client.connect(); 
    AppIndex.AppIndexApi.start(client, getIndexApiAction()); 
} 

@Override 
public void onStop() { 
    super.onStop(); 

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    if (client.isConnected()) { 
     AppIndex.AppIndexApi.end(client, getIndexApiAction()); 
     client.disconnect(); 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 
    location = LocationServices.FusedLocationApi.getLastLocation(client); 
    if (location != null) { 
     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 
    } 
    LatLng latLon = new LatLng(latitude, longitude); 
    mMap.addMarker(new MarkerOptions().position(latLon) 
      .title("You are here.").snippet("Choose destination from menu to navigate.") 
      .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)) 
    ).showInfoWindow(); 
    CameraPosition cameraPosition = new CameraPosition.Builder().target(latLon).tilt(30).zoom(20).build(); 
    mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onLocationChanged(Location location) { 

    location = location; 

    //Place current location marker 
    LatLng latLon = new LatLng(location.getLatitude(), location.getLongitude()); 
    mMap.clear(); 
    mMap.addMarker(new MarkerOptions().position(latLon) 
      .title("You are here.").snippet("Choose destination from menu to navigate.") 
      .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)) 
    ).showInfoWindow(); 
    CameraPosition cameraPosition = new CameraPosition.Builder().target(latLon).tilt(30).zoom(20).build(); 
    mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

    //stop location updates 
    if (client != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(client, this); 
    } 

} 

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

} 

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 0; 

public boolean checkLocationPermission() { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) { 

     // Asking user if explanation is needed 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

      //Prompt the user once explanation has been shown 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); 

     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
     return false; 
    } else { 
     return true; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted. Do the 
       // contacts-related task you need to do. 
       if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        if (client == null) { 
         buildGoogleApiClient(); 
        } 
        mMap.setMyLocationEnabled(true); 
       } 
      } else { 
       // Permission denied, Disable the functionality that depends on this permission. 
       Toast.makeText(this, "Permission denied", Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 
     // other 'case' lines to check for other permissions this app might request. 
     // You can add here other case statements according to your requirement. 
    } 
} 
} 

我想遍歷從我類似的問題的原因,儘管可用的解決方案是 - 我的目標是隻使用一個Java類,也有使用多個Java類和文件解決方案。

回答

3

您需要的方向API。 這裏是很好的教程:

https://www.androidtutorialpoint.com/intermediate/google-maps-draw-path-two-points-using-google-directions-google-map-android-api-v2/

你可以把所有的代碼在一個類中。但是最好使用多個類。

+0

所以,您的意思是,我不得不使用Android Maps API來使用Directions API。還是應該使用這兩種API? – Isaac

+1

@Isaac您只需從google api儀表板啓用定向服務即可。 –

+0

是的,我已啓用它。所以我必須將其替換爲Maps API,對嗎?那麼,Directions API只提供2500個請求/每天免費和休息是優質! – Isaac

相關問題