如何检查我的设备是否能够正确渲染Emoji图片?

3
我正在使用View中的Emoji unicode。在大多数设备上,图像看起来都很好,但是在我的一款低端设备(安卓2.3)上,它们被渲染成小方块。
我能检查设备是否支持Emoji吗?这样我就可以发布我的apk,而不会在某些设备上显示那些难看的方块。 enter image description here

1
我面临两个问题:第一,我们尚未找到免费的表情符号资源(但我们正在努力)。第二,出于其他原因,我们仍然希望进行此检查(如果可能的话)。谢谢。 - suitianshi
我不知道如何确定字形是否正确显示或显示为方块,对于Android也是一样的!返回中没有错误代码。因此,真正使用支持表情符号的免费字体(有很多)。您甚至可以考虑从另一个(工作)设备中取出字体并使用该字体。 - Phantômaxx
你说得没错,但出于商业原因我们必须确保使用表情符号是被其许可的。请参考https://dev59.com/Zmgv5IYBdhLWcg3wHdN_#16696512。 - suitianshi
好的,你说你有一些设备(可能是4.x版本),在这些设备上应用程序运行良好。从该设备中取出系统字体,并将其用作应用程序的自定义字体...(您需要对“捐赠者”设备进行root)。如果它是系统字体,在Android中,一切都是开源/免费的。这就是Google的力量! - Phantômaxx
作为最后的资源,您可以使用一些SVG图形(与TTF字体一样是矢量的)- 您将需要一个免费的第三方库。但是然后你必须将它保存为PNG(如果不存在),保存到SD卡中,并将其插入文本中作为<img src='...' />,并使用HTML.fromHTML。这相当于杀鸡焉用牛刀。 - Phantômaxx
显示剩余4条评论
3个回答

6
这是一个晚回答,但我最近遇到了类似的问题。我需要过滤一个 List<String> 并过滤掉设备无法呈现的表情符号(即,如果设备旧且不支持呈现它们)。
我最终使用 Paint 来测量文本宽度。
Paint mPaint = new Paint();
private boolean emojiRenderable(String emoji) {
    float width = mPaint.measureText(emoji);
    if (width > 7) return true;
    return false;
}
width > 7 的部分特别不规范,我原本期望非渲染表情符号的值为 0.0,但在几个设备上,我发现这个值实际上在非渲染表情符号中的范围约为 3.06.0,而在渲染表情符号中的范围为 12.015.0。您的结果可能会有所不同,因此您可能需要进行测试。我认为字体大小也会影响measureText()的输出结果,所以要记住这一点。

总的来说,我不确定这是否是一个很好的解决方案,但这是我目前想出的最好的方案。


2
这是一个很好的解决方案,因为没有其他两种方法适用:无论是flag/penguin还是getPixels比较都无法在SDK10上成功。 - djdance

1

0

https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java#441

受到上述文件中发现的两种方法的启发。

   public static boolean canShowEmoji(String emoji) {
    Paint paint = new Paint();
    float tofuWidth = paint.measureText("\uFFFE");
    float standardWidth = paint.measureText("\uD83D\uDC27");

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return paint.hasGlyph(emoji);
    } else {
        float emojiWidth = paint.measureText(emoji);
        return emojiWidth > tofuWidth && emojiWidth < standardWidth * 1.25;
        // This assumes that a valid glyph for the cheese wedge must be greater than the width
        // of the noncharacter.
    }
}

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