2016-11-09 120 views
-2

我正在開發一個應用程序使用谷歌地圖,我想顯示驅動程序當前位置他的管理員。我如何向他的管理員顯示驅動程序的當前位置?我如何追蹤驅動程序當前位置並顯示給他的管理員?如何在Android Studio中的Google地圖上顯示一個用戶當前位置到其他位置?

以下代碼僅顯示驅動程序當前位置。在此如何顯示此驅動程序當前位置給他的管理員?

//java code 
    public class LocationActivity extends FragmentActivity implements 
      com.google.android.gms.location.LocationListener, 
      GoogleApiClient.ConnectionCallbacks, 
      GoogleApiClient.OnConnectionFailedListener { 

     private static final String TAG = "LocationActivity"; 
     private static final long INTERVAL = 1000 * 60 * 1; //1 minute 
     private static final long FASTEST_INTERVAL = 1000 * 60 * 1; // 1 minute 

     private static final float SMALLEST_DISPLACEMENT = 0.25F; //quarter of a meter 
     Button btnFusedLocation; 
     TextView tvLocation; 
     LocationRequest mLocationRequest; 
     GoogleApiClient mGoogleApiClient; 
     Location mCurrentLocation; 
     String mLastUpdateTime; 
     GoogleMap googleMap; 

     private double longitude; 
     private double latitude; 
     private ArrayList<LatLng> points; //added 
     Polyline line; //added 

     protected void createLocationRequest() { 
      mLocationRequest = new LocationRequest(); 
      mLocationRequest.setInterval(INTERVAL); 
      mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
      mLocationRequest.setSmallestDisplacement(SMALLEST_DISPLACEMENT); //added 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     } 
     /* 
     protected void createLocationRequest() { 
      mLocationRequest = new LocationRequest(); 
      mLocationRequest.setInterval(INTERVAL); 
      mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     } */ 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d(TAG, "onCreate ..............................."); 

      points = new ArrayList<LatLng>(); 
      //show error dialog if GoolglePlayServices not available 
      if (!isGooglePlayServicesAvailable()) { 
       finish(); 
      } 
      createLocationRequest(); 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addApi(LocationServices.API) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .build(); 

      setContentView(R.layout.activity_location_google_map); 
      SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.map); 
      googleMap = fm.getMap(); 
      googleMap.getUiSettings().setZoomControlsEnabled(true); 

     /* if (getIntent().getExtras() != null) { 
       final Bundle bundle = getIntent().getBundleExtra("LOCATION"); 
       latitude = bundle.getDouble("LATITUDE"); 
       longitude = bundle.getDouble("LONGITUDE"); */ 

     } 

     @Override 
     public void onStart() { 
      super.onStart(); 
      Log.d(TAG, "onStart fired .............."); 
      mGoogleApiClient.connect(); 
     } 

     @Override 
     public void onStop() { 
      super.onStop(); 
      Log.d(TAG, "onStop fired .............."); 
      mGoogleApiClient.disconnect(); 
      Log.d(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected()); 
     } 

     private boolean isGooglePlayServicesAvailable() { 
      int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
      if (ConnectionResult.SUCCESS == status) { 
       return true; 
      } else { 
       GooglePlayServicesUtil.getErrorDialog(status, this, 0).show(); 
       return false; 
      } 
     } 

     @Override 
     public void onConnected(Bundle bundle) { 
      Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected()); 
      startLocationUpdates(); 
     } 

     protected void startLocationUpdates() { 
      PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
        mGoogleApiClient, mLocationRequest, this); 
      Log.d(TAG, "Location update started ..............: "); 
     } 

     @Override 
     public void onConnectionSuspended(int i) { 

     } 

     @Override 
     public void onConnectionFailed(ConnectionResult connectionResult) { 
      Log.d(TAG, "Connection failed: " + connectionResult.toString()); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      Log.d(TAG, "Firing onLocationChanged.............................................."); 
      mCurrentLocation = location; 
      mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
      addMarker(); 

      longitude = location.getLongitude(); 
      latitude = location.getLatitude(); 
      LatLng latLng = new LatLng(latitude, longitude); //you already have this 
      points.add(latLng); //added 
      redrawLine(); 
     } 

     private void addMarker() { 
      MarkerOptions options = new MarkerOptions(); 

      // following four lines requires 'Google Maps Android API Utility Library' 
      // https://developers.google.com/maps/documentation/android/utility/ 
      // I have used this to display the time as title for location markers 
      // you can safely comment the following four lines but for this info 
      IconGenerator iconFactory = new IconGenerator(this); 
      iconFactory.setStyle(IconGenerator.STYLE_PURPLE); 
      options.icon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon(mLastUpdateTime))); 
      options.anchor(iconFactory.getAnchorU(), iconFactory.getAnchorV()); 

      LatLng currentLatLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude()); 
      options.position(currentLatLng); 
      Marker mapMarker = googleMap.addMarker(options); 
      long atTime = mCurrentLocation.getTime(); 
      mLastUpdateTime = DateFormat.getTimeInstance().format(new Date(atTime)); 
      mapMarker.setTitle(mLastUpdateTime); 
      Log.d(TAG, "Marker added............................."); 
      googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 
        13)); 
      Log.d(TAG, "Zoom done............................."); 
     } 

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

     protected void stopLocationUpdates() { 
      LocationServices.FusedLocationApi.removeLocationUpdates(
        mGoogleApiClient, this); 
      Log.d(TAG, "Location update stopped ......................."); 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 
      if (mGoogleApiClient.isConnected()) { 
       startLocationUpdates(); 
       Log.d(TAG, "Location update resumed ....................."); 
      } 
     } 

     // for map line 
     private void redrawLine(){ 

      googleMap.clear(); //clears all Markers and Polylines 
      PolylineOptions options = new PolylineOptions().width(5).color(Color.BLUE).geodesic(true); 
      for (int i = 0; i < points.size(); i++) { 
       LatLng point = points.get(i); 
       options.add(point); 
      } 
      addMarker(); //add Marker in current position 
      line = googleMap.addPolyline(options); //add Polyline 

     } 

    } 
+0

你需要一個這樣的後端服務器。 –

+0

我是否先保存位置然後再顯示它? – rohiH

回答

0

這可能是解決方案
1.獲取用戶的當前位置和更新您的服務器上的一個。
2.爲後端服務器使用Firebase。它使許多事情更容易。將用戶的位置存儲在Firebase中。
3.在管理面板中,從Firebase中獲取用戶的位置。
一旦用戶在Firebase中更新了用戶的當前位置,您就可以使用通知通知管理員。

+0

你可以請求引薦我任何例子嗎? – rohiH