国家/地区标志表情符号未在以下国家/地区使用国家/地区代码

时间:2019-10-25 06:34:26

标签: android locale country-codes

我想使用国家/地区代码获取国家/地区代码,API 19 to API 28的所有版本均应支持该国家/地区代码。为此,我进行了大量搜索并找到了答案,然后选择了被标记为可接受答案的代码。

我正在使用该答案中的代码

 private String localeToEmoji(Locale locale) {
    String countryCode = locale.getCountry();
    Log.v("Asdasdasdasd", countryCode+" ; "+locale.getDisplayCountry());
    int firstLetter = Character.codePointAt(countryCode.toUpperCase(), 0) - 0x41 + 0x1F1E6;
    int secondLetter = Character.codePointAt(countryCode.toUpperCase(), 1) - 0x41 + 0x1F1E6;
    return new String(Character.toChars(firstLetter)) + new String(Character.toChars(secondLetter));
}

我正在使用此功能,

 Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
 txt.setText(localeToEmoji(current));

但这在KitkatLollipop中不起作用。它只是显示国家代码而不是国家标志。我已经在两种设备上进行了测试。

那么使用国家/地区代码检索国家/地区标记的最佳方法是什么。

我们将不胜感激!

3 个答案:

答案 0 :(得分:2)

您的代码似乎不错。您需要做的是,您需要使用Emoji Compatibility

您应使用以下代码从代码中获取标志

 public String countryCodeToEmoji(String code) {

    // offset between uppercase ascii and regional indicator symbols
    int OFFSET = 127397;

    // validate code
    if (code == null || code.length() != 2) {
        return "";
    }

    //fix for uk -> gb
    if (code.equalsIgnoreCase("uk")) {
        code = "gb";
    }

    // convert code to uppercase
    code = code.toUpperCase();

    StringBuilder emojiStr = new StringBuilder();

    //loop all characters
    for (int i = 0; i < code.length(); i++) {
        emojiStr.appendCodePoint(code.charAt(i) + OFFSET);
    }

    // return emoji
    return emojiStr.toString();
}

您需要在您的 build.gradle 文件中添加表情符号依赖项

  

实现“ com.android.support:support-emoji-bundled:28.0.0”

如果需要 FontRequest ,则必须添加以下依赖项

  

实现“ com.android.support:support-emoji:28.0.0”

现在,您必须创建应用程序类并使用配置初始化EmojiCompact

  EmojiCompat.Config config = new BundledEmojiCompatConfig(getApplicationContext());
  EmojiCompat.init(config);

现在使用androidx.emoji.widget.EmojiTextView代替TextView,并通过以下方式使用该方法,

EmojiTextView txt = findViewById(R.id.txt);
txt.setText(countryCodeToEmoji("IN")); // Here you can use country codes.

这将从API 19 to API 28开始生效。

现在完成了。

答案 1 :(得分:0)

 private String localeToEmoji(Locale locale) {
    String countryCode = locale.getCountry();
    int firstLetter = Character.codePointAt(countryCode, 0) - 0x41 + 0x1F1E6;
    int secondLetter = Character.codePointAt(countryCode, 1) - 0x41 + 0x1F1E6;
    return new String(Character.toChars(firstLetter)) + new String(Character.toChars(secondLetter));

}

此处0x41代表大写字母,而Unicode表中的0x1F1E6REGIONAL INDICATOR SYMBOL LETTER A,使用中再次使用toUpper,这可能会引起问题

答案 2 :(得分:0)

@Piyush 更新答案: (注意我的代码需要大写的国家代码)

build.gradle

    implementation 'androidx.emoji:emoji-bundled:1.1.0'
    implementation 'androidx.emoji:emoji:1.1.0'

countryToEmojiCode

object CountryHelper {
    private const val flagsAsciiOffset = 127397
    fun countryToEmojiCode(countryCode: String) = StringBuilder().apply {
        val simCountryIso = if (countryCode == "UK") {
            "GB"
        } else {
            countryCode
        }
        simCountryIso.forEach {
            appendCodePoint(it.toInt() + flagsAsciiOffset)
        }
    }.toString()
}

用法:

val emojiInitializer = EmojiCompat.init(BundledEmojiCompatConfig(requireContext()))

emojiInitializer.registerInitCallback(
        EmojiCompatHelper { initialised: Boolean ->
            if (initialised) {
                val flagEmoji = EmojiCompat.get().process(flagEmojiCode).toString()
            }
        })

表情符号库的初始化回调:

class EmojiCompatHelper(private val initialised: (Boolean) -> Unit): EmojiCompat.InitCallback() {
    override fun onInitialized() {
        super.onInitialized()
        initialised(true)
    }

    override fun onFailed(throwable: Throwable?) {
        super.onFailed(throwable)
        initialised(false)
    }
}