Android Emoji支持库不会在所有设备上呈现Emojis

时间:2017-11-22 12:49:16

标签: android emoji

要在我们的应用中支持Emojis,我们正在使用Downloadable fonts,如下面的guide所述。我们正在使用Emoji Support Library version 26.0.0。该库的init代码如下。

private void initEmoji() {
    final FontRequest fontRequest = new FontRequest(
        "com.google.android.gms.fonts",
        "com.google.android.gms",
        "Noto Color Emoji Compat",
        R.array.com_google_android_gms_fonts_certs);
    EmojiCompat.Config config = new 
    FontRequestEmojiCompatConfig(getApplicationContext(), fontRequest)
    .setReplaceAll(true)
    .registerInitCallback(new EmojiCompat.InitCallback() {
      @Override
      public void onInitialized() {
        Log.i(NewsHuntAppController.class.getSimpleName(), "EmojiCompat initialized");
      }

      @Override
      public void onFailed(@Nullable Throwable throwable) {
        Log.e(NewsHuntAppController.class.getSimpleName(), "EmojiCompat initialization failed",
            throwable);
      }
    });
EmojiCompat.init(config);
}

我们在两台设备上测试了表情符号。第一个设备是Android KitKat,第二个设备是Android Nougat设备。这两款设备都具有相同的google play服务版本。我们观察到大多数Emojis在两个设备上呈现相同,但很少有Emojis在Android Nougat上加载,但在Android KitKat上没有。

以下是未在Android KitKat上加载的示例Emojis。


理想情况下,如果两个设备都具有相同的Google Play服务版本,那么应该在两个设备上呈现表情符号。但这不会发生。如果有人知道原因,请告知。

2 个答案:

答案 0 :(得分:1)

使用最新版本的支持库,开发人员可以控制EmojiCompat是否在没有变量选择器的情况下呈现,以及该规则的例外情况。请参阅: https://developer.android.com/reference/android/support/text/emoji/EmojiCompat.Config.html#setUseEmojiAsDefaultStyle(boolean)

https://emojipedia.org/emoji/%F0%9F%96%A5/)是一个表情符号,它是"文字表示"默认情况下。这意味着当只有U + 1F5A5存在时,标准表示建议在文本显示中呈现它(符号类型)。

这就是为什么EmojiCompat不接受它作为表情符号的原因。目前,要让EmojiCompat接受它作为表情符号,您必须使用带有表情符号变异选择器(U + FE0F)的特定代码点。即U + 1F5A5 U + FE0F

答案 1 :(得分:0)

因此,根据@Siyamed的回答,解决方案还是要添加U + FE0F。

代码如下:

private static int[] fix(int... ary) {
    if (ary[ary.length - 1] == 0xfe0f) return ary;
    int[] result = Arrays.copyOf(ary, ary.length + 1);
    result[ary.length] = 0xfe0f;
    return result;
}
...
int[] codePoints = fix(0x1f1fe, 0x1f1ea); // <- just a example, I added it to all emojis 
String emoji = new String(codePoints, 0, codePoints.length);