【问题标题】:How to detect emoji support on Android by code如何通过代码检测 Android 上的表情符号支持
【发布时间】:2017-01-04 19:09:09
【问题描述】:

通过代码,我可以制作一个将这 3 个表情符号插入文本的按钮:⚽️????????

但是,在许多手机上,当用户单击按钮时,问题是⚽️??????????显示为 [X][X][X]。或者更糟糕的是,它只显示三个空格。

我想在无法正确显示表情符号的 Android 设备上禁用并隐藏我自己的内置表情符号键盘。有谁知道或有关于如何在代码中检测设备是否支持表情符号的提示?

我读过 android 4.1 支持 emoji,但这不是我的经验....

【问题讨论】:

  • 我怀疑 X 来自 Apple iPhone 或 iPad 等。我拥有 Galaxy 多年,我家的每个人都有 iPhone。我总是会收到消息,然后是 X,而不是它应该是的表情符号。
  • 我可能是iphone vs android emojis的问题,但我想尝试通过代码检测对emoji-symbol的支持,我认为这是最安全的。
  • 如果你已经解决了你的问题,我很想看看你做了什么。

标签: android emoji android-api-levels


【解决方案1】:

我自己刚刚为这个问题实施了一个解决方案。 Android 的好处是它是开源的,因此当您遇到此类问题时,您很有可能找到一种方法来帮助您。

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

这种方法还有其他一些缺点,但应该足以让您入门。

谷歌来源:

【讨论】:

  • 标志/企鹅测试在我的 4.1 设备上失败,它肯定有表情符号:(
【解决方案2】:

基于 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
}

当您点击详细信息时,您可以获得here 的表情符号代理。

【讨论】:

  • 我还没有机会对此进行测试,但是在答案中获得一些实际代码绝对是对链接的改进。
【解决方案3】:

另一种选择可能是包含 Android“Emoji Compatibility”库,该库将检测任何必需的 Emoji 字符并将其添加到在 Android 4.4 (API 19) 及更高版本上运行的应用程序中:https://developer.android.com/topic/libraries/support-library/preview/emoji-compat.html

【讨论】:

  • 谢谢你,但是那个库处理起来并不有趣。您必须对库进行特殊的及时初始化,更不用说其他问题了
【解决方案4】:
        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 在这里how can I check if my device is capable to render Emoji images correctly?回答了第二部分

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 2013-08-10
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2017-12-10
    相关资源
    最近更新 更多