3
public static Country getCountryFromLocation(Context cxt, List<Country> countryList, Location location, int maxAddress) {
    if (location == null || countryList == null || countryList.isEmpty()) {
        Log.d("ooo", "location == null || countryList == null || countryList.isEmpty()");
        return null;
    }

    double longitude = location.getLongitude();
    double latitude = location.getLatitude();

    Geocoder coder = new Geocoder(cxt);
    try {
        List<Address> addressList = coder.getFromLocation(latitude, longitude, maxAddress);

        for (Address address : addressList) {
            String curCountryCode = address.getCountryCode();

            Log.d("ooo", "address " + address.toString());
            if (TextUtils.isEmpty(curCountryCode)) {
                continue;
            }

            for (Country country : countryList) {
                if (country.countryCode.equals(curCountryCode)) {
                    return country;
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

I am trying to write a function which will take the longitude and latitude to get the country code which is based on ISO 3166-2. According to the method description on Address class:

/**
 * Returns the country code of the address, for example "US",
 * or null if it is unknown.
 */
public String getCountryCode() {
    return mCountryCode;
}

I should get CN based on the longitude and latitude, but I get address output like this:

 D/ooo: address Address[addressLines=[0:"河南省许昌市鄢陵县",1:"刘桥村"],feature=null,admin=河南省,sub-admin=null,locality=许昌市,thoroughfare=,postalCode=null,countryCode=155,countryName=中国,hasLatitude=true,latitude=34.16667716

155 is what I get for Country Code, please let me know what I should do to get the Country Code from the longitude and latitude. In addition, when I use GeoCoder, it will it returns different 3-digit number even thought input longitudes and latitudes are within the same country, in my case, it's China. 155 for one province, and 131 for another Chinese province..Could you explain what these number stand for ? I am sure it's not country code...

shanwu
  • 1,493
  • 6
  • 35
  • 45
  • If you are able to get the locale somehow you can `locale.getISO3Country();` – 0x6C38 May 27 '16 at 05:00
  • @MrD the locale I get from the Address class object, it is always default locale for which the value of getISO3Country() will be CHN – shanwu May 27 '16 at 05:35
  • In your method: public String getCountryCode() { return mCountryCode; } where does the value of mCountryCode come from? How did you fetch it? – ReyAnthonyRenacia May 28 '16 at 16:17
  • getCountryCode() is from the Address class...@noogui – shanwu May 28 '16 at 16:25
  • Use this String locale = context.getResources().getConfiguration().locale.getCountry(); Another option would be to use TelephonyManager class as specified in [this thread](http://stackoverflow.com/questions/11293642/how-can-i-get-my-android-device-country-code-without-using-gps). – ReyAnthonyRenacia May 28 '16 at 19:45
  • Got it ! Thanks a lot @noogui, could you answer this stackoverflow question? – shanwu May 30 '16 at 02:32
  • ok will post it now so community knows this is answered. Your welcome :) – ReyAnthonyRenacia May 30 '16 at 13:56
  • I always receive the expected country code. For example, querying `geocoder.getFromLocation(34.16667716, 85.891113, 1);` I receive "CN" as the Country Code. Could you post the longitude you are querying? – antonio Jun 02 '16 at 07:24

5 Answers5

5

There are many way to getCountry Code in Android.

1. From Locale Configuration.

String CountryID = getResources().getConfiguration().locale.getCountry();

It will return country code base on which locale user has configured in device. Ex. I am in India and my device is configured Locale English (United States) then it will return US

2. From TelephonyManager

TelephonyManager manager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

String CountryID= manager.getSimCountryIso().toUpperCase();

3. From Latitude/Longitude using GeoCode

Geocoder geoCoder = new Geocoder(mActivity);
List<Address> addresses = geoCoder.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0) {
       String CountryID= addresses.get(0).getCountryCode();
}

NOTE : All method will return country code in 2 letter like US (USA), IN(INDIA)..etc

Get Country code in digit from letter.

array.xml

<string-array name="CountryCodes" >
        <item>93,AF</item>
        <item>355,AL</item>
        <item>213,DZ</item>
        <item>376,AD</item>
        <item>244,AO</item>
        <item>672,AQ</item>
        <item>54,AR</item>
        <item>374,AM</item>
        <item>297,AW</item>
        <item>61,AU</item>
        <item>43,AT</item>
        <item>994,AZ</item>
        <item>973,BH</item>
        <item>880,BD</item>
        <item>375,BY</item>
        <item>32,BE</item>
        <item>501,BZ</item>
        <item>229,BJ</item>
        <item>975,BT</item>
        <item>591,BO</item>
        <item>387,BA</item>
        <item>267,BW</item>
        <item>55,BR</item>
        <item>673,BN</item>
        <item>359,BG</item>
        <item>226,BF</item>
        <item>95,MM</item>
        <item>257,BI</item>
        <item>855,KH</item>
        <item>237,CM</item>
        <item>1,CA</item>
        <item>238,CV</item>
        <item>236,CF</item>
        <item>235,TD</item>
        <item>56,CL</item>
        <item>86,CN</item>
        <item>61,CX</item>
        <item>61,CC</item>
        <item>57,CO</item>
        <item>269,KM</item>
        <item>242,CG</item>
        <item>243,CD</item>
        <item>682,CK</item>
        <item>506,CR</item>
        <item>385,HR</item>
        <item>53,CU</item>
        <item>357,CY</item>
        <item>420,CZ</item>
        <item>45,DK</item>
        <item>253,DJ</item>
        <item>670,TL</item>
        <item>593,EC</item>
        <item>20,EG</item>
        <item>503,SV</item>
        <item>240,GQ</item>
        <item>291,ER</item>
        <item>372,EE</item>
        <item>251,ET</item>
        <item>500,FK</item>
        <item>298,FO</item>
        <item>679,FJ</item>
        <item>358,FI</item>
        <item>33,FR</item>
        <item>689,PF</item>
        <item>241,GA</item>
        <item>220,GM</item>
        <item>995,GE</item>
        <item>49,DE</item>
        <item>233,GH</item>
        <item>350,GI</item>
        <item>30,GR</item>
        <item>299,GL</item>
        <item>502,GT</item>
        <item>224,GN</item>
        <item>245,GW</item>
        <item>592,GY</item>
        <item>509,HT</item>
        <item>504,HN</item>
        <item>852,HK</item>
        <item>36,HU</item>
        <item>91,IN</item>
        <item>62,ID</item>
        <item>98,IR</item>
        <item>964,IQ</item>
        <item>353,IE</item>
        <item>44,IM</item>
        <item>972,IL</item>
        <item>39,IT</item>
        <item>225,CI</item>
        <item>81,JP</item>
        <item>962,JO</item>
        <item>7,KZ</item>
        <item>254,KE</item>
        <item>686,KI</item>
        <item>965,KW</item>
        <item>996,KG</item>
        <item>856,LA</item>
        <item>371,LV</item>
        <item>961,LB</item>
        <item>266,LS</item>
        <item>231,LR</item>
        <item>218,LY</item>
        <item>423,LI</item>
        <item>370,LT</item>
        <item>352,LU</item>
        <item>853,MO</item>
        <item>389,MK</item>
        <item>261,MG</item>
        <item>265,MW</item>
        <item>60,MY</item>
        <item>960,MV</item>
        <item>223,ML</item>
        <item>356,MT</item>
        <item>692,MH</item>
        <item>222,MR</item>
        <item>230,MU</item>
        <item>262,YT</item>
        <item>52,MX</item>
        <item>691,FM</item>
        <item>373,MD</item>
        <item>377,MC</item>
        <item>976,MN</item>
        <item>382,ME</item>
        <item>212,MA</item>
        <item>258,MZ</item>
        <item>264,NA</item>
        <item>674,NR</item>
        <item>977,NP</item>
        <item>31,NL</item>
        <item>599,AN</item>
        <item>687,NC</item>
        <item>64,NZ</item>
        <item>505,NI</item>
        <item>227,NE</item>
        <item>234,NG</item>
        <item>683,NU</item>
        <item>850,KP</item>
        <item>47,NO</item>
        <item>968,OM</item>
        <item>92,PK</item>
        <item>680,PW</item>
        <item>507,PA</item>
        <item>675,PG</item>
        <item>595,PY</item>
        <item>51,PE</item>
        <item>63,PH</item>
        <item>870,PN</item>
        <item>48,PL</item>
        <item>351,PT</item>
        <item>1,PR</item>
        <item>974,QA</item>
        <item>40,RO</item>
        <item>7,RU</item>
        <item>250,RW</item>
        <item>590,BL</item>
        <item>685,WS</item>
        <item>378,SM</item>
        <item>239,ST</item>
        <item>966,SA</item>
        <item>221,SN</item>
        <item>381,RS</item>
        <item>248,SC</item>
        <item>232,SL</item>
        <item>65,SG</item>
        <item>421,SK</item>
        <item>386,SI</item>
        <item>677,SB</item>
        <item>252,SO</item>
        <item>27,ZA</item>
        <item>82,KR</item>
        <item>34,ES</item>
        <item>94,LK</item>
        <item>290,SH</item>
        <item>508,PM</item>
        <item>249,SD</item>
        <item>597,SR</item>
        <item>268,SZ</item>
        <item>46,SE</item>
        <item>41,CH</item>
        <item>963,SY</item>
        <item>886,TW</item>
        <item>992,TJ</item>
        <item>255,TZ</item>
        <item>66,TH</item>
        <item>228,TG</item>
        <item>690,TK</item>
        <item>676,TO</item>
        <item>216,TN</item>
        <item>90,TR</item>
        <item>993,TM</item>
        <item>688,TV</item>
        <item>971,AE</item>
        <item>256,UG</item>
        <item>44,GB</item>
        <item>380,UA</item>
        <item>598,UY</item>
        <item>1,US</item>
        <item>998,UZ</item>
        <item>678,VU</item>
        <item>39,VA</item>
        <item>58,VE</item>
        <item>84,VN</item>
        <item>681,WF</item>
        <item>967,YE</item>
        <item>260,ZM</item>
        <item>263,ZW</item>
    </string-array>

How to use this array.

String CountryZipCode="";

String[] rl= getResources().getStringArray(R.array.CountryCodes);
    for(int i=0;i<rl.length;i++){
        String[] g=rl[i].split(",");
        if(g[1].trim().equals(CountryID.trim())){
            CountryZipCode=g[0];
            break;
        }
    }

NOTE : You can also modify above code for get Country Code in letter from Digit.

Niranj Patel
  • 32,980
  • 10
  • 97
  • 133
  • when I use GeoCoder, it will it returns different 3-digit number even thought input longitudes and latitudes are within the same country, in my case, it's China. 155 for one province, and 131 for another Chinese province..Could you explain what these number stand for ? I am sure it's not country code... – shanwu Jun 04 '16 at 02:07
  • check this [getCountryCode](https://developer.android.com/reference/android/location/Address.html#getCountryCode%28%29) – Niranj Patel Jun 06 '16 at 10:08
4

Try this

String locale = context.getResources().getConfiguration().locale.getCountry();

Another option would be to use TelephonyManager class as specified in this thread. Thanks to @Rawkode.

Community
  • 1
  • 1
ReyAnthonyRenacia
  • 17,219
  • 5
  • 37
  • 56
3

You can use Geocoding API web service as an alternative to native Geocoder class. The web service has a reverse geocoding functionality:

https://developers.google.com/maps/documentation/geocoding/intro?hl=en#ReverseGeocoding

So you can specify latitude,longitude and a result type (country) that you would like to get back.

In your case it should be something similar to:

https://maps.googleapis.com/maps/api/geocode/json?latlng=34.16667716%2C114.1774&result_type=country&key=YOUR_API_KEY.

In Android you can use AndroidHttpClient class to execute HTTP request:

https://developer.android.com/reference/android/net/http/AndroidHttpClient.html

The JSON result for aforementioned HTTP request is

{
  "results":[
    {
      "address_components":[
        {
          "long_name":"China",
          "short_name":"CN",
          "types":[
            "country","political"
          ]
        }
      ],
      "formatted_address":"China",
      "geometry":{
        "bounds":{
          "northeast":{
            "lat":53.5587016,"lng":134.7728099
          },
          "southwest":{
            "lat":18.1576156,"lng":73.4994136
          }
        },
        "location":{
          "lat":35.86166,"lng":104.195397
        },
        "location_type":"APPROXIMATE",
        "viewport":{
          "northeast":{
            "lat":53.558106,"lng":134.7728099
          },
          "southwest":{
            "lat":18.1576156,"lng":73.4994136
          }
        }
      },
      "place_id":"ChIJwULG5WSOUDERbzafNHyqHZU",
      "types":[
        "country","political"
      ]
    }
  ],
  "status":"OK"
}

So you can obtain the ISO 3166-2 code from address components short name field.

xomena
  • 31,125
  • 6
  • 88
  • 117
1
public String getCountryCode() {
    return mCountryCode;
}

Basically, this method is responsible for returning country ISO Alpha/Numerical code.

For example: In the case of China it will return 86 which is actually a dial prefix or ISO numerical code.

however, the document says...

/**
 * Returns the country code of the address, for example "US",
 * or null if it is unknown.
 */

Here:

"US" = ISO Alpha-2 code ,
"CHN" = ISO Alpha-3 code ,
155 = ISO Numerical code/dial prefix

Country ISO code  Or Country Dial code/prefix = country code // this conflicts us

However, mCountryCode is responsible to return both ISO Alpha & Numerical code based on your function used from the Address class.

Now, according to your debug message:

 D/ooo: address Address[addressLines=[0:"河南省许昌市鄢陵县",1:"刘桥村"],feature=null,admin=河南省,sub-admin=null,locality=许昌市,thoroughfare=,postalCode=null,countryCode=155,countryName=中国,hasLatitude=true,latitude=34.16667716

You got countryCode=155 which is actually a mobile phone area-code prefix in China & it will change when you change the location. That's why you got 155 & 131 for different provinces. See the Wiki

If you expect ISO code like "US" or "CHN" as string output, you may use this line:

address.getLocale().getISO3Country();

In the case of numerical output, you will get different codes which are just dial prefix based on area.

Reference: country code list

Khairul Alam Licon
  • 420
  • 10
  • 19
0

String locale = context.getResources().getConfiguration().locale.getCountry();

ben10
  • 180
  • 4
  • 15