country-picker-android

最近在做app登录的时候,因为需要支持国外手机号注册和登录,所以就涉及到国际电话区号的选择。在github上面找了一下,国家名称基本都是只有英文版本,而手动的去把中文一个个加上实在是一件费时费力的事情,所以就写了一段简单的java代码,抓取了某快递网站的数据转换成json格式,以下是处理后的数据

[
  {
    "en": "Angola",
    "zh": "安哥拉",
    "locale": "AO",
    "code": 244
  },
  {
    "en": "Afghanistan",
    "zh": "阿富汗",
    "locale": "AF",
    "code": 93
  },
  {
    "en": "Albania",
    "zh": "阿尔巴尼亚",
    "locale": "AL",
    "code": 355
  },
  {
    "en": "Algeria",
    "zh": "阿尔及利亚",
    "locale": "DZ",
    "code": 213
  },
  {
    "en": "Andorra",
    "zh": "安道尔共和国",
    "locale": "AD",
    "code": 376
  },
  {
    "en": "Anguilla",
    "zh": "安圭拉岛",
    "locale": "AI",
    "code": 1264
  },
  {
    "en": "Antigua and Barbuda",
    "zh": "安提瓜和巴布达",
    "locale": "AG",
    "code": 1268
  },
  {
    "en": "Argentina",
    "zh": "阿根廷",
    "locale": "AR",
    "code": 54
  },
  {
    "en": "Armenia",
    "zh": "亚美尼亚",
    "locale": "AM",
    "code": 374
  },
  {
    "en": "Ascension",
    "zh": "阿森松",
    "locale": " ",
    "code": 247
  },
  {
    "en": "Australia",
    "zh": "澳大利亚",
    "locale": "AU",
    "code": 61
  },
  {
    "en": "Austria",
    "zh": "奥地利",
    "locale": "AT",
    "code": 43
  },
  {
    "en": "Azerbaijan",
    "zh": "阿塞拜疆",
    "locale": "AZ",
    "code": 994
  },
  {
    "en": "Bahamas",
    "zh": "巴哈马",
    "locale": "BS",
    "code": 1242
  },
  {
    "en": "Bahrain",
    "zh": "巴林",
    "locale": "BH",
    "code": 973
  },
  {
    "en": "Bangladesh",
    "zh": "孟加拉国",
    "locale": "BD",
    "code": 880
  },
  {
    "en": "Barbados",
    "zh": "巴巴多斯",
    "locale": "BB",
    "code": 1246
  },
  {
    "en": "Belarus",
    "zh": "白俄罗斯",
    "locale": "BY",
    "code": 375
  },
  {
    "en": "Belgium",
    "zh": "比利时",
    "locale": "BE",
    "code": 32
  },
  {
    "en": "Belize",
    "zh": "伯利兹",
    "locale": "BZ",
    "code": 501
  },
  {
    "en": "Benin",
    "zh": "贝宁",
    "locale": "BJ",
    "code": 229
  },
  {
    "en": "Bermuda Is.",
    "zh": "百慕大群岛",
    "locale": "BM",
    "code": 1441
  },
  {
    "en": "Bolivia",
    "zh": "玻利维亚",
    "locale": "BO",
    "code": 591
  },
  {
    "en": "Botswana",
    "zh": "博茨瓦纳",
    "locale": "BW",
    "code": 267
  },
  {
    "en": "Brazil",
    "zh": "巴西",
    "locale": "BR",
    "code": 55
  },
  {
    "en": "Brunei",
    "zh": "文莱",
    "locale": "BN",
    "code": 673
  },
  {
    "en": "Bulgaria",
    "zh": "保加利亚",
    "locale": "BG",
    "code": 359
  },
  {
    "en": "Burkina-faso",
    "zh": "布基纳法索",
    "locale": "BF",
    "code": 226
  },
  {
    "en": "Burma",
    "zh": "缅甸",
    "locale": "MM",
    "code": 95
  },
  {
    "en": "Burundi",
    "zh": "布隆迪",
    "locale": "BI",
    "code": 257
  },
  {
    "en": "Cameroon",
    "zh": "喀麦隆",
    "locale": "CM",
    "code": 237
  },
  {
    "en": "Canada",
    "zh": "加拿大",
    "locale": "CA",
    "code": 1
  },
  {
    "en": "Cayman Is.",
    "zh": "开曼群岛",
    "locale": " ",
    "code": 1345
  },
  {
    "en": "Central African Republic",
    "zh": "中非共和国",
    "locale": "CF",
    "code": 236
  },
  {
    "en": "Chad",
    "zh": "乍得",
    "locale": "TD",
    "code": 235
  },
  {
    "en": "Chile",
    "zh": "智利",
    "locale": "CL",
    "code": 56
  },
  {
    "en": "China",
    "zh": "中国",
    "locale": "CN",
    "code": 86
  },
  {
    "en": "Colombia",
    "zh": "哥伦比亚",
    "locale": "CO",
    "code": 57
  },
  {
    "en": "Congo",
    "zh": "刚果",
    "locale": "CG",
    "code": 242
  },
  {
    "en": "Cook Is.",
    "zh": "库克群岛",
    "locale": "CK",
    "code": 682
  },
  {
    "en": "Costa Rica",
    "zh": "哥斯达黎加",
    "locale": "CR",
    "code": 506
  },
  {
    "en": "Cuba",
    "zh": "古巴",
    "locale": "CU",
    "code": 53
  },
  {
    "en": "Cyprus",
    "zh": "塞浦路斯",
    "locale": "CY",
    "code": 357
  },
  {
    "en": "Czech Republic",
    "zh": "捷克",
    "locale": "CZ",
    "code": 420
  },
  {
    "en": "Denmark",
    "zh": "丹麦",
    "locale": "DK",
    "code": 45
  },
  {
    "en": "Djibouti",
    "zh": "吉布提",
    "locale": "DJ",
    "code": 253
  },
  {
    "en": "Dominica Rep.",
    "zh": "多米尼加共和国",
    "locale": "DO",
    "code": 1890
  },
  {
    "en": "Ecuador",
    "zh": "厄瓜多尔",
    "locale": "EC",
    "code": 593
  },
  {
    "en": "Egypt",
    "zh": "埃及",
    "locale": "EG",
    "code": 20
  },
  {
    "en": "EI Salvador",
    "zh": "萨尔瓦多",
    "locale": "SV",
    "code": 503
  },
  {
    "en": "Estonia",
    "zh": "爱沙尼亚",
    "locale": "EE",
    "code": 372
  },
  {
    "en": "Ethiopia",
    "zh": "埃塞俄比亚",
    "locale": "ET",
    "code": 251
  },
  {
    "en": "Fiji",
    "zh": "斐济",
    "locale": "FJ",
    "code": 679
  },
  {
    "en": "Finland",
    "zh": "芬兰",
    "locale": "FI",
    "code": 358
  },
  {
    "en": "France",
    "zh": "法国",
    "locale": "FR",
    "code": 33
  },
  {
    "en": "French Guiana",
    "zh": "法属圭亚那",
    "locale": "GF",
    "code": 594
  },
  {
    "en": "Gabon",
    "zh": "加蓬",
    "locale": "GA",
    "code": 241
  },
  {
    "en": "Gambia",
    "zh": "冈比亚",
    "locale": "GM",
    "code": 220
  },
  {
    "en": "Georgia",
    "zh": "格鲁吉亚",
    "locale": "GE",
    "code": 995
  },
  {
    "en": "Germany",
    "zh": "德国",
    "locale": "DE",
    "code": 49
  },
  {
    "en": "Ghana",
    "zh": "加纳",
    "locale": "GH",
    "code": 233
  },
  {
    "en": "Gibraltar",
    "zh": "直布罗陀",
    "locale": "GI",
    "code": 350
  },
  {
    "en": "Greece",
    "zh": "希腊",
    "locale": "GR",
    "code": 30
  },
  {
    "en": "Grenada",
    "zh": "格林纳达",
    "locale": "GD",
    "code": 1809
  },
  {
    "en": "Guam",
    "zh": "关岛",
    "locale": "GU",
    "code": 1671
  },
  {
    "en": "Guatemala",
    "zh": "危地马拉",
    "locale": "GT",
    "code": 502
  },
  {
    "en": "Guinea",
    "zh": "几内亚",
    "locale": "GN",
    "code": 224
  },
  {
    "en": "Guyana",
    "zh": "圭亚那",
    "locale": "GY",
    "code": 592
  },
  {
    "en": "Haiti",
    "zh": "海地",
    "locale": "HT",
    "code": 509
  },
  {
    "en": "Honduras",
    "zh": "洪都拉斯",
    "locale": "HN",
    "code": 504
  },
  {
    "en": "Hongkong",
    "zh": "香港",
    "locale": "HK",
    "code": 852
  },
  {
    "en": "Hungary",
    "zh": "匈牙利",
    "locale": "HU",
    "code": 36
  },
  {
    "en": "Iceland",
    "zh": "冰岛",
    "locale": "IS",
    "code": 354
  },
  {
    "en": "India",
    "zh": "印度",
    "locale": "IN",
    "code": 91
  },
  {
    "en": "Indonesia",
    "zh": "印度尼西亚",
    "locale": "ID",
    "code": 62
  },
  {
    "en": "Iran",
    "zh": "伊朗",
    "locale": "IR",
    "code": 98
  },
  {
    "en": "Iraq",
    "zh": "伊拉克",
    "locale": "IQ",
    "code": 964
  },
  {
    "en": "Ireland",
    "zh": "爱尔兰",
    "locale": "IE",
    "code": 353
  },
  {
    "en": "Israel",
    "zh": "以色列",
    "locale": "IL",
    "code": 972
  },
  {
    "en": "Italy",
    "zh": "意大利",
    "locale": "IT",
    "code": 39
  },
  {
    "en": "Ivory Coast",
    "zh": "科特迪瓦",
    "locale": " ",
    "code": 225
  },
  {
    "en": "Jamaica",
    "zh": "牙买加",
    "locale": "JM",
    "code": 1876
  },
  {
    "en": "Japan",
    "zh": "日本",
    "locale": "JP",
    "code": 81
  },
  {
    "en": "Jordan",
    "zh": "约旦",
    "locale": "JO",
    "code": 962
  },
  {
    "en": "Kampuchea (Cambodia )",
    "zh": "柬埔寨",
    "locale": "KH",
    "code": 855
  },
  {
    "en": "Kazakstan",
    "zh": "哈萨克斯坦",
    "locale": "KZ",
    "code": 327
  },
  {
    "en": "Kenya",
    "zh": "肯尼亚",
    "locale": "KE",
    "code": 254
  },
  {
    "en": "Korea",
    "zh": "韩国",
    "locale": "KR",
    "code": 82
  },
  {
    "en": "Kuwait",
    "zh": "科威特",
    "locale": "KW",
    "code": 965
  },
  {
    "en": "Kyrgyzstan",
    "zh": "吉尔吉斯坦",
    "locale": "KG",
    "code": 331
  },
  {
    "en": "Laos",
    "zh": "老挝",
    "locale": "LA",
    "code": 856
  },
  {
    "en": "Latvia",
    "zh": "拉脱维亚",
    "locale": "LV",
    "code": 371
  },
  {
    "en": "Lebanon",
    "zh": "黎巴嫩",
    "locale": "LB",
    "code": 961
  },
  {
    "en": "Lesotho",
    "zh": "莱索托",
    "locale": "LS",
    "code": 266
  },
  {
    "en": "Liberia",
    "zh": "利比里亚",
    "locale": "LR",
    "code": 231
  },
  {
    "en": "Libya",
    "zh": "利比亚",
    "locale": "LY",
    "code": 218
  },
  {
    "en": "Liechtenstein",
    "zh": "列支敦士登",
    "locale": "LI",
    "code": 423
  },
  {
    "en": "Lithuania",
    "zh": "立陶宛",
    "locale": "LT",
    "code": 370
  },
  {
    "en": "Luxembourg",
    "zh": "卢森堡",
    "locale": "LU",
    "code": 352
  },
  {
    "en": "Macao",
    "zh": "澳门",
    "locale": "MO",
    "code": 853
  },
  {
    "en": "Madagascar",
    "zh": "马达加斯加",
    "locale": "MG",
    "code": 261
  },
  {
    "en": "Malawi",
    "zh": "马拉维",
    "locale": "MW",
    "code": 265
  },
  {
    "en": "Malaysia",
    "zh": "马来西亚",
    "locale": "MY",
    "code": 60
  },
  {
    "en": "Maldives",
    "zh": "马尔代夫",
    "locale": "MV",
    "code": 960
  },
  {
    "en": "Mali",
    "zh": "马里",
    "locale": "ML",
    "code": 223
  },
  {
    "en": "Malta",
    "zh": "马耳他",
    "locale": "MT",
    "code": 356
  },
  {
    "en": "Mariana Is",
    "zh": "马里亚那群岛",
    "locale": " ",
    "code": 1670
  },
  {
    "en": "Martinique",
    "zh": "马提尼克",
    "locale": " ",
    "code": 596
  },
  {
    "en": "Mauritius",
    "zh": "毛里求斯",
    "locale": "MU",
    "code": 230
  },
  {
    "en": "Mexico",
    "zh": "墨西哥",
    "locale": "MX",
    "code": 52
  },
  {
    "en": "Moldova, Republic of",
    "zh": "摩尔多瓦",
    "locale": "MD",
    "code": 373
  },
  {
    "en": "Monaco",
    "zh": "摩纳哥",
    "locale": "MC",
    "code": 377
  },
  {
    "en": "Mongolia",
    "zh": "蒙古",
    "locale": "MN",
    "code": 976
  },
  {
    "en": "Montserrat Is",
    "zh": "蒙特塞拉特岛",
    "locale": "MS",
    "code": 1664
  },
  {
    "en": "Morocco",
    "zh": "摩洛哥",
    "locale": "MA",
    "code": 212
  },
  {
    "en": "Mozambique",
    "zh": "莫桑比克",
    "locale": "MZ",
    "code": 258
  },
  {
    "en": "Namibia",
    "zh": "纳米比亚",
    "locale": "NA",
    "code": 264
  },
  {
    "en": "Nauru",
    "zh": "瑙鲁",
    "locale": "NR",
    "code": 674
  },
  {
    "en": "Nepal",
    "zh": "尼泊尔",
    "locale": "NP",
    "code": 977
  },
  {
    "en": "Netheriands Antilles",
    "zh": "荷属安的列斯",
    "locale": " ",
    "code": 599
  },
  {
    "en": "Netherlands",
    "zh": "荷兰",
    "locale": "NL",
    "code": 31
  },
  {
    "en": "New Zealand",
    "zh": "新西兰",
    "locale": "NZ",
    "code": 64
  },
  {
    "en": "Nicaragua",
    "zh": "尼加拉瓜",
    "locale": "NI",
    "code": 505
  },
  {
    "en": "Niger",
    "zh": "尼日尔",
    "locale": "NE",
    "code": 227
  },
  {
    "en": "Nigeria",
    "zh": "尼日利亚",
    "locale": "NG",
    "code": 234
  },
  {
    "en": "North Korea",
    "zh": "朝鲜",
    "locale": "KP",
    "code": 850
  },
  {
    "en": "Norway",
    "zh": "挪威",
    "locale": "NO",
    "code": 47
  },
  {
    "en": "Oman",
    "zh": "阿曼",
    "locale": "OM",
    "code": 968
  },
  {
    "en": "Pakistan",
    "zh": "巴基斯坦",
    "locale": "PK",
    "code": 92
  },
  {
    "en": "Panama",
    "zh": "巴拿马",
    "locale": "PA",
    "code": 507
  },
  {
    "en": "Papua New Cuinea",
    "zh": "巴布亚新几内亚",
    "locale": "PG",
    "code": 675
  },
  {
    "en": "Paraguay",
    "zh": "巴拉圭",
    "locale": "PY",
    "code": 595
  },
  {
    "en": "Peru",
    "zh": "秘鲁",
    "locale": "PE",
    "code": 51
  },
  {
    "en": "Philippines",
    "zh": "菲律宾",
    "locale": "PH",
    "code": 63
  },
  {
    "en": "Poland",
    "zh": "波兰",
    "locale": "PL",
    "code": 48
  },
  {
    "en": "French Polynesia",
    "zh": "法属玻利尼西亚",
    "locale": "PF",
    "code": 689
  },
  {
    "en": "Portugal",
    "zh": "葡萄牙",
    "locale": "PT",
    "code": 351
  },
  {
    "en": "Puerto Rico",
    "zh": "波多黎各",
    "locale": "PR",
    "code": 1787
  },
  {
    "en": "Qatar",
    "zh": "卡塔尔",
    "locale": "QA",
    "code": 974
  },
  {
    "en": "Reunion",
    "zh": "留尼旺",
    "locale": " ",
    "code": 262
  },
  {
    "en": "Romania",
    "zh": "罗马尼亚",
    "locale": "RO",
    "code": 40
  },
  {
    "en": "Russia",
    "zh": "俄罗斯",
    "locale": "RU",
    "code": 7
  },
  {
    "en": "Saint Lueia",
    "zh": "圣卢西亚",
    "locale": "LC",
    "code": 1758
  },
  {
    "en": "Saint Vincent",
    "zh": "圣文森特岛",
    "locale": "VC",
    "code": 1784
  },
  {
    "en": "Samoa Eastern",
    "zh": "东萨摩亚(美)",
    "locale": " ",
    "code": 684
  },
  {
    "en": "Samoa Western",
    "zh": "西萨摩亚",
    "locale": " ",
    "code": 685
  },
  {
    "en": "San Marino",
    "zh": "圣马力诺",
    "locale": "SM",
    "code": 378
  },
  {
    "en": "Sao Tome and Principe",
    "zh": "圣多美和普林西比",
    "locale": "ST",
    "code": 239
  },
  {
    "en": "Saudi Arabia",
    "zh": "沙特阿拉伯",
    "locale": "SA",
    "code": 966
  },
  {
    "en": "Senegal",
    "zh": "塞内加尔",
    "locale": "SN",
    "code": 221
  },
  {
    "en": "Seychelles",
    "zh": "塞舌尔",
    "locale": "SC",
    "code": 248
  },
  {
    "en": "Sierra Leone",
    "zh": "塞拉利昂",
    "locale": "SL",
    "code": 232
  },
  {
    "en": "Singapore",
    "zh": "新加坡",
    "locale": "SG",
    "code": 65
  },
  {
    "en": "Slovakia",
    "zh": "斯洛伐克",
    "locale": "SK",
    "code": 421
  },
  {
    "en": "Slovenia",
    "zh": "斯洛文尼亚",
    "locale": "SI",
    "code": 386
  },
  {
    "en": "Solomon Is",
    "zh": "所罗门群岛",
    "locale": "SB",
    "code": 677
  },
  {
    "en": "Somali",
    "zh": "索马里",
    "locale": "SO",
    "code": 252
  },
  {
    "en": "South Africa",
    "zh": "南非",
    "locale": "ZA",
    "code": 27
  },
  {
    "en": "Spain",
    "zh": "西班牙",
    "locale": "ES",
    "code": 34
  },
  {
    "en": "Sri Lanka",
    "zh": "斯里兰卡",
    "locale": "LK",
    "code": 94
  },
  {
    "en": "St.Lucia",
    "zh": "圣卢西亚",
    "locale": "LC",
    "code": 1758
  },
  {
    "en": "St.Vincent",
    "zh": "圣文森特",
    "locale": "VC",
    "code": 1784
  },
  {
    "en": "Sudan",
    "zh": "苏丹",
    "locale": "SD",
    "code": 249
  },
  {
    "en": "Suriname",
    "zh": "苏里南",
    "locale": "SR",
    "code": 597
  },
  {
    "en": "Swaziland",
    "zh": "斯威士兰",
    "locale": "SZ",
    "code": 268
  },
  {
    "en": "Sweden",
    "zh": "瑞典",
    "locale": "SE",
    "code": 46
  },
  {
    "en": "Switzerland",
    "zh": "瑞士",
    "locale": "CH",
    "code": 41
  },
  {
    "en": "Syria",
    "zh": "叙利亚",
    "locale": "SY",
    "code": 963
  },
  {
    "en": "Taiwan",
    "zh": "台湾省",
    "locale": "TW",
    "code": 886
  },
  {
    "en": "Tajikstan",
    "zh": "塔吉克斯坦",
    "locale": "TJ",
    "code": 992
  },
  {
    "en": "Tanzania",
    "zh": "坦桑尼亚",
    "locale": "TZ",
    "code": 255
  },
  {
    "en": "Thailand",
    "zh": "泰国",
    "locale": "TH",
    "code": 66
  },
  {
    "en": "Togo",
    "zh": "多哥",
    "locale": "TG",
    "code": 228
  },
  {
    "en": "Tonga",
    "zh": "汤加",
    "locale": "TO",
    "code": 676
  },
  {
    "en": "Trinidad and Tobago",
    "zh": "特立尼达和多巴哥",
    "locale": "TT",
    "code": 1809
  },
  {
    "en": "Tunisia",
    "zh": "突尼斯",
    "locale": "TN",
    "code": 216
  },
  {
    "en": "Turkey",
    "zh": "土耳其",
    "locale": "TR",
    "code": 90
  },
  {
    "en": "Turkmenistan",
    "zh": "土库曼斯坦",
    "locale": "TM",
    "code": 993
  },
  {
    "en": "Uganda",
    "zh": "乌干达",
    "locale": "UG",
    "code": 256
  },
  {
    "en": "Ukraine",
    "zh": "乌克兰",
    "locale": "UA",
    "code": 380
  },
  {
    "en": "United Arab Emirates",
    "zh": "阿拉伯联合酋长国",
    "locale": "AE",
    "code": 971
  },
  {
    "en": "United Kiongdom",
    "zh": "英国",
    "locale": "GB",
    "code": 44
  },
  {
    "en": "United States of America",
    "zh": "美国",
    "locale": "US",
    "code": 1
  },
  {
    "en": "Uruguay",
    "zh": "乌拉圭",
    "locale": "UY",
    "code": 598
  },
  {
    "en": "Uzbekistan",
    "zh": "乌兹别克斯坦",
    "locale": "UZ",
    "code": 233
  },
  {
    "en": "Venezuela",
    "zh": "委内瑞拉",
    "locale": "VE",
    "code": 58
  },
  {
    "en": "Vietnam",
    "zh": "越南",
    "locale": "VN",
    "code": 84
  },
  {
    "en": "Yemen",
    "zh": "也门",
    "locale": "YE",
    "code": 967
  },
  {
    "en": "Yugoslavia",
    "zh": "南斯拉夫",
    "locale": "YU",
    "code": 381
  },
  {
    "en": "Zimbabwe",
    "zh": "津巴布韦",
    "locale": "ZW",
    "code": 263
  },
  {
    "en": "Zaire",
    "zh": "扎伊尔",
    "locale": "ZR",
    "code": 243
  },
  {
    "en": "Zambia",
    "zh": "赞比亚",
    "locale": "ZM",
    "code": 260
  }
]

然后基于json做了一个选择器

img

使用起来非常简单

public class MainActivity extends AppCompatActivity {
    private ImageView ivFlag;
    private TextView tvName;
    private TextView tvCode;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ivFlag = (ImageView) findViewById(R.id.iv_flag);
        tvName = (TextView) findViewById(R.id.tv_name);
        tvCode = (TextView) findViewById(R.id.tv_code);
    }
    public void click(View view) {
        CountryPicker.newInstance(null, new OnPick() {
            @Override
            public void onPick(Country country) {
                if(country.flag != 0) ivFlag.setImageResource(country.flag);
                tvName.setText(country.name);
                tvCode.setText("+" + country.code);
            }
        }).show(getSupportFragmentManager(), "country");
    }
    @Override
    protected void onDestroy() {
        Country.destroy();
        super.onDestroy();
    }
}

最近加入了繁体版本的国家名称,并提供了一个带字母索引的Activity形式的选择器
img
使用示例

startActivityForResult(new Intent(getApplicationContext(), PickActivity.class), 111);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 111 && resultCode == Activity.RESULT_OK) {
        Country country = Country.fromJson(data.getStringExtra("country"));
        if(country.flag != 0) ivFlag.setImageResource(country.flag);
        tvName.setText(country.name);
        tvCode.setText("+" + country.code);
    }
}

这个Activity目前比较简陋,仅供参考。 其实代码非常的简单,但是要把各个国家或者地区对应的中英文名称和国旗一一对应起来实在是一件费时费力的事情。

致谢

此代码参考了:https://github.com/mukeshsolanki/country-picker-android 并使用了相同的国旗图片