如何在安卓系统中获取国家代码(呼叫代码)?

12

如何在 Android 代码中获取我的 SIM 卡的国家代码?我已经使用了以下代码:

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

但是,我得到的国家名称像 "BD" 代表孟加拉国,我需要 +880 代表孟加拉国。这段代码的作用相同:Locale.getDefault().getCountry(); 我需要类似于 +91 代表印度,+880 代表孟加拉国的代码。


请参考以下链接:https://dev59.com/5mgv5IYBdhLWcg3wNeDS - Ben van Gompel
您提供的链接只显示美国,甚至没有+1。但我来自孟加拉国。我需要+880。请提供任何有效的代码。谢谢。@BenvanGompel - Barun Kumar
1
ISO国家代码不是国际电话号码前缀。在获取ISO代码后,您可以像其他重复问题中那样转换获取电话前缀。 - phuclv
1
看这里的最后一个答案:https://dev59.com/5mgv5IYBdhLWcg3wNeDS - velasco622
4个回答

23

TelephonyManager类中没有直接返回国家拨号代码的方法。您需要为所有国家创建键值对列表。

<string-array name="DialingCountryCode" >
<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>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>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>358,FI</item>
<item>33,FR</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>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>

public static String getCountryDialCode(){
    String contryId = null;
    String contryDialCode = null;

    TelephonyManager telephonyMngr = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

    contryId = telephonyMngr.getSimCountryIso().toUpperCase();
    String[] arrContryCode=this.getResources().getStringArray(R.array.DialingCountryCode);
    for(int i=0; i<arrContryCode.length; i++){
        String[] arrDial = arrContryCode[i].split(",");
        if(arrDial[1].trim().equals(CountryID.trim())){
            contryDialCode = arrDial[0];
            break;  
        }
    }
    return contryDialCode;
}

1
@Vid: 1 应该是美国而不是加拿大。 - Ashwin
1
实际上,1代表“北美洲”,包括美国、加拿大和其他一些国家,详见北美电话区号规划 - Wernfried Domscheit
我假设这个列表应该是相当完整的:国家电话区号列表 - Wernfried Domscheit

7

实际上,libphonenumber更方便且维护得更好:

PhoneNumberUtil.createInstance(getContext())getCountryCodeForRegion(countryNameCode)

对于Android,与使用Google库不同,这个库似乎更轻量级:https://github.com/MichaelRocks/libphonenumber-android


1
@EslamWael74 这是 Google 官方库的一个针对 Android 进行了优化的分支。https://github.com/google/libphonenumber#third-party-ports - Robert

2

获取国家代码的最佳方式是使用这个库。

Github获取完整文档。

这个库可以通过添加属性app:ccp_autoDetectCountry="true"来自动检测国家代码。

代码示例:

<com.hbb20.CountryCodePicker
    android:id="@+id/ccp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp"
    app:ccp_showFullName="false"
    app:ccp_showNameCode="false"
    app:ccp_showPhoneCode="true"
    app:ccp_autoDetectCountry="true"/>

请从github阅读完整的实现细节:https://github.com/hbb20/CountryCodePickerProject


0

Kotlin

 private fun getDeviceCountryCode(context: Context): String {
        val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        var countryCode = tm.simCountryIso
        if (countryCode != null && countryCode.length == 2) return countryCode.lowercase()
        countryCode = if (tm.phoneType == TelephonyManager.PHONE_TYPE_CDMA) {
            getCDMACountryIso()
        } else {
            tm.networkCountryIso
        }
        if (countryCode != null && countryCode.length == 2) return countryCode.lowercase()
        countryCode = context.resources.configuration.locales.get(0).country
        return if (countryCode != null && countryCode.length == 2) countryCode.lowercase() else "us"
}

@SuppressLint("PrivateApi")
private fun getCDMACountryIso(): String? {
        try {
            val systemProperties = Class.forName("android.os.SystemProperties")
            val get: Method = systemProperties.getMethod("get", String::class.java)
            val homeOperator = get.invoke(
                systemProperties,
                "ro.cdma.home.operator.numeric"
            ) as String
            when (homeOperator.substring(0, 3).toInt()) {
                330 -> return "PR"
                310 -> return "US"
                311 -> return "US"
                312 -> return "US"
                316 -> return "US"
                283 -> return "AM"
                460 -> return "CN"
                455 -> return "MO"
                414 -> return "MM"
                619 -> return "SL"
                450 -> return "KR"
                634 -> return "SD"
                434 -> return "UZ"
                232 -> return "AT"
                204 -> return "NL"
                262 -> return "DE"
                247 -> return "LV"
                255 -> return "UA"
            }
        } catch (ignored: java.lang.Exception) {
        }
        return null
}

Java

private static String getDeviceCountryCode(Context context) {
    String countryCode;
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    if(tm != null) {
        countryCode = tm.getSimCountryIso();
        if (countryCode != null && countryCode.length() == 2)
            return countryCode.toLowerCase();

        if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
            countryCode = getCDMACountryIso();
        }
        else {
            countryCode = tm.getNetworkCountryIso();
        }

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

    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();

    return "us";
}

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

        String homeOperator = ((String) get.invoke(systemProperties,
                "ro.cdma.home.operator.numeric"));

        int mcc = Integer.parseInt(homeOperator.substring(0, 3));
        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(Exception e) {
    }
    return null;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接