如何检查我的设备是否能够正确渲染表情符号图像?

时间:2014-08-12 09:53:47

标签: android emoji

我在视图中使用表情符号unicode。在大多数设备上,图像显示正常,但在我的一个低端设备(android 2.3)上,它们呈现为小方块。

我可以检查设备是否支持表情符号吗?这样我就可以发布我的apk而不会在某些设备上显示丑陋的方块。

enter image description here

3 个答案:

答案 0 :(得分:3)

这是一个迟到的答案,但我最近遇到了类似的问题。我需要过滤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部分特别hacky,我希望不可渲染表情符号的值为0.0,但在一些设备中,我发现该值实际上在{{1}左右} 3.0表示不可渲染,6.0表示12.0表示可渲染。您的结果可能会有所不同,因此您可能需要测试一下。我相信字体大小也会对15.0的输出产生影响,所以请记住这一点。

总的来说,我不确定这是否是一个很好的解决方案,但它是迄今为止我提出的最好的解决方案。

答案 1 :(得分:1)

请检查Googles Mozc项目的源代码。 EmojiRenderableChecker类似乎运行得很好! https://github.com/google/mozc/blob/master/src/android/src/com/google/android/inputmethod/japanese/emoji/EmojiRenderableChecker.java

它就像Paint.hasGlypgh的一个compat版本(在Marshmallow中添加)。 https://developer.android.com/reference/android/graphics/Paint.html#hasGlyph(java.lang.String)

答案 2 :(得分: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.
    }
}