W tym tygodniu rozpocząłem pracę nad tworzeniem modułu wyciągającego informacje o pobliskich restauracjach i prezentującego te dane użytkownikom, którzy są w pobliżu siebie.
Krok pierwszy
Na początku zająłem się wyciąganiem danych z Google Places API i prezentacji ich na mapie. W tym celu przygotowałem aż 3 klasy pomocnicze.
Jako pierwszą przedstawię klasę DownloadUrl, najkrótsza z nich. Jej zadaniem jest popieranie na danych z przekazanego z klasy MapsActivity adresu URL.
public class DownloadUrl { public String readUrl(String strUrl) throws IOException { String data = ""; InputStream iStream = null; HttpURLConnection urlConnection = null; try { URL url = new URL(strUrl); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); 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; } }
Następnie klasa DataParser, z pobranych przez klasę DownloadUrl danych tworzy tablicę w formacie Json, na podstawie tej tablicy pobierane są wszystkie informację o poszczególnych restauracjach. Na koniec tworzona jest lista wszystkich restauracji.
public class DataParser { public List<HashMap<String, String>> parse(String jsonData) { JSONArray jsonArray = null; JSONObject jsonObject; try { Log.d("Places", "parse"); jsonObject = new JSONObject((String) 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; } }
Na koniec klasa GetNearbyPlacesData. Operuje ona na wcześniej przedstawionych klasach. Dla klienta tej klasy przygotowane są dwie metody jedna pokazująca wszystkie pobrane restauracje (wykorzystam ją w późniejszej fazie rozwoju aplikacji) i druga pokazująca na mapie tylko jedną restaurację, która wybierana jest dla użytkownika na razie tylko w randomowy sposób.
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("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); ShowNearbyPlace(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_GREEN)); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); } } private void ShowNearbyPlace(List<HashMap<String, String>> nearbyPlacesList) { MarkerOptions markerOptions = new MarkerOptions(); HashMap<String, String> googlePlace = nearbyPlacesList.get(0); 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_GREEN)); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); } }
Zmiany w klasie MapsActivity
W tej klasie doszło wywołanie klasy GetNearbyPlacesData oraz metoda budująca adresy URL, z którego pobierane są informację o restauracjach w pobliżu.
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private int PROXIMITY_RADIUS = 5000; private GoogleMap mMap; private double lat; private double lng; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); LocationTracker locationTracker = LocationTracker.getInstance(); locationTracker.init(this); lat = locationTracker.getLatitude(); lng = locationTracker.getLongitude(); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; String Restaurant = "restaurant"; Log.d("onMapReady", "start"); String url = getUrl(lat, lng, Restaurant); Object[] DataTransfer = new Object[2]; DataTransfer[0] = mMap; DataTransfer[1] = url; GetNearbyPlacesData getNearbyPlacesData = new GetNearbyPlacesData(); getNearbyPlacesData.execute(DataTransfer); Log.d("onMapReady", "getNearbyPlaces - end"); LatLng currentLocation = new LatLng(lat, lng); LatLng friendLocation = new LatLng(50.014800, 20.975451); mMap.addMarker(new MarkerOptions().position(currentLocation) .title("Your Location") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW))); mMap.addMarker(new MarkerOptions().position(friendLocation) .title("Fake Friend") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLocation)); mMap.animateCamera(CameraUpdateFactory.zoomTo(15.0f)); Log.d("onMapReady", "end"); } private String getUrl(double latitude, double longitude, String nearbyPlace) { 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=" + "AIzaSyD--cGzA1crlI19-neVg5NBnI4vnftkUIQ"); Log.d("getUrl", googlePlacesUrl.toString()); return (googlePlacesUrl.toString()); } }
Ważna informacja dotycząca API key, który jest podawany w URL pobierającym dane. Klucz najlepiej wygenerować na tej stornie https://developers.google.com/places/android-api/placepicker, nie należy również zapomnieć o uruchomieniu odpowiednich Google API.
Eu sou regular leitor , como está todo mundo?
Isto post Postado neste web site é na verdade bom .
PolubieniePolubienie
Thanks but how you understand polish language?
PolubieniePolubienie