如何通过代码在安卓设备上检测表情符号支持

11

通过编码,我可以制作一个按钮将这三个表情符号插入到文本中:⚽️

然而,在许多手机上,当用户点击该按钮时,问题是⚽️显示为[X][X][X]。甚至更糟糕的是,它只显示三个空格。

我想要在Android设备上禁用和隐藏自己内置的表情符号键盘,因为一些设备无法正确显示表情符号。请问有人知道或者有什么提示可以在代码中检测设备是否支持表情符号?

我已经阅读过表情符号从android 4.1开始得到支持,但我没有这样的经验....


我怀疑这些X来自于苹果iPhone或iPad等设备。我用Galaxy已经好几年了,而我的家人都用iPhone。我总是收到一些消息,但是表情符号却显示成了X。 - mlegg
可能是iPhone和Android表情符号之间的问题,但我想尝试通过代码检测对表情符号的支持,我认为这样会更安全。 - Vidar Vestnes
如果您已经解决了问题,我很想看看您是如何解决的细节。 - Suragch
请查看此链接 https://github.com/google/mozc/blob/master/src/android/src/com/google/android/inputmethod/japanese/emoji/EmojiRenderableChecker.java - Jaime Agudo
4个回答

11

我刚刚自己解决了这个问题。 Android的好处是它是开源的,所以当你遇到这样的问题时,你有很大的机会找到一个可行的方法来帮助你。

在Android开源项目中,你可以找到一个方法,他们使用Paint.hasGlyph来检测是否存在给定表情符号的字体。然而,由于此方法在API 23之前不可用,他们还进行测试渲染,并将结果与“tofu”(您在帖子中提到的[x]字符)的宽度进行比较。

这种方法还存在一些缺陷,但足以让你入门。

谷歌源代码:


我的4.1设备明明有表情符号,但是标志/企鹅测试失败了 :( - djdance

10
根据Jason Gore的回答:
例如创建布尔值canShowFlagEmoji:
 private static boolean canShowFlagEmoji() {
        Paint paint = new Paint();
        String switzerland = "\uD83C\uDDE8\uD83C\uDDED"; //  Here enter Surrogates of Emoji
        try {
            return paint.hasGlyph(switzerland);
        } catch (NoSuchMethodError e) {
            // Compare display width of single-codepoint emoji to width of flag emoji to determine
            // whether flag is rendered as single glyph or two adjacent regional indicator symbols.
            float flagWidth = paint.measureText(switzerland);
            float standardWidth = paint.measureText("\uD83D\uDC27"); //  U+1F427 Penguin
            return flagWidth < standardWidth * 1.25;
            // This assumes that a valid glyph for the flag emoji must be less than 1.25 times
            // the width of the penguin.
        }
    }

然后在代码中,每当您需要检查表情符号是否可用时:

if (canShowFlagEmoji()){
    // Code when FlagEmoji is available
} else {
    // And when not
}

您可以在此处点击“详情”以获取表情符号的替代品。


1
我还没有测试过这个,但将一些实际的代码放在回答中绝对比只是链接要好。 - Suragch

3

1
谢谢,但那个库不好处理。你必须进行特殊的及时初始化库,更不用提其他问题了。 - JamisonMan111

0
        final Paint paint = new Paint();
        final boolean isEmojiRendered;
        if (VERSION.SDK_INT >= VERSION_CODES.M) {
            isEmojiRendered = paint.hasGlyph(emoji);
        }
        else{
            isEmojiRendered = paint.measureText(emoji) > 7;
        }

宽度 > 7 部分特别 hacky,我期望非可渲染的表情符号值为0.0,但在几个设备上,我发现非可渲染的值实际上在3.0到6.0之间,可渲染的值在12.0到15.0之间。你的结果可能会有所不同,所以你可能需要测试一下。我相信字体大小也会影响measureText()的输出,所以要记住这一点。

第二部分由RogueBaneling在这里回答 如何检查我的设备是否能够正确地呈现Emoji图像?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接