我想使用国家/地区代码获取国家/地区代码,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));
但这在Kitkat
和Lollipop
中不起作用。它只是显示国家代码而不是国家标志。我已经在两种设备上进行了测试。
那么使用国家/地区代码检索国家/地区标记的最佳方法是什么。
我们将不胜感激!
答案 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表中的0x1F1E6
是REGIONAL 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)
}
}