84 votes

Comment puis-je obtenir le code pays de mon appareil Android sans utiliser le GPS ?

Un téléphone portable Android sait très bien où il se trouve, mais existe-t-il un moyen de retrouver le pays à partir d'un code ou d'un nom de pays ?

Il n'est pas nécessaire de connaître la position GPS exacte - le code ou le nom du pays suffit, et j'utilise ce code :

 String locale = context.getResources().getConfiguration().locale.getCountry(Locale.getDefault());
 System.out.println("country = "+locale);

Il me donne le code "US", mais mon appareil est resté en Inde. Existe-t-il un moyen de connaître le code pays actuel de l'appareil sans utiliser le GPS ou un fournisseur de réseau ?

Parce que j'utilise une tablette.

107voto

Kishath Points 2818

Vous pouvez simplement utiliser ce code,

TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String countryCodeValue = tm.getNetworkCountryIso();

Le résultat sera "US" si votre réseau connecté actuel se trouve aux États-Unis. Cela fonctionne même sans carte SIM.

104voto

Rawkode Points 8616

Vous ne devez rien transmettre à getCountry() . Enlever Locale.getDefault() :

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

60voto

shine_joseph Points 1559

Utiliser le lien http://ip-api.com/json . Cela fournira toutes les informations sous forme de JSON. À partir de ce contenu JSON, vous pouvez facilement obtenir le pays. Ce site utilise votre adresse IP actuelle. Il détecte automatiquement l'adresse IP et renvoie les détails.

Documentation

Voici ce que j'ai obtenu :

{
"as": "AS55410 C48 Okhla Industrial Estate, New Delhi-110020",
"city": "Kochi",
"country": "India",
"countryCode": "IN",
"isp": "Vodafone India",
"lat": 9.9667,
"lon": 76.2333,
"org": "Vodafone India",
"query": "123.63.81.162",
"region": "KL",
"regionName": "Kerala",
"status": "success",
"timezone": "Asia/Kolkata",
"zip": ""
}

N.B. - Comme il s'agit d'une API tierce, ne l'utilisez pas comme solution principale. De plus, je ne suis pas sûr qu'elle soit gratuite ou non.

15voto

Egemen Hamutçu Points 405

La réponse vérifiée contient un code obsolète. Vous devez l'implémenter :

String locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = context.getResources().getConfiguration().getLocales().get(0).getCountry();
} else {
    locale = context.getResources().getConfiguration().locale.getCountry();
}

12voto

Killer Points 1737

J'ai créé une fonction utilitaire (testée une fois sur un appareil où j'obtenais un code pays incorrect en fonction des paramètres locaux).

Référence : CountryCodePicker.java

fun getDetectedCountry(context: Context, defaultCountryIsoCode: String): String {

    detectSIMCountry(context)?.let {
        return it
    }

    detectNetworkCountry(context)?.let {
        return it
    }

    detectLocaleCountry(context)?.let {
        return it
    }

    return defaultCountryIsoCode
}

private fun detectSIMCountry(context: Context): String? {
    try {
        val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        Log.d(TAG, "detectSIMCountry: ${telephonyManager.simCountryIso}")
        return telephonyManager.simCountryIso
    }
    catch (e: Exception) {
        e.printStackTrace()
    }
    return null
}

private fun detectNetworkCountry(context: Context): String? {
    try {
        val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        Log.d(TAG, "detectNetworkCountry: ${telephonyManager.networkCountryIso}")
        return telephonyManager.networkCountryIso
    }
    catch (e: Exception) {
        e.printStackTrace()
    }
    return null
}

private fun detectLocaleCountry(context: Context): String? {
    try {
        val localeCountryISO = context.resources.configuration.locales[0].country
        Log.d(TAG, "detectLocaleCountry: $localeCountryISO")
        return localeCountryISO
    }
    catch (e: Exception) {
        e.printStackTrace()
    }
    return null
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X