通过编码,我可以制作一个按钮将这三个表情符号插入到文本中:⚽️
然而,在许多手机上,当用户点击该按钮时,问题是⚽️显示为[X][X][X]。甚至更糟糕的是,它只显示三个空格。
我想要在Android设备上禁用和隐藏自己内置的表情符号键盘,因为一些设备无法正确显示表情符号。请问有人知道或者有什么提示可以在代码中检测设备是否支持表情符号?
我已经阅读过表情符号从android 4.1开始得到支持,但我没有这样的经验....
通过编码,我可以制作一个按钮将这三个表情符号插入到文本中:⚽️
然而,在许多手机上,当用户点击该按钮时,问题是⚽️显示为[X][X][X]。甚至更糟糕的是,它只显示三个空格。
我想要在Android设备上禁用和隐藏自己内置的表情符号键盘,因为一些设备无法正确显示表情符号。请问有人知道或者有什么提示可以在代码中检测设备是否支持表情符号?
我已经阅读过表情符号从android 4.1开始得到支持,但我没有这样的经验....
我刚刚自己解决了这个问题。 Android的好处是它是开源的,所以当你遇到这样的问题时,你有很大的机会找到一个可行的方法来帮助你。
在Android开源项目中,你可以找到一个方法,他们使用Paint.hasGlyph
来检测是否存在给定表情符号的字体。然而,由于此方法在API 23之前不可用,他们还进行测试渲染,并将结果与“tofu”(您在帖子中提到的[x]字符)的宽度进行比较。
这种方法还存在一些缺陷,但足以让你入门。
谷歌源代码:
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
}
您可以在此处点击“详情”以获取表情符号的替代品。
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图像?