54

国コードを取得するための最良の方法は何ですか?

今のところ、私は2つの方法を知っています。1つはTelephonyManagerで取得し、もう1つはロケールで取得します。Androidで国コードを見つけるためのもう1つの最良かつユニークな方法はどれですか?

4

9 に答える 9

82

これを試して:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();
于 2012-09-06T07:12:02.930 に答える
35

これについては常に大きな議論があり、開発者や企業が複雑な方法をとる理由がわかりません。ユーザーが選択した言語とは、ユーザーが自分の携帯電話で常に見たい言語を意味します。他の人やシステムとは異なる言語のアプリを用意するつもりはありません。

選択は非常に簡単です。ロケールを使用するか(ユーザーが優先として選択した言語を取得するため)、または、ユーザーが見たくないと既に言っている言語で情報を表示することを怒らせるために最善を尽くします。

国コードを取得するには、次を使用します。

Locale.getDefault().getCountry();
于 2012-09-09T16:37:09.833 に答える
14

使用する:

TelephonyManager tm = (TelephonyManager)getSystemService(getApplicationContext().TELEPHONY_SERVICE);
String countryCode = tm.getNetworkCountryIso();

国のISOをSIMに書き込むのはオペレーターに依存し、CDMAネットワークもサポートしているgetSimCountryIsoためよりも優れています。getSimCountryIso

于 2013-12-23T07:04:56.557 に答える
10

このコードを使用してISO2を取得できます

Locale.getDefault().getCountry()

そしてこれはISO3を取得するために:

Locale.getDefault().getISO3Country()
于 2016-05-27T01:29:58.317 に答える
6

IPアドレスで解決しました。お使いの携帯電話のIPアドレスを取得できます。Wi-Fiを使用している場合は、Wi-FiホットスポットのIPアドレスまたはモバイルサービスプロバイダーサーバーのIPアドレスになります。そのため、そのIPアドレスから、Webサービスなどに送信してその国を追跡できます。 IPアドレス。

IPアドレスの国を提供するインターネットの場合に利用可能ないくつかのソース(データベース)があります。

これが例http://whatismyipaddress.com/ip-lookupです。

于 2012-09-07T09:40:01.463 に答える
6

IPアドレスは、現在電話をかけている国を教えてくれるので、最善の方法だと思います。

あなたがそれをするなら

Locale.getDefault().getCountry();

ユーザーが国を選択した国を取得するので、イギリスを選択できます。スペインにいることもできます。おそらく、ユーザーが現在どこにいるかを知る必要があります。

例:アプリがイギリスでのみ何かを購入できると想像してください。ユーザーはスペイン出身ですが、彼/彼女はイギリスで休暇を取っているので、あなたの製品を購入したいと思っています...あなたが使用する場合

Locale.getDefault().getCountry();

そのユーザーはあなたの製品を購入することができないので、IPアドレスが私が考える最良の方法です。

于 2013-05-10T12:48:36.470 に答える
4

Reto Meierによる優れた記事があります:http: //android-developers.blogspot.com/2011/06/deep-dive-into-location.html

ソースコードなど、Androidデバイスの場所を取得するためのさまざまな手法について説明します。

次に、場所がわかれば、その国を簡単に取得できます。オンラインWebサービスまたはオフラインデータベースを使用できます。

于 2012-09-04T08:39:24.310 に答える
2

GPSとGoogleサービス(中国)なしで国を見つけることは非常に難しいです。TelephonyManagerお使いの携帯電話にSIMカードがない場合は機能しません。

またLocale、中国のユーザーが自分の言語を英語に設定した場合は機能しません(取得する国は米国または英国になります)。

アプリにインターネット接続が必要な場合は、オプションがあります。ip-apiと呼ばれるこのAPIを使用できます。これを使用する予定がある場合は、最初にドキュメントを確認してください。

このfreegeoipAPIのような他のAPIがあります。

于 2017-09-13T06:46:20.707 に答える
-1

これが完全な例です。TelephonyManagerから(SIMカードまたはCDMAデバイスから)国コードを取得してみてください。利用できない場合は、ローカル構成から取得してみてください。

private static String getDeviceCountryCode(Context context) {
    String countryCode;

    // Try to get the country code from the TelephonyManager service
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    if(tm != null) {
        // Query first getSimCountryIso()
        countryCode = tm.getSimCountryIso();
        if (countryCode != null && countryCode.length() == 2)
            return countryCode.toLowerCase();

        if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
            // Special case for CDMA devices
            countryCode = getCDMACountryIso();
        } else {
            // For 3G devices (with a SIM card), query getNetworkCountryIso()
            countryCode = tm.getNetworkCountryIso();
        }

        if (countryCode != null && countryCode.length() == 2)
            return countryCode.toLowerCase();
    }

    // If the network country is not available (tablets maybe), get the country code from the Locale class
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        countryCode = context.getResources().getConfiguration().getLocales().get(0).getCountry();
    } else {
        countryCode = context.getResources().getConfiguration().locale.getCountry();
    }

    if (countryCode != null && countryCode.length() == 2)
        return  countryCode.toLowerCase();

    // General fallback to "us"
    return "us";
}

@SuppressLint("PrivateApi")
private static String getCDMACountryIso() {
    try {
        // Try to get country code from SystemProperties private class
        Class<?> systemProperties = Class.forName("android.os.SystemProperties");
        Method get = systemProperties.getMethod("get", String.class);

        // Get homeOperator that contain MCC + MNC
        String homeOperator = ((String) get.invoke(systemProperties,
                "ro.cdma.home.operator.numeric"));

        // First three characters (MCC) from homeOperator represents the country code
        int mcc = Integer.parseInt(homeOperator.substring(0, 3));

        // Mapping just countries that actually use CDMA networks
        switch (mcc) {
            case 330: return "PR";
            case 310: return "US";
            case 311: return "US";
            case 312: return "US";
            case 316: return "US";
            case 283: return "AM";
            case 460: return "CN";
            case 455: return "MO";
            case 414: return "MM";
            case 619: return "SL";
            case 450: return "KR";
            case 634: return "SD";
            case 434: return "UZ";
            case 232: return "AT";
            case 204: return "NL";
            case 262: return "DE";
            case 247: return "LV";
            case 255: return "UA";
        }
    }
    catch (ClassNotFoundException ignored) {
    }
    catch (NoSuchMethodException ignored) {
    }
    catch (IllegalAccessException ignored) {
    }
    catch (InvocationTargetException ignored) {
    }
    catch (NullPointerException ignored) {
    }

    return null;
}

また、別のアイデアは、この回答のようにAPIリクエストを試すか、細かい場所を使用することです。

参照はここここにあります。

于 2018-09-14T08:04:48.840 に答える