본문

180905(수) - Google Maps (Select Current Place)

Google Maps


Select Current Place

- Using Map SDK, Places SDK, fused location provider

Note : require Google Play services version 11.2.0 or later


Sample code

package com.example.currentplacedetailsonmap;

import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.places.GeoDataClient;
import com.google.android.gms.location.places.PlaceDetectionClient;
import com.google.android.gms.location.places.PlaceLikelihood;
import com.google.android.gms.location.places.PlaceLikelihoodBufferResponse;
import com.google.android.gms.location.places.Places;
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.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 com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;

/**
 * An activity that displays a map showing the place at the device's current location.
 */

public class MapsActivityCurrentPlace extends AppCompatActivity
       
implements OnMapReadyCallback {

   
private static final String TAG = MapsActivityCurrentPlace.class.getSimpleName();
   
private GoogleMap mMap;
   
private CameraPosition mCameraPosition;

   
// The entry points to the Places API.
   
private GeoDataClient mGeoDataClient;
   
private PlaceDetectionClient mPlaceDetectionClient;

   
// The entry point to the Fused Location Provider.
   
private FusedLocationProviderClient mFusedLocationProviderClient;

   
// A default location (Sydney, Australia) and default zoom to use when location permission is
   
// not granted.
   
private final LatLng mDefaultLocation = new LatLng(-33.8523341, 151.2106085);
   
private static final int DEFAULT_ZOOM = 15;
   
private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
   
private boolean mLocationPermissionGranted;

   
// The geographical location where the device is currently located. That is, the last-known
   
// location retrieved by the Fused Location Provider.
   
private Location mLastKnownLocation;

   
// Keys for storing activity state.
   
private static final String KEY_CAMERA_POSITION = "camera_position";
   
private static final String KEY_LOCATION = "location";

   
// Used for selecting the current place.
   
private static final int M_MAX_ENTRIES = 5;
   
private String[] mLikelyPlaceNames;
   
private String[] mLikelyPlaceAddresses;
   
private String[] mLikelyPlaceAttributions;
   
private LatLng[] mLikelyPlaceLatLngs;

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

       
// Retrieve location and camera position from saved instance state.
       
if (savedInstanceState != null) {
            mLastKnownLocation
= savedInstanceState.getParcelable(KEY_LOCATION);
            mCameraPosition
= savedInstanceState.getParcelable(KEY_CAMERA_POSITION);
       
}

       
// Retrieve the content view that renders the map.
        setContentView
(R.layout.activity_maps);

       
// Construct a GeoDataClient.
        mGeoDataClient
= Places.getGeoDataClient(this, null);

       
// Construct a PlaceDetectionClient.
        mPlaceDetectionClient
= Places.getPlaceDetectionClient(this, null);

       
// Construct a FusedLocationProviderClient.
        mFusedLocationProviderClient
= LocationServices.getFusedLocationProviderClient(this);

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

   
}

   
/**
     * Saves the state of the map when the activity is paused.
     */

   
@Override
   
protected void onSaveInstanceState(Bundle outState) {
       
if (mMap != null) {
            outState
.putParcelable(KEY_CAMERA_POSITION, mMap.getCameraPosition());
            outState
.putParcelable(KEY_LOCATION, mLastKnownLocation);
           
super.onSaveInstanceState(outState);
       
}
   
}

   
/**
     * Sets up the options menu.
     * @param menu The options menu.
     * @return Boolean.
     */

   
@Override
   
public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater
().inflate(R.menu.current_place_menu, menu);
       
return true;
   
}

   
/**
     * Handles a click on the menu option to get a place.
     * @param item The menu item to handle.
     * @return Boolean.
     */

   
@Override
   
public boolean onOptionsItemSelected(MenuItem item) {
       
if (item.getItemId() == R.id.option_get_place) {
            showCurrentPlace
();
       
}
       
return true;
   
}

   
/**
     * Manipulates the map when it's available.
     * This callback is triggered when the map is ready to be used.
     */

   
@Override
   
public void onMapReady(GoogleMap map) {
        mMap
= map;

       
// Use a custom info window adapter to handle multiple lines of text in the
       
// info window contents.
        mMap
.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {

           
@Override
           
// Return null here, so that getInfoContents() is called next.
           
public View getInfoWindow(Marker arg0) {
               
return null;
           
}

           
@Override
           
public View getInfoContents(Marker marker) {
               
// Inflate the layouts for the info window, title and snippet.
               
View infoWindow = getLayoutInflater().inflate(R.layout.custom_info_contents,
                       
(FrameLayout) findViewById(R.id.map), false);

               
TextView title = ((TextView) infoWindow.findViewById(R.id.title));
                title
.setText(marker.getTitle());

               
TextView snippet = ((TextView) infoWindow.findViewById(R.id.snippet));
                snippet
.setText(marker.getSnippet());

               
return infoWindow;
           
}
       
});

       
// Prompt the user for permission.
        getLocationPermission
();

       
// Turn on the My Location layer and the related control on the map.
        updateLocationUI
();

       
// Get the current location of the device and set the position of the map.
        getDeviceLocation
();
   
}

   
/**
     * Gets the current location of the device, and positions the map's camera.
     */

   
private void getDeviceLocation() {
       
/*
         * Get the best and most recent location of the device, which may be null in rare
         * cases when a location is not available.
         */

       
try {
           
if (mLocationPermissionGranted) {
               
Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                locationResult
.addOnCompleteListener(this, new OnCompleteListener<Location>() {
                   
@Override
                   
public void onComplete(@NonNull Task<Location> task) {
                       
if (task.isSuccessful()) {
                           
// Set the map's camera position to the current location of the device.
                            mLastKnownLocation
= task.getResult();
                            mMap
.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                   
new LatLng(mLastKnownLocation.getLatitude(),
                                            mLastKnownLocation
.getLongitude()), DEFAULT_ZOOM));
                       
} else {
                           
Log.d(TAG, "Current location is null. Using defaults.");
                           
Log.e(TAG, "Exception: %s", task.getException());
                            mMap
.moveCamera(CameraUpdateFactory
                                   
.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                            mMap
.getUiSettings().setMyLocationButtonEnabled(false);
                       
}
                   
}
               
});
           
}
       
} catch (SecurityException e)  {
           
Log.e("Exception: %s", e.getMessage());
       
}
   
}


   
/**
     * Prompts the user for permission to use the device location.
     */

   
private void getLocationPermission() {
       
/*
         * Request location permission, so that we can get the location of the
         * device. The result of the permission request is handled by a callback,
         * onRequestPermissionsResult.
         */

       
if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                android
.Manifest.permission.ACCESS_FINE_LOCATION)
               
== PackageManager.PERMISSION_GRANTED) {
            mLocationPermissionGranted
= true;
       
} else {
           
ActivityCompat.requestPermissions(this,
                   
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION
);
       
}
   
}

   
/**
     * Handles the result of the request for location permissions.
     */

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

   
/**
     * Prompts the user to select the current place from a list of likely places, and shows the
     * current place on the map - provided the user has granted location permission.
     */

   
private void showCurrentPlace() {
       
if (mMap == null) {
           
return;
       
}

       
if (mLocationPermissionGranted) {
           
// Get the likely places - that is, the businesses and other points of interest that
           
// are the best match for the device's current location.
           
@SuppressWarnings("MissingPermission") final
           
Task<PlaceLikelihoodBufferResponse> placeResult =
                    mPlaceDetectionClient
.getCurrentPlace(null);
            placeResult
.addOnCompleteListener
                   
(new OnCompleteListener<PlaceLikelihoodBufferResponse>() {
                       
@Override
                       
public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) {
                           
if (task.isSuccessful() && task.getResult() != null) {
                               
PlaceLikelihoodBufferResponse likelyPlaces = task.getResult();

                               
// Set the count, handling cases where less than 5 entries are returned.
                               
int count;
                               
if (likelyPlaces.getCount() < M_MAX_ENTRIES) {
                                    count
= likelyPlaces.getCount();
                               
} else {
                                    count
= M_MAX_ENTRIES;
                               
}

                               
int i = 0;
                                mLikelyPlaceNames
= new String[count];
                                mLikelyPlaceAddresses
= new String[count];
                                mLikelyPlaceAttributions
= new String[count];
                                mLikelyPlaceLatLngs
= new LatLng[count];

                               
for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                                   
// Build a list of likely places to show the user.
                                    mLikelyPlaceNames
[i] = (String) placeLikelihood.getPlace().getName();
                                    mLikelyPlaceAddresses
[i] = (String) placeLikelihood.getPlace()
                                           
.getAddress();
                                    mLikelyPlaceAttributions
[i] = (String) placeLikelihood.getPlace()
                                           
.getAttributions();
                                    mLikelyPlaceLatLngs
[i] = placeLikelihood.getPlace().getLatLng();

                                    i
++;
                                   
if (i > (count - 1)) {
                                       
break;
                                   
}
                               
}

                               
// Release the place likelihood buffer, to avoid memory leaks.
                                likelyPlaces
.release();

                               
// Show a dialog offering the user the list of likely places, and add a
                               
// marker at the selected place.
                                openPlacesDialog
();

                           
} else {
                               
Log.e(TAG, "Exception: %s", task.getException());
                           
}
                       
}
                   
});
       
} else {
           
// The user has not granted permission.
           
Log.i(TAG, "The user did not grant location permission.");

           
// Add a default marker, because the user hasn't selected a place.
            mMap
.addMarker(new MarkerOptions()
                   
.title(getString(R.string.default_info_title))
                   
.position(mDefaultLocation)
                   
.snippet(getString(R.string.default_info_snippet)));

           
// Prompt the user for permission.
            getLocationPermission
();
       
}
   
}

   
/**
     * Displays a form allowing the user to select a place from a list of likely places.
     */

   
private void openPlacesDialog() {
       
// Ask the user to choose the place where they are now.
       
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
           
@Override
           
public void onClick(DialogInterface dialog, int which) {
               
// The "which" argument contains the position of the selected item.
               
LatLng markerLatLng = mLikelyPlaceLatLngs[which];
               
String markerSnippet = mLikelyPlaceAddresses[which];
               
if (mLikelyPlaceAttributions[which] != null) {
                    markerSnippet
= markerSnippet + "\n" + mLikelyPlaceAttributions[which];
               
}

               
// Add a marker for the selected place, with an info window
               
// showing information about that place.
                mMap
.addMarker(new MarkerOptions()
                       
.title(mLikelyPlaceNames[which])
                       
.position(markerLatLng)
                       
.snippet(markerSnippet));

               
// Position the map's camera at the location of the marker.
                mMap
.moveCamera(CameraUpdateFactory.newLatLngZoom(markerLatLng,
                        DEFAULT_ZOOM
));
           
}
       
};

       
// Display the dialog.
       
AlertDialog dialog = new AlertDialog.Builder(this)
               
.setTitle(R.string.pick_place)
               
.setItems(mLikelyPlaceNames, listener)
               
.show();
   
}

   
/**
     * Updates the map's UI settings based on whether the user has granted location permission.
     */

   
private void updateLocationUI() {
       
if (mMap == null) {
           
return;
       
}
       
try {
           
if (mLocationPermissionGranted) {
                mMap
.setMyLocationEnabled(true);
                mMap
.getUiSettings().setMyLocationButtonEnabled(true);
           
} else {
                mMap
.setMyLocationEnabled(false);
                mMap
.getUiSettings().setMyLocationButtonEnabled(false);
                mLastKnownLocation
= null;
                getLocationPermission
();
           
}
       
} catch (SecurityException e)  {
           
Log.e("Exception: %s", e.getMessage());
       
}
   
}
}


Instantiate the Places API clients

- 다음 interfaces는 Places SDK 의 primary entry points를 제공

・ GeoDataClient 

Google's database of local place and business information

・ PlaceDetectionClient 

quick access to device's current place & particular place에서의 device location을 report 할 수 있는 opportunity 제공

LocationServices 은 Android location services를 위한 main entry point 제공

protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView
(R.layout.activity_main);

   
// Construct a GeoDataClient.
    mGeoDataClient
= Places.getGeoDataClient(this, null);

   
// Construct a PlaceDetectionClient.
    mPlaceDetectionClient
= Places.getPlaceDetectionClient(this, null);

   
// Construct a FusedLocationProviderClient.
    mFusedLocationProviderClient
= LocationServices.getFusedLocationProviderClient(this);
}

(아 static method 너무 싫어)



Request location permission

- determine the location & tap the My Location button on them map 을 위해서 permission 필요

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
package="com.example.currentplacedetailsonmap">
   
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
private void getLocationPermission() {
   
/*
     * Request location permission, so that we can get the location of the
     * device. The result of the permission request is handled by a callback,
     * onRequestPermissionsResult.
     */

   
if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            android
.Manifest.permission.ACCESS_FINE_LOCATION)
           
== PackageManager.PERMISSION_GRANTED) {
        mLocationPermissionGranted
= true;
   
} else {
       
ActivityCompat.requestPermissions(this,
               
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION
);
   
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
                                       
@NonNull String permissions[],
                                       
@NonNull int[] grantResults) {
    mLocationPermissionGranted
= false;
   
switch (requestCode) {
       
case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
           
// If request is cancelled, the result arrays are empty.
           
if (grantResults.length > 0
                   
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                mLocationPermissionGranted
= true;
           
}
       
}
   
}
    updateLocationUI
();
}


Add a map 

public void onMapReady(GoogleMap map) {
    mMap
= map;

   
// Do other setup activities here too, as described elsewhere in this tutorial.

   
// Turn on the My Location layer and the related control on the map.
    updateLocationUI
();

   
// Get the current location of the device and set the position of the map.
    getDeviceLocation
();
}
private void updateLocationUI() {
   
if (mMap == null) {
       
return;
   
}
   
try {
       
if (mLocationPermissionGranted) {
            mMap
.setMyLocationEnabled(true);
            mMap
.getUiSettings().setMyLocationButtonEnabled(true);
       
} else {
            mMap
.setMyLocationEnabled(false);
            mMap
.getUiSettings().setMyLocationButtonEnabled(false);
            mLastKnownLocation
= null;
            getLocationPermission
();
       
}
   
} catch (SecurityException e)  {
       
Log.e("Exception: %s", e.getMessage());
   
}
}


Get the location of the Android device and position the map

- fused location provider를 사용하면, device's last-known location을 find한다.

fused location provider 

private void getDeviceLocation() {
   
/*
     * Get the best and most recent location of the device, which may be null in rare
     * cases when a location is not available.
     */

   
try {
       
if (mLocationPermissionGranted) {
           
Task locationResult = mFusedLocationProviderClient.getLastLocation();
            locationResult
.addOnCompleteListener(this, new OnCompleteListener() {
               
@Override
               
public void onComplete(@NonNull Task task) {
                   
if (task.isSuccessful()) {
                       
// Set the map's camera position to the current location of the device.
                        mLastKnownLocation
= task.getResult();
                        mMap
.moveCamera(CameraUpdateFactory.newLatLngZoom(
                               
new LatLng(mLastKnownLocation.getLatitude(),
                                        mLastKnownLocation
.getLongitude()), DEFAULT_ZOOM));
                   
} else {
                       
Log.d(TAG, "Current location is null. Using defaults.");
                       
Log.e(TAG, "Exception: %s", task.getException());
                        mMap
.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                        mMap
.getUiSettings().setMyLocationButtonEnabled(false);
                   
}
               
}
           
});
       
}
   
} catch(SecurityException e)  {
       
Log.e("Exception: %s", e.getMessage());
   
}
}


Get the current place

- Places SDK를 사용하면 device's current location의 likely places를 얻을 수 있다.

- place is a business or other point of interest

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   
if (item.getItemId() == R.id.option_get_place) {
        showCurrentPlace
();
   
}
   
return true;
}
private void showCurrentPlace() {
   
if (mMap == null) {
       
return;
   
}

   
if (mLocationPermissionGranted) {
       
// Get the likely places - that is, the businesses and other points of interest that
       
// are the best match for the device's current location.
       
@SuppressWarnings("MissingPermission") final
       
Task<PlaceLikelihoodBufferResponse> placeResult =
                mPlaceDetectionClient
.getCurrentPlace(null);
        placeResult
.addOnCompleteListener
               
(new OnCompleteListener<PlaceLikelihoodBufferResponse>() {
                   
@Override
                   
public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) {
                       
if (task.isSuccessful() && task.getResult() != null) {
                           
PlaceLikelihoodBufferResponse likelyPlaces = task.getResult();

                           
// Set the count, handling cases where less than 5 entries are returned.
                           
int count;
                           
if (likelyPlaces.getCount() < M_MAX_ENTRIES) {
                                count
= likelyPlaces.getCount();
                           
} else {
                                count
= M_MAX_ENTRIES;
                           
}

                           
int i = 0;
                            mLikelyPlaceNames
= new String[count];
                            mLikelyPlaceAddresses
= new String[count];
                            mLikelyPlaceAttributions
= new String[count];
                            mLikelyPlaceLatLngs
= new LatLng[count];

                           
for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                               
// Build a list of likely places to show the user.
                                mLikelyPlaceNames
[i] = (String) placeLikelihood.getPlace().getName();
                                mLikelyPlaceAddresses
[i] = (String) placeLikelihood.getPlace()
                                       
.getAddress();
                                mLikelyPlaceAttributions
[i] = (String) placeLikelihood.getPlace()
                                       
.getAttributions();
                                mLikelyPlaceLatLngs
[i] = placeLikelihood.getPlace().getLatLng();

                                i
++;
                               
if (i > (count - 1)) {
                                   
break;
                               
}
                           
}

                           
// Release the place likelihood buffer, to avoid memory leaks.
                            likelyPlaces
.release();

                           
// Show a dialog offering the user the list of likely places, and add a
                           
// marker at the selected place.
                            openPlacesDialog
();

                       
} else {
                           
Log.e(TAG, "Exception: %s", task.getException());
                       
}
                   
}
               
});
   
} else {
       
// The user has not granted permission.
       
Log.i(TAG, "The user did not grant location permission.");

       
// Add a default marker, because the user hasn't selected a place.
        mMap
.addMarker(new MarkerOptions()
               
.title(getString(R.string.default_info_title))
               
.position(mDefaultLocation)
               
.snippet(getString(R.string.default_info_snippet)));

       
// Prompt the user for permission.
        getLocationPermission
();
   
}
}
private void openPlacesDialog() {
   
// Ask the user to choose the place where they are now.
   
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
       
@Override
       
public void onClick(DialogInterface dialog, int which) {
           
// The "which" argument contains the position of the selected item.
           
LatLng markerLatLng = mLikelyPlaceLatLngs[which];
           
String markerSnippet = mLikelyPlaceAddresses[which];
           
if (mLikelyPlaceAttributions[which] != null) {
                markerSnippet
= markerSnippet + "\n" + mLikelyPlaceAttributions[which];
           
}

           
// Add a marker for the selected place, with an info window
           
// showing information about that place.
            mMap
.addMarker(new MarkerOptions()
                   
.title(mLikelyPlaceNames[which])
                   
.position(markerLatLng)
                   
.snippet(markerSnippet));

           
// Position the map's camera at the location of the marker.
            mMap
.moveCamera(CameraUpdateFactory.newLatLngZoom(markerLatLng,
                    DEFAULT_ZOOM
));
       
}
   
};

   
// Display the dialog.
   
AlertDialog dialog = new AlertDialog.Builder(this)
           
.setTitle(R.string.pick_place)
           
.setItems(mLikelyPlaceNames, listener)
           
.show();
}

info window layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   
android:layout_width="wrap_content"
   
android:layout_height="wrap_content"
   
android:layoutDirection="locale"
   
android:orientation="vertical">
   
<TextView
       
android:id="@+id/title"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:layout_gravity="center_horizontal"
       
android:textColor="#ff000000"
       
android:textStyle="bold" />

   
<TextView
       
android:id="@+id/snippet"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:textColor="#ff7f7f7f" />
</LinearLayout>
@Override
public void onMapReady(GoogleMap map) {
   
// Do other setup activities here too, as described elsewhere in this tutorial.
    mMap
.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {

   
@Override
   
// Return null here, so that getInfoContents() is called next.
   
public View getInfoWindow(Marker arg0) {
       
return null;
   
}

   
@Override
   
public View getInfoContents(Marker marker) {
       
// Inflate the layouts for the info window, title and snippet.
       
View infoWindow = getLayoutInflater().inflate(R.layout.custom_info_contents, null);

       
TextView title = ((TextView) infoWindow.findViewById(R.id.title));
        title
.setText(marker.getTitle());

       
TextView snippet = ((TextView) infoWindow.findViewById(R.id.snippet));
        snippet
.setText(marker.getSnippet());

       
return infoWindow;
     
}
   
});
}


Save the map's state

- save map's camera position and device location

- configuration change일 때, destroy and rebuilds map activity -> smooth user experience를 위해서 map's state 를 저장하는것이 필요함

- onSaveInstanceState() saved the state when activity pauses

private static final String KEY_CAMERA_POSITION = "camera_position";
private static final String KEY_LOCATION = "location";
@Override
protected void onSaveInstanceState(Bundle outState) {
   
if (mMap != null) {
        outState
.putParcelable(KEY_CAMERA_POSITION, mMap.getCameraPosition());
        outState
.putParcelable(KEY_LOCATION, mLastKnownLocation);
       
super.onSaveInstanceState(outState);
   
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
   
if (savedInstanceState != null) {
        mCurrentLocation
= savedInstanceState.getParcelable(KEY_LOCATION);
        mCameraPosition
= savedInstanceState.getParcelable(KEY_CAMERA_POSITION);
   
}
   
...
}


공유

댓글