0

我正在實施顯示最近餐館的應用程序。我想要有兩個活動,一個在地圖中顯示餐廳,另一個在ListView中顯示。將Google Places商品添加到ListView中

這是檢索數據添加標記的代碼。

public class GetNearbyPlacesData extends AsyncTask<Object, String, String> { 

    String googlePlacesData; 
    GoogleMap mMap; 
    String url; 

    @Override 
    protected String doInBackground(Object... params) { 
     try { 
      Log.d("GetNearbyPlacesData", "doInBackground entered"); 
      mMap = (GoogleMap) params[0]; 
      url = (String) params[1]; 
      DownloadUrl downloadUrl = new DownloadUrl(); 
      googlePlacesData = downloadUrl.readUrl(url); 
      Log.d("GooglePlaceData", googlePlacesData); 
      Log.d("GooglePlacesReadTask", "doInBackground Exit"); 
     } catch (Exception e) { 
      Log.d("GooglePlacesReadTask", e.toString()); 
     } 
     return googlePlacesData; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.d("GooglePlacesReadTask", "onPostExecute Entered"); 
     List<HashMap<String, String>> nearbyPlacesList = null; 
     DataParser dataParser = new DataParser(); 
     nearbyPlacesList = dataParser.parse(result); 
     Log.d("List of restaurants",nearbyPlacesList.toString()); 
     ShowNearbyPlaces(nearbyPlacesList); 
     Log.d("GooglePlacesReadTask", "onPostExecute Exit"); 
    } 

    private void ShowNearbyPlaces(List<HashMap<String, String>> nearbyPlacesList) { 
     for (int i = 0; i < nearbyPlacesList.size(); i++) { 
      Log.d("onPostExecute","Entered into showing locations"); 
      MarkerOptions markerOptions = new MarkerOptions(); 
      HashMap<String, String> googlePlace = nearbyPlacesList.get(i); 
      double lat = Double.parseDouble(googlePlace.get("lat")); 
      double lng = Double.parseDouble(googlePlace.get("lng")); 
      String placeName = googlePlace.get("place_name"); 
      String vicinity = googlePlace.get("vicinity"); 
      LatLng latLng = new LatLng(lat, lng); 
      markerOptions.position(latLng); 
      markerOptions.title(placeName + " : " + vicinity); 
      mMap.addMarker(markerOptions); 
      markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); 
      //move map camera 
      mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
      mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 
     } 
    } 
} 

該分析數據的代碼:

public class DataParser { 
    public List<HashMap<String, String>> parse(String jsonData) { 
     JSONArray jsonArray = null; 
     JSONObject jsonObject; 

     try { 
      Log.d("Places", "parse"); 
      jsonObject = new JSONObject(jsonData); 
      jsonArray = jsonObject.getJSONArray("results"); 
     } catch (JSONException e) { 
      Log.d("Places", "parse error"); 
      e.printStackTrace(); 
     } 
     return getPlaces(jsonArray); 
    } 

    private List<HashMap<String, String>> getPlaces(JSONArray jsonArray) { 
     int placesCount = jsonArray.length(); 
     List<HashMap<String, String>> placesList = new ArrayList<>(); 
     HashMap<String, String> placeMap = null; 
     Log.d("Places", "getPlaces"); 

     for (int i = 0; i < placesCount; i++) { 
      try { 
       placeMap = getPlace((JSONObject) jsonArray.get(i)); 
       placesList.add(placeMap); 
       Log.d("Places", "Adding places"); 

      } catch (JSONException e) { 
       Log.d("Places", "Error in Adding places"); 
       e.printStackTrace(); 
      } 
     } 
     return placesList; 
    } 

    private HashMap<String, String> getPlace(JSONObject googlePlaceJson) { 
     HashMap<String, String> googlePlaceMap = new HashMap<String, String>(); 
     String placeName = "-NA-"; 
     String vicinity = "-NA-"; 
     String latitude = ""; 
     String longitude = ""; 
     String reference = ""; 

     Log.d("getPlace", "Entered"); 

     try { 
      if (!googlePlaceJson.isNull("name")) { 
       placeName = googlePlaceJson.getString("name"); 
      } 
      if (!googlePlaceJson.isNull("vicinity")) { 
       vicinity = googlePlaceJson.getString("vicinity"); 
      } 
      latitude = googlePlaceJson.getJSONObject("geometry").getJSONObject("location").getString("lat"); 
      longitude = googlePlaceJson.getJSONObject("geometry").getJSONObject("location").getString("lng"); 
      reference = googlePlaceJson.getString("reference"); 
      googlePlaceMap.put("place_name", placeName); 
      googlePlaceMap.put("vicinity", vicinity); 
      googlePlaceMap.put("lat", latitude); 
      googlePlaceMap.put("lng", longitude); 
      googlePlaceMap.put("reference", reference); 
      Log.d("getPlace", "Putting Places"); 
     } catch (JSONException e) { 
      Log.d("getPlace", "Error"); 
      e.printStackTrace(); 
     } 
     return googlePlaceMap; 
    } 
} 

這是HttpConnection的:

public class DownloadUrl { 

    public String readUrl(String strUrl) throws IOException { 
     String data = ""; 
     InputStream iStream = null; 
     HttpURLConnection urlConnection = null; 
     try { 
      URL url = new URL(strUrl); 

      // Creating an http connection to communicate with url 
      urlConnection = (HttpURLConnection) url.openConnection(); 

      // Connecting to url 
      urlConnection.connect(); 

      // Reading data from url 
      iStream = urlConnection.getInputStream(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

      StringBuffer sb = new StringBuffer(); 

      String line = ""; 
      while ((line = br.readLine()) != null) { 
       sb.append(line); 
      } 

      data = sb.toString(); 
      Log.d("downloadUrl", data.toString()); 
      br.close(); 

     } catch (Exception e) { 
      Log.d("Exception", e.toString()); 
     } finally { 
      iStream.close(); 
      urlConnection.disconnect(); 
     } 
     return data; 
    } 
} 

這就是我試圖做檢索回覆:

public class ListRestActivity extends AppCompatActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new GetNearbyPlacesData().execute(); 
    } 


} 

編輯

新增的活動,獲取我的緯度和經度,構建我的網址:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    LocationListener { 

private GoogleMap mMap; 
double latitude; 
double longitude; 
private int PROXIMITY_RADIUS = 10000; 
GoogleApiClient mGoogleApiClient; 
Location mLastLocation; 
Marker mCurrLocationMarker; 
LocationRequest mLocationRequest; 

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

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     checkLocationPermission(); 
    } 

    //Check if Google Play Services Available or not 
    if (!CheckGooglePlayServices()) { 
     Log.d("onCreate", "Finishing test case since Google Play Services are not available"); 
     finish(); 
    } 
    else { 
     Log.d("onCreate","Google Play Services available."); 
    } 

    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
} 

private boolean CheckGooglePlayServices() { 
    GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance(); 
    int result = googleAPI.isGooglePlayServicesAvailable(this); 
    if(result != ConnectionResult.SUCCESS) { 
     if(googleAPI.isUserResolvableError(result)) { 
      googleAPI.getErrorDialog(this, result, 
        0).show(); 
     } 
     return false; 
    } 
    return true; 
} 


/** 
* Manipulates the map once available. 
* This callback is triggered when the map is ready to be used. 
* This is where we can add markers or lines, add listeners or move the camera. In this case, 
* we just add a marker near Sydney, Australia. 
* If Google Play services is not installed on the device, the user will be prompted to install 
* it inside the SupportMapFragment. This method will only be triggered once the user has 
* installed Google Play services and returned to the app. 
*/ 
@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 

    //Initialize Google Play Services 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      buildGoogleApiClient(); 
      mMap.setMyLocationEnabled(true); 
     } 
    } 
    else { 
     buildGoogleApiClient(); 
     mMap.setMyLocationEnabled(true); 
    } 


     String Restaurant = "restaurant"; 

      mMap.clear(); 
      String url = getUrl(latitude, longitude, Restaurant); 
      Object[] DataTransfer = new Object[2]; 
      DataTransfer[0] = mMap; 
      DataTransfer[1] = url; 
      GetNearbyPlacesData getNearbyPlacesData = new GetNearbyPlacesData(); 
      getNearbyPlacesData.execute(DataTransfer); 
      Toast.makeText(MapsActivity.this,"Nearby Restaurants", Toast.LENGTH_LONG).show(); 



} 

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

@Override 
public void onConnected(Bundle bundle) { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(1000); 
    mLocationRequest.setFastestInterval(1000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 
} 

private String getUrl(double latitude, double longitude, String nearbyPlace) { 

    //Place current location marker 
    latitude = 45.772; 
    longitude = 21.219; 

    StringBuilder googlePlacesUrl = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
    googlePlacesUrl.append("location=" + latitude + "," + longitude); 
    googlePlacesUrl.append("&radius=" + PROXIMITY_RADIUS); 
    googlePlacesUrl.append("&type=" + nearbyPlace); 
    googlePlacesUrl.append("&sensor=true"); 
    googlePlacesUrl.append("&key=" + "-"); 
    Log.d("getUrl", googlePlacesUrl.toString()); 
    return (googlePlacesUrl.toString()); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onLocationChanged(Location location) { 
    Log.d("onLocationChanged", "entered"); 

    mLastLocation = location; 
    if (mCurrLocationMarker != null) { 
     mCurrLocationMarker.remove(); 
    } 

    //Place current location marker 
    latitude = location.getLatitude(); 
    longitude = location.getLongitude(); 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(latLng); 
    markerOptions.title("Current Position"); 
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
    mCurrLocationMarker = mMap.addMarker(markerOptions); 

    //move map camera 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 
    Toast.makeText(MapsActivity.this,"Your Current Location", Toast.LENGTH_LONG).show(); 

    Log.d("onLocationChanged", String.format("latitude:%.3f longitude:%.3f",latitude,longitude)); 

    //stop location updates 
    if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     Log.d("onLocationChanged", "Removing Location Updates"); 
    } 
    Log.d("onLocationChanged", "Exit"); 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 

} 

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
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 (mGoogleApiClient == 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. 
    } 
} 

}

logcat的:

1-16 16:18:12.101 4224-4224/com.upt.cti.nearbyrestaurant E/AndroidRuntime: FATAL EXCEPTION: main 
                      java.lang.NullPointerException 
                       at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116) 
                       at org.json.JSONTokener.nextValue(JSONTokener.java:94) 
                       at org.json.JSONObject.<init>(JSONObject.java:154) 
                       at org.json.JSONObject.<init>(JSONObject.java:171) 
                       at com.upt.cti.nearbyrestaurant.DataParser.parse(DataParser.java:25) 
                       at com.upt.cti.nearbyrestaurant.GetNearbyPlacesData.onPostExecute(GetNearbyPlacesData.java:46) 
                       at com.upt.cti.nearbyrestaurant.GetNearbyPlacesData.onPostExecute(GetNearbyPlacesData.java:19) 
                       at android.os.AsyncTask.finish(AsyncTask.java:631) 
                       at android.os.AsyncTask.access$600(AsyncTask.java:177) 
                       at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
                       at android.os.Handler.dispatchMessage(Handler.java:99) 
                       at android.os.Looper.loop(Looper.java:137) 
                       at android.app.ActivityThread.main(ActivityThread.java:4963) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:511) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
                       at dalvik.system.NativeStart.main(Native Method) 

我得到一個NullpointerException。這是不夠的?有人能幫助我嗎?

+0

我們需要整個logcat的消息。請在這裏發帖,否則很難幫助你。 –

+0

@AndreiT:我添加了LogCat – didi

+0

嘗試調試應用程序並檢查結果json是否爲有效的json文件,因爲它似乎解析失敗。 –

回答

0

我使用了Androidhive的優秀教程,link here.您是否檢查過,您是否在onPostExecute中獲得了一些結果?它在解析或檢索時變爲空?

+0

我是否必須獲取當前位置(經度和緯度)並再次進行網址調用? – didi

0

地圖Activity.java

package com.android.trainee.activity; 

import android.Manifest; 
import android.content.Intent; 
import android.content.IntentSender; 
import android.content.pm.PackageManager; 
import android.location.Address; 
import android.location.Geocoder; 
import android.location.Location; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.content.ContextCompat; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

import com.android.trainee.R; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.PendingResult; 
import com.google.android.gms.common.api.Result; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.common.api.Status; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.location.LocationSettingsRequest; 
import com.google.android.gms.location.LocationSettingsStatusCodes; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

import java.util.ArrayList; 
import java.util.List; 

public class MapsActivity extends FragmentActivity implements 
OnMapReadyCallback, 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    LocationListener { 
GoogleMap mGoogleMap; 
LocationRequest mLocationRequest; 
private GoogleApiClient googleApiClient; 
Location mLastLocation; 
Marker mCurrLocationMarker; 
private final int[] MAP_TYPES = {GoogleMap.MAP_TYPE_SATELLITE, 
     GoogleMap.MAP_TYPE_NORMAL, 
     GoogleMap.MAP_TYPE_HYBRID, 
     GoogleMap.MAP_TYPE_TERRAIN, 
     GoogleMap.MAP_TYPE_NONE}; 
private int curMapTypeIndex = 1; 
int REQUEST_CHECK_SETTINGS = 100; 
Marker currLocationMarker; 
MarkerOptions markerOptions; 
String result; 
View mapView; 
ListView simpleList; 
ArrayList<String> aa = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 
    // Obtain the SupportMapFragment and get notified when the map is ready 
to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) 
getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapView = mapFragment.getView(); 
    mapFragment.getMapAsync(this); 
    simpleList = (ListView) findViewById(R.id.simpleListView); 


} 

private void gps() { 
    if (googleApiClient == null) { 
     googleApiClient = new 
GoogleApiClient.Builder(getApplicationContext()) 
       .addApi(LocationServices.API).build(); 
     googleApiClient.connect(); 
     location(); 
    } 
} 

private void location() { 
    LocationRequest locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(1000); 
    locationRequest.setFastestInterval(100); 
    LocationSettingsRequest.Builder builder = new 
LocationSettingsRequest.Builder() 
      .addLocationRequest(locationRequest); 
    builder.setAlwaysShow(false); // this is the key ingredient 
    PendingResult result = LocationServices.SettingsApi. 
      checkLocationSettings(googleApiClient, builder.build()); 
    result.setResultCallback(new ResultCallback() { 
     @Override 
     public void onResult(@NonNull Result result) { 
      final Status status = result.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        try { 
         status.startResolutionForResult(MapsActivity.this, 
REQUEST_CHECK_SETTINGS); 
        } catch (IntentSender.SendIntentException e) { 
        } 
        break; 
       case 
LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        break; 
      } 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent 
data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_CHECK_SETTINGS) { 
     if (resultCode == RESULT_OK) { 

      Toast.makeText(getApplicationContext(), "GPS enabled", 
Toast.LENGTH_LONG).show(); 
     } else { 
      location(); 
     } 

    } 
} 


/** 
* Manipulates the map once available. 
* This callback is triggered when the map is ready to be used. 
* This is where we can add markers or lines, add listeners or move the 
camera. In this case, 
* we just add a marker near Sydney, Australia. 
* If Google Play services is not installed on the device, the user will be 
prompted to install 
* it inside the SupportMapFragment. This method will only be triggered once 
the user has 
* installed Google Play services and returned to the app. 
*/ 
@Override 
public void onMapReady(GoogleMap googleMap) { 
    gps(); 
    mGoogleMap = googleMap; 
    mGoogleMap.setMapType(MAP_TYPES[curMapTypeIndex]); 
    //Initialize Google Play Services 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      //Location Permission already granted 
      mGoogleMap.setMyLocationEnabled(true); 
      //  mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
      mGoogleMap.setOnMapClickListener(new 
GoogleMap.OnMapClickListener() { 
       @Override 
       public void onMapClick(LatLng latLng) { 
        //save current location 
        getAddress(latLng); 
        location(latLng); 
       } 
      }); 
      if (mapView != null && 
        mapView.findViewById(Integer.parseInt("1")) != null) { 
       // Get the button view 
       View locationButton = ((View) 
mapView.findViewById(Integer.parseInt("1")) 
         .getParent()).findViewById(Integer.parseInt("2")); 
       // and next place it, on bottom right (as Google Maps app) 
       RelativeLayout.LayoutParams layoutParams = 
(RelativeLayout.LayoutParams) 
         locationButton.getLayoutParams(); 
       // position on right bottom 
       layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); 
       layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 
RelativeLayout.TRUE); 
       layoutParams.setMargins(0, 0, 30, 30); 
      } 

      mGoogleMap.setOnCameraChangeListener(new 
GoogleMap.OnCameraChangeListener() { 
       @Override 
       public void onCameraChange(final CameraPosition 
cameraPosition) { 
        mGoogleMap.setOnMapLoadedCallback(new 
GoogleMap.OnMapLoadedCallback() { 
         @Override 
         public void onMapLoaded() { 
          LatLng latLng = 
mGoogleMap.getCameraPosition().target; 
          getAddress(latLng); 
         } 
        }); 
       } 
      }); 

     } else { 
      //Request Location Permission 
      gps(); 
     } 
    } else { 
     mGoogleMap.setMyLocationEnabled(true); 
     // mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
     mGoogleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 
{ 
      @Override 
      public void onMapClick(LatLng latLng) { 
       //save current location 
       getAddress(latLng); 
       location(latLng); 
      } 
     }); 
     if (mapView != null && 
       mapView.findViewById(Integer.parseInt("1")) != null) { 
      // Get the button view 
      View locationButton = ((View) 
mapView.findViewById(Integer.parseInt("1")) 
        .getParent()).findViewById(Integer.parseInt("2")); 
      // and next place it, on bottom right (as Google Maps app) 
      RelativeLayout.LayoutParams layoutParams = 
(RelativeLayout.LayoutParams) 
        locationButton.getLayoutParams(); 
      // position on right bottom 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 
RelativeLayout.TRUE); 
      layoutParams.setMargins(0, 0, 30, 30); 
     } 

     mGoogleMap.setOnCameraChangeListener(new 
GoogleMap.OnCameraChangeListener() { 
      @Override 
      public void onCameraChange(final CameraPosition cameraPosition) 
{ 
       mGoogleMap.setOnMapLoadedCallback(new 
GoogleMap.OnMapLoadedCallback() { 
        @Override 
        public void onMapLoaded() { 
         LatLng latLng = 
mGoogleMap.getCameraPosition().target; 
         getAddress(latLng); 
        } 
       }); 
      } 
     }); 

    } 
} 

public void location(LatLng latLng) { 
    markerOptions = new MarkerOptions(); 
    markerOptions.position(latLng); 
    markerOptions.title(result); 

markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker)); 
    currLocationMarker = mGoogleMap.addMarker(markerOptions); 
} 

public List<Address> getAddress(LatLng latLng) { 
    try { 
     Geocoder geocoder; 
     List<Address> addresses; 
     geocoder = new Geocoder(this); 
     if (latLng.latitude != 0 || latLng.longitude != 0) { 
      addresses = geocoder.getFromLocation(latLng.latitude, 
        latLng.longitude, 1); 
      String address = addresses.get(0).getAddressLine(0); 
      String city = addresses.get(0).getAddressLine(1); 
      String country = addresses.get(0).getAddressLine(2); 
      Toast.makeText(this, address + " - " + city + " - " + country, 
        Toast.LENGTH_LONG).show(); 
      aa.add(address + city + country); 
      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String> 
(this, R.layout.activity_listview, R.id.textView, aa); 
      simpleList.setAdapter(arrayAdapter); 
      return addresses; 
     } else { 
      Toast.makeText(this, "latitude and longitude are null", 
        Toast.LENGTH_LONG).show(); 
      return null; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    //  gpsTreker(); 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(1000); 
    mLocationRequest.setFastestInterval(1000); 

mLocationRequest.setPriority 
(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 

LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, 
mLocationRequest, this); 
    } 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

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

} 

@Override 
public void onLocationChanged(Location location) { 

    mLastLocation = location; 
    if (mCurrLocationMarker != null) { 
     mCurrLocationMarker.remove(); 
    } 
    //Place current location marker 
    LatLng latLng = new LatLng(location.getLatitude(), 
location.getLongitude()); 
    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(latLng); 
    markerOptions.title("Current Position"); 

markerOptions.icon(BitmapDescriptorFactory.defaultMarker 
(BitmapDescriptorFactory.HUE_MAGENTA)); 
    mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); 
    //move map camera 
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 12)); 
} 

} 


activity_maps.xml 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:map="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="360dp" 
     tools:context="com.android.trainee.activity.MapsActivity"> 
</fragment> 


    <ListView 
     android:id="@+id/simpleListView" 
     android:layout_width="fill_parent" 
     android:layout_height="200dp" 
     android:divider="#cfc4c4" 
     android:dividerHeight="1dp"/> 
</LinearLayout> 

</ScrollView> 

activity_listview。 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 
<TextView 
    android:id="@+id/textView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:padding="@dimen/activity_horizontal_margin" 
    android:textColor="@color/colorPrimaryDarktab" /> 

</LinearLayout> 

的Android manifast.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.android.trainee"> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

<!-- 
    The ACCESS_COARSE/FINE_LOCATION permissions are not required to use 
    Google Maps Android API v2, but you must specify either coarse or fine 
    location permissions for the 'MyLocation' functionality. 
--> 

<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true" /> 

<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" 
/> --> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"> 
    <activity 
     android:name=".activity.HomeSplashActivity" 
     android:launchMode="singleInstance" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".activity.SignUpActivity" /> 
    <activity android:name=".activity.LoginActivity" /> 
    <activity 
     android:name=".activity.DashBoard" 
     android:label="@string/title_activity_dash_board" 
     android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> 
    <activity android:name=".activity.ProfileActivity" /> 
    <activity android:name=".activity.Contects" /> 
    <!-- 
     The API key for Google Maps-based APIs is defined as a string 
resource. 
     (See the file "res/values/google_maps_api.xml"). 
     Note that the API key is linked to the encryption key used to sign 
the APK. 
     You need a different API key for each encryption key, including the 
release key that is used to 
     sign the APK for publishing. 
     You can define the keys for the debug and release targets in 
src/debug/ and src/release/. 
    --> 
    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="@string/google_maps_key" /> 

    <activity 
     android:name=".activity.MapsActivity" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
     android:label="@string/title_activity_maps" /> 
    <activity android:name=".activity.BackgroundServices"></activity> 

    <service android:name=".services.MediaService" /> 

</application> 

</manifest>``