Флаг страны смайликов не использует код страны в - PullRequest
0 голосов
/ 25 октября 2019

Я хочу получить флаг страны, используя код страны, который должен поддерживаться всеми версиями от 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. Это просто показывает код страны, а не флаг страны. Сейчас я протестировал оба устройства.

Итак, как лучше всего получить флаг страны, используя код страны.

Буду признателен за расширенную помощь!

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Ваш код кажется хорошим. Что вам нужно сделать, вам нужно использовать 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();
}

Вам необходимо добавить Emojiзависимость в вашем build.gradle файле

реализация "com.android.support:support-emoji-bundled:28.0.0"

ifвам нужно 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 последней.

Теперь это сделано.

0 голосов
/ 25 октября 2019
 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 представляет заглавную букву A, а 0x1F1E6 равно REGIONAL INDICATOR SYMBOL LETTER A в таблице Unicode, и при использовании снова используется toUpper, это может вызвать проблему

...