web-dev-qa-db-ja.com

ユーザーがいる国を取得するための信頼できる方法は?

私は通常、デバイスの言語から国を取得します。それは機能しますが、今はブラジルを認識しなければなりません。また、ほとんどのデバイスにはポルトガル語(pt_PT)のみがあり、ポルトガル語(ブラジル)のオプションはありません。

私はこのスレッドをチェックしました: 私はどこにいますか?-国を取得してください

メソッド

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

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

まだ言語のみであり、役に立ちません。

Sim-cardに関する提案もありますが、これが確実に機能するかどうかはわかりません(すべてのsimカードにこの一意のIDがありますか?)、ユーザーが変更できないため、必要なものとは少し異なります。 (これは設定の場合です)、SIMカードのないデバイスを使用しているユーザーを除外します(おそらくWLANのみを使用します)。

ジオロケーションの提案もありますが、これはおそらくそれを非アクティブ化したデバイスでは機能しません。それとも私は間違っていますか?

他に何も役に立たない場合は、ユーザーがそこで選択できるように、アプリでダイアログまたはメニュー設定を行います。ただし、最初に、デバイスに信頼できる可能性があるかどうかを確認したいと思います。

20
Ixx

あなたは場所を引っ張ることができます 電話ネットワークから

TelephonyManager.getNetworkCountryIso()

または SIMカードから

TelephonyManager.getSimCountryIso()

または、 ユーザーの電話番号を持っている の場合、 このデータ を介して国と一致させることができる場合があります。

理想的には、これら3つすべて(SIM、電話番号、ネットワークの順)を使用でき、どれも機能しない場合は、最後の手段として逆ジオロケーションを使用します。

33
Eric

これを試して:

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

これで、countryISOCodeには、このウィキペディアのISO 3166国コードに類似した次のいずれかが含まれます entry

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

エリックが答えたように、上記のコードが最良のアプローチです。注目に値するのは、

mTelephonyManager.getSimCountryIso()

これは、SIMプロバイダーの母国を示すため(たとえば、Vodaphone UK SIMは「gb」を返し、Vodaphone Germany SIMは「de」を返します)、デバイスの現在の場所(国)を示すため、使用しないでください。この違いは、ユーザーがローミングしているときに重要です。

1
Shavi

ジオロケーションは最も効果的で邪魔にならないでしょう。地理位置情報はいつでも使用できます。ユーザーが地理位置情報を無効にしている場合は、国を尋ねるダイアログを表示します。情報についてユーザーにバグを報告することが少なければ少ないほどよい。

1
D.A

それは私に取り組んでいます。

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