Place Picker for Google Maps has been deprecated in Android and we are told to move to paid APIs. Autocomplete, Nearby and Places photos APIs are chargeable after a number of loads. Check Pricing here
Thankfully, Static and Dynamic Maps on Mobile and Geocoder is still free. PlacePicker is a Place Picker alternative library that allows you to pick a point in the map and get its coordinates and Address using Geocoder instead of Google APIs
Include the following dependencies in your app's build.gradle :
dependencies {
implementation 'com.google.android.gms:play-services-maps:16.1.0'
implementation 'com.sucho:placepicker:0.1.6'
implementation 'com.google.android.material:material:1.1.0-alpha01'
}
PlacePicker Uses AndroidX artifacts, thus to use it without issues, make sure your application has been migrated to AndroidX as well. If you havent done it already, Here's How
- You need a Maps API key and add it to your app. Here's How
- To start The
PlacePickerActivity
:
val intent = PlacePicker.IntentBuilder()
.setLatLong(40.748672, -73.985628) // Initial Latitude and Longitude the Map will load into
.showLatLong(true) // Show Coordinates in the Activity
.setMapZoom(12.0f) // Map Zoom Level. Default: 14.0
.setAddressRequired(true) // Set If return only Coordinates if cannot fetch Address for the coordinates. Default: True
.hideMarkerShadow(true) // Hides the shadow under the map marker. Default: False
.setMarkerDrawable(R.drawable.marker) // Change the default Marker Image
.setMarkerImageImageColor(R.color.colorPrimary)
.setFabColor(R.color.fabColor)
.setPrimaryTextColor(R.color.primaryTextColor) // Change text color of Shortened Address
.setSecondaryTextColor(R.color.secondaryTextColor) // Change text color of full Address
.build(this)
startActivityForResult(intent, Constants.PLACE_PICKER_REQUEST)
- Then get the data
onActivityResult
override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
if (requestCode == Constants.PLACE_PICKER_REQUEST) {
if (resultCode == Activity.RESULT_OK) {
val addressData = data?.getParcelableExtra<AddressData>(Constants.ADDRESS_INTENT)
}
} else {
super.onActivityResult(requestCode, resultCode, data)
}
}
If you are using Java instead of Kotlin:
Intent intent = new PlacePicker.IntentBuilder()
...
startActivityForResult(intent, Constants.PLACE_PICKER_REQUEST);
...
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == Constants.PLACE_PICKER_REQUEST) {
if (resultCode == Activity.RESULT_OK && data != null) {
AddressData addressData = data.getParcelableExtra(Constants.ADDRESS_INTENT);
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
Note: This is inspired from Mapbox Android Place Picker plugin. Code and UI has been reused from the open source library hosted on Github. Their copyright license has been added here