web-dev-qa-db-fra.com

Méthode fiable pour obtenir le pays dans lequel se trouve l'utilisateur?

Je reçois généralement le pays de la langue de l'appareil. Cela fonctionne, mais je dois maintenant reconnaître le Brésil. Et la plupart des appareils n’ont que l’option portugaise (pt_PT) et aucune option portugaise (Brésil).

J'ai vérifié ce fil: Où suis-je? - Obtenir le pays

Les méthodes

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

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

Sont encore la seule langue, ne aide pas.

Il y a aussi la suggestion avec la carte SIM, mais je ne suis pas sûr que cela fonctionne de manière fiable (toutes les cartes SIM ont-elles cette identification unique?) (ce qui est le cas s'il s'agissait d'un paramètre) et exclura les utilisateurs utilisant un appareil sans carte SIM (peut-être qu'ils utilisent simplement le WLAN).

Il existe également une suggestion de géolocalisation, mais cela ne fonctionnera probablement pas avec les appareils qui l'ont désactivé. Ou ai-je tort?

Si rien ne sert, je créerais un dialogue ou un paramètre de menu dans mon application pour que l'utilisateur puisse le sélectionner. Mais je voudrais d’abord confirmer s’il existe une possibilité fiable avec cet appareil.

20
Ixx

Vous pouvez extraire l’emplacement du réseau téléphonique :

TelephonyManager.getNetworkCountryIso()

Ou depuis la carte SIM :

TelephonyManager.getSimCountryIso()

Ou, si vous avez le numéro de téléphone de l'utilisateur , vous pourrez peut-être le faire correspondre au pays par le biais de cette donnée .

Idéalement, vous pouvez utiliser les trois (dans un certain ordre, peut-être SIM, N ° de téléphone, puis Réseau), et si rien ne fonctionne, utilisez la géolocalisation inversée en dernier recours.

33
Eric

Essaye ça:

 TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
 if (teleMgr != null){
     countryISOCode = teleMgr.getSimCountryIso();
 }

Maintenant, countryISOCode contiendrait l’un des codes suivants, similaires aux codes de pays ISO 3166, conformément à cette Wikipedia entry .

7
t0mm13b
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.getNetworkCountryIso();

Comme le répond Eric, le code ci-dessus est la meilleure approche. Il convient également de noter que,

mTelephonyManager.getSimCountryIso()

ne doit pas être utilisé car cela indiquerait le pays d'origine du fournisseur de la carte SIM (par exemple, une carte SIM Vodaphone UK renverrait "gb", une carte SIM Vodaphone Allemagne renverrait "de") et non l'emplacement actuel (Pays) de l'appareil. Cette différence est significative lorsque l'utilisateur est en itinérance.

1
Shavi

La géolocalisation serait la plus efficace et la plus discrète. Vous pouvez toujours utiliser la géolocalisation et, si l'utilisateur l'a désactivée, affichez votre boîte de dialogue vous demandant son pays. Moins vous blessez l'utilisateur pour information, mieux c'est.

1
D.A

Ça marche sur moi. 

String countryISOCode;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    if (teleMgr != null){
        countryISOCode = teleMgr.getSimCountryIso();
    }

............................

0
abir99