Created
September 1, 2017 17:05
-
-
Save JacquesInnocent/adbd25b50cfa6e42777cc290750a71fb to your computer and use it in GitHub Desktop.
Google Maps Location and permission codes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Those ain't all my codes, you can get the whole new ones and instructions from https://developers.google.com/maps/documentation/android-api/current-place-tutorial