由于使用融云集成聊天,一個端集成了IMKit,一個端只集成了IMLib,所以就造成IMLib的這一端不會自帶emoji及顯示。通過IMKit發(fā)送給IMLib端瑟蜈,顯示成了系統(tǒng)的自帶表情,而且與輸入法的表情也不一致渣窜,于是就想辦法把他們顯示一致铺根。
image.png
思路:
將IMKit中的emoji資源文件全部拷貝過來,然后通過匹配字符的方式用SpannableString替換為ImageSpan乔宿。
通過抓日志發(fā)現(xiàn)imkit發(fā)送過來的表情字符為:
content='??????????'
實(shí)際android studio日志中顯示為:
image.png
然后就想位迂,這不是就是6個字符嗎,一個個替換為ImageSpan即可详瑞。
但實(shí)際讀到的字符串長度卻是13掂林。
image.png
最終通過github搜索有沒有別人做過類似的項(xiàng)目。且看如下傳送鏈接:https://github.com/OneGreenHand/Emoji
關(guān)鍵代碼:
//text:原本字符串
public static CharSequence parse(String text, float textSize) {
if (text == null) {
return "";
}
final char[] chars = text.toCharArray();
final SpannableStringBuilder ssb = new SpannableStringBuilder(text);
int codePoint;
boolean isSurrogatePair;
for (int i = 0; i < chars.length; i++) {
if (Character.isHighSurrogate(chars[i])) {
continue;
} else if (Character.isLowSurrogate(chars[i])) {
if (i > 0 && Character.isSurrogatePair(chars[i - 1], chars[i])) {
codePoint = Character.toCodePoint(chars[i - 1], chars[i]);
isSurrogatePair = true;
} else {
continue;
}
} else {
codePoint = (int) chars[i];
isSurrogatePair = false;
}
if (emojiCodeList.contains(codePoint)) {
Bitmap bitmap = BitmapFactory.decodeResource(gContext.getResources(), getResourceByCode(codePoint));
BitmapDrawable bmpDrawable = new BitmapDrawable(gContext.getResources(), bitmap);
bmpDrawable.setBounds(0, 0, (int) textSize, (int) textSize);
CenterImageSpan imageSpan = new CenterImageSpan(bmpDrawable);
ssb.setSpan(imageSpan, isSurrogatePair ? i - 1 : i, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return ssb;
}
現(xiàn)在就可以跟輸入法一起正常顯示:
image.png