Getting sub locality null for some lat long? - android

Below is my code, I am getting null subLocality always ....
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude,longitude, 1);
String suburb = addresses.get(0).getSubLocality();
String state = addresses.get(0).getAdminArea();
String zip = addresses.get(0).getPostalCode();
String country = addresses.get(0).getCountryName();
Log.e("Log for data",""+suburb+" "+state+" "+zip+" "+country);
Below is my response;
null Gujarat 380006 India

Geocoder API will return the values depending on lat long, if the API database doesn't have these values exemple : subLocality then it will return null only, in my knowledge there's nothing you can do about it. You have to handle these cases gracefully so your app don't crash.
Handling these cases includes you have to put a check using if condition is that particular value is null or it has some value, because if you use any of the value somewhere in code without checking and if that value is null then app might crash whenever that particular value comes null.

I too had the same problem which was solved by increasing the number of results which you request from Geocoder API.
Try increasing it to 10
List<Address> addresses = geocoder.getFromLocation(latitude,longitude, 10);
Then if your sub-locality is null with the first result, try search in the rest of them for the same

Related

Android Google Places API- Is there any way to get the city from Place objects?

I am using the autocomplete widget of Google Place API for Android and getting a place object, but I am not able to extract the city of it, just only the complete address as a text.
Apparently, the Place interface does not have a method to return the city.
The city is the address componenets is Locality and Administrative Area Level 3, according this documentation.
Does someone knows any way to get the city of the Place object ?
It is a hack but it works. You can take the lat and lng from the Place object and find the city from the Geocoder.
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(MyLat, MyLong, 1);
String cityName = addresses.get(0).getAddressLine(0);
String stateName = addresses.get(0).getAddressLine(1);
String countryName = addresses.get(0).getAddressLine(2);

Detect current location and Populate my Activity

My Question is i have an Activity of multiple EditText like Street,landmark,Location,City etc. On the Location EditText i put a button to fetch the Current User Location and Fill the User Address in Respective EditText.
NOTE : i Successfully Fetch my current location and populate my location EditText whole but i want to add street Number in Street EditText, City in City EditText etc
You can use Official Documentation for beginning and find many examples of "reverse geocoding" like this:
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());
addresses = geocoder.getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName(); //
from here

Get country code from PlaceAutocompleteFragment android (Google Places API)

In Google Places API for Android, I am using PlaceAutocompleteFragment for displaying the city/country.
Here am getting the address, name, placeId, etc.
Place object contains only these fields.
#Override
public void onPlaceSelected(Place place) {
Log.i(TAG, "Place Selected: " + place.getName());
// Format the returned place's details and display them in the TextView.
mPlaceDetailsText.setText(formatPlaceDetails(getResources(), place.getName(), place.getId(),
place.getAddress(), place.getPhoneNumber()+" "+place.getAttributions()+" :: "+place.getLocale(), place.getWebsiteUri()));
}
But I want country code also. Is there any way to get the country code from places API ?
If no, Is there any alternate service for getting the country name & code while typing ?
With the Place object retrieved, you can get the Locale object associated :
Locale locale = place.getLocale();
With this Locale object you can then get the Country code via :
locale.getCountry();
And the country name with :
locale.getDisplayCountry();
You can look to more available methods at the docs :
http://developer.android.com/reference/java/util/Locale.html
EDIT :
If Locale from the Place object is null you can use a Geocoder to get information from GPS coordinates :
LatLng coordinates = place.getLatLng(); // Get the coordinates from your place
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(
coordinates.latitude,
coordinates.longitude,
1); // Only retrieve 1 address
Address address = addresses.get(0);
Then you can call these methods to get the informations you want
address.getCountryCode();
address.getCountryName();
More methods on the Address objects : http://developer.android.com/reference/android/location/Address.html
Be aware that the Geocoder methods should be call on a background thread to not block the UI and that it could also retrieve no answer.
This will give the correct country code.
TelephonyManager tm = (TelephonyManager)activity.getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();
Here all answer points to either deprecated SDK or using TelephonyManager or GeoCoder(while OP clearly mentioned getting the country code from places SDK response. I also it should be obvious that choosing a country or country code from the OS(TelephonyManager or GeoCoder) should not necessarily match the location returned by the User selected location from the picker).
In the newer places SDK(com.google.android.libraries.places:places:2.4.0), I am managed to get the country code by following the code snippet
Make sure to include the following field(in addition to what more you require)
val fields = listOf(
Place.Field.ADDRESS_COMPONENTS,
// ... More fields that you need
)
And to parse the country code follow this code
place.addressComponents.asList().find { it.types.contains("country") }.shortName

Limit Geocoder getFromLocationName scope to one specific City

The following is my method:
List<Address> addresses = null;
addresses = new Geocoder(passengerHomeActivity).getFromLocationName(this.addressInput.getText().toString(), 1);
is there any way to limit the Geocoder getFromLocationName's scope to one specific city? Sometimes when I enter an Address without writing the city name, it leads me to an address which is the same but in another city.
My idea is by getting the latitude and longitude of the user, get the value of the city, and set the limit scope to the getFromLocationName method, but I don't have any clue with the implementation.
Thanks
Use this code:
List<Address> addresses = new Geocoder(passengerHomeActivity).getFromLocationName((this.addressInput.getText().toString()) + ", YourCity, YourCountry", 1);`
Use the constructor passing the the Locale.
Geocoder(Context context, Locale locale)
Use it like this:
Locale locale = new Locale(Locale.getDefault().getLanguage(), "US");
Geocoder geo = new Geocoder(context, locale)
addresses = geo.getFromLocationName(term, 1);
Notice that this is an aproach, because it will give you the result in that country unless nothing is found (in which case will return worldwide anyway).

how to find continent in particular location using Geocoder in android app

i am developing android application using Geocoder services,
I have an application where I try to get address of a location based on
the latitude,longitude coordinates its working fine.
my problem is how to get continent of particular address.
example : double lat=17; double lon=78.49;
List addresses = new Geocoder(Shout.this,Locale.getDefault()).getFromLocation(lat, lon, 1);
i am using this code output is India,Hyderabad
this address related how to find continent ,please help me some valuable solution.
i am getting country name dynamically using geocoder is their any chance to get in continent name along with country.it is difficult to maintain statically i need dynamically
any free services find continent based services
Thanks In Advance
As we have limited number of Continents, it's good to use static list of data.
We can use below json_str (found here) which have CountryCode & Continent
String json_str = "{\"AD\":\"Europe\",\"AE\":\"Asia\",\"AF\":\"Asia\",\"AG\":\"North America\",\"AI\":\"North America\",\"AL\":\"Europe\",\"AM\":\"Asia\",\"AN\":\"North America\",\"AO\":\"Africa\",\"AQ\":\"Antarctica\",\"AR\":\"South America\",\"AS\":\"Australia\",\"AT\":\"Europe\",\"AU\":\"Australia\",\"AW\":\"North America\",\"AZ\":\"Asia\",\"BA\":\"Europe\",\"BB\":\"North America\",\"BD\":\"Asia\",\"BE\":\"Europe\",\"BF\":\"Africa\",\"BG\":\"Europe\",\"BH\":\"Asia\",\"BI\":\"Africa\",\"BJ\":\"Africa\",\"BM\":\"North America\",\"BN\":\"Asia\",\"BO\":\"South America\",\"BR\":\"South America\",\"BS\":\"North America\",\"BT\":\"Asia\",\"BW\":\"Africa\",\"BY\":\"Europe\",\"BZ\":\"North America\",\"CA\":\"North America\",\"CC\":\"Asia\",\"CD\":\"Africa\",\"CF\":\"Africa\",\"CG\":\"Africa\",\"CH\":\"Europe\",\"CI\":\"Africa\",\"CK\":\"Australia\",\"CL\":\"South America\",\"CM\":\"Africa\",\"CN\":\"Asia\",\"CO\":\"South America\",\"CR\":\"North America\",\"CU\":\"North America\",\"CV\":\"Africa\",\"CX\":\"Asia\",\"CY\":\"Asia\",\"CZ\":\"Europe\",\"DE\":\"Europe\",\"DJ\":\"Africa\",\"DK\":\"Europe\",\"DM\":\"North America\",\"DO\":\"North America\",\"DZ\":\"Africa\",\"EC\":\"South America\",\"EE\":\"Europe\",\"EG\":\"Africa\",\"EH\":\"Africa\",\"ER\":\"Africa\",\"ES\":\"Europe\",\"ET\":\"Africa\",\"FI\":\"Europe\",\"FJ\":\"Australia\",\"FK\":\"South America\",\"FM\":\"Australia\",\"FO\":\"Europe\",\"FR\":\"Europe\",\"GA\":\"Africa\",\"GB\":\"Europe\",\"GD\":\"North America\",\"GE\":\"Asia\",\"GF\":\"South America\",\"GG\":\"Europe\",\"GH\":\"Africa\",\"GI\":\"Europe\",\"GL\":\"North America\",\"GM\":\"Africa\",\"GN\":\"Africa\",\"GP\":\"North America\",\"GQ\":\"Africa\",\"GR\":\"Europe\",\"GS\":\"Antarctica\",\"GT\":\"North America\",\"GU\":\"Australia\",\"GW\":\"Africa\",\"GY\":\"South America\",\"HK\":\"Asia\",\"HN\":\"North America\",\"HR\":\"Europe\",\"HT\":\"North America\",\"HU\":\"Europe\",\"ID\":\"Asia\",\"IE\":\"Europe\",\"IL\":\"Asia\",\"IM\":\"Europe\",\"IN\":\"Asia\",\"IO\":\"Asia\",\"IQ\":\"Asia\",\"IR\":\"Asia\",\"IS\":\"Europe\",\"IT\":\"Europe\",\"JE\":\"Europe\",\"JM\":\"North America\",\"JO\":\"Asia\",\"JP\":\"Asia\",\"KE\":\"Africa\",\"KG\":\"Asia\",\"KH\":\"Asia\",\"KI\":\"Australia\",\"KM\":\"Africa\",\"KN\":\"North America\",\"KP\":\"Asia\",\"KR\":\"Asia\",\"KW\":\"Asia\",\"KY\":\"North America\",\"KZ\":\"Asia\",\"LA\":\"Asia\",\"LB\":\"Asia\",\"LC\":\"North America\",\"LI\":\"Europe\",\"LK\":\"Asia\",\"LR\":\"Africa\",\"LS\":\"Africa\",\"LT\":\"Europe\",\"LU\":\"Europe\",\"LV\":\"Europe\",\"LY\":\"Africa\",\"MA\":\"Africa\",\"MC\":\"Europe\",\"MD\":\"Europe\",\"ME\":\"Europe\",\"MG\":\"Africa\",\"MH\":\"Australia\",\"MK\":\"Europe\",\"ML\":\"Africa\",\"MM\":\"Asia\",\"MN\":\"Asia\",\"MO\":\"Asia\",\"MP\":\"Australia\",\"MQ\":\"North America\",\"MR\":\"Africa\",\"MS\":\"North America\",\"MT\":\"Europe\",\"MU\":\"Africa\",\"MV\":\"Asia\",\"MW\":\"Africa\",\"MX\":\"North America\",\"MY\":\"Asia\",\"MZ\":\"Africa\",\"NA\":\"Africa\",\"NC\":\"Australia\",\"NE\":\"Africa\",\"NF\":\"Australia\",\"NG\":\"Africa\",\"NI\":\"North America\",\"NL\":\"Europe\",\"NO\":\"Europe\",\"NP\":\"Asia\",\"NR\":\"Australia\",\"NU\":\"Australia\",\"NZ\":\"Australia\",\"OM\":\"Asia\",\"PA\":\"North America\",\"PE\":\"South America\",\"PF\":\"Australia\",\"PG\":\"Australia\",\"PH\":\"Asia\",\"PK\":\"Asia\",\"PL\":\"Europe\",\"PM\":\"North America\",\"PN\":\"Australia\",\"PR\":\"North America\",\"PS\":\"Asia\",\"PT\":\"Europe\",\"PW\":\"Australia\",\"PY\":\"South America\",\"QA\":\"Asia\",\"RE\":\"Africa\",\"RO\":\"Europe\",\"RS\":\"Europe\",\"RU\":\"Europe\",\"RW\":\"Africa\",\"SA\":\"Asia\",\"SB\":\"Australia\",\"SC\":\"Africa\",\"SD\":\"Africa\",\"SE\":\"Europe\",\"SG\":\"Asia\",\"SH\":\"Africa\",\"SI\":\"Europe\",\"SJ\":\"Europe\",\"SK\":\"Europe\",\"SL\":\"Africa\",\"SM\":\"Europe\",\"SN\":\"Africa\",\"SO\":\"Africa\",\"SR\":\"South America\",\"ST\":\"Africa\",\"SV\":\"North America\",\"SY\":\"Asia\",\"SZ\":\"Africa\",\"TC\":\"North America\",\"TD\":\"Africa\",\"TF\":\"Antarctica\",\"TG\":\"Africa\",\"TH\":\"Asia\",\"TJ\":\"Asia\",\"TK\":\"Australia\",\"TM\":\"Asia\",\"TN\":\"Africa\",\"TO\":\"Australia\",\"TR\":\"Asia\",\"TT\":\"North America\",\"TV\":\"Australia\",\"TW\":\"Asia\",\"TZ\":\"Africa\",\"UA\":\"Europe\",\"UG\":\"Africa\",\"US\":\"North America\",\"UY\":\"South America\",\"UZ\":\"Asia\",\"VC\":\"North America\",\"VE\":\"South America\",\"VG\":\"North America\",\"VI\":\"North America\",\"VN\":\"Asia\",\"VU\":\"Australia\",\"WF\":\"Australia\",\"WS\":\"Australia\",\"YE\":\"Asia\",\"YT\":\"Africa\",\"ZA\":\"Africa\",\"ZM\":\"Africa\",\"ZW\":\"Africa\"}";
And From Geocoder() we can get CountryCode like below:
try {
JSONObject jsonObject = new JSONObject(json_str);
Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0) {
Address fetchedAddress = addresses.get(0);
// getCountryCode from Address
String countryCode = fetchedAddress.getCountryCode();
// get continentName here
String continentName = jsonObject.getString(countryCode);
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
I don't think there is such information given by Google's API. The only solution I can think of is to have some kind of static data structure mapping country names to continent names (which you would presumably have to find yourself somehow, for instance by scraping this web page... ). Then you could text search the string that GeoCoder gives you and return the continent corresponding to the closest matching country name (which would be the key in your String mapping). (You would also have to treat the special case of US addresses which, annoyingly, end just with the state code)

Categories

Resources