Android环信爬坑指北(三)与IOS表情库的统一

  不得不说 EaseUI 的 Android 表情包与 IOS 比起来是真的丑,就好像 IOS 已经在玩ps4的游戏了,Android 还在玩小霸王游戏机那种感觉。除了图片比较丑之外,Android 与 IOS 表情也并没有相对应,你可能会说,本来就不一样还怎么对应 W( ̄_ ̄)W。其实我想说,当你把表情按照一定规律都替换掉之后,会发现……还是有几个表情对不上,哈哈哈哈,下面我们就来详细分析一波。

1、icons 和 emojis

  当程序接受到表情消息时,通过在接受消息处 onCmdMessageReceived 打印日志或者打断点,可以发现收到的其实是一个表情符号。在Android中是通过表情符号对应相应的表情图片来进行显示的,而在IOS上只有一组表情符号,没有图片相对应,就是说IOS可以直接把这些特殊的符号显示成表情(大概经过了某些骚操作)。

  追踪这些符号,可以发现这些表情符号、表情图片的数组 iconsemojis 是被封装在了 EaseUIEaseDefaultEmojiconDatas 类中。

2、替换表情

  找到表情所在的位置之后,开始替换表情。首先看一下IOS的表情库(实际上有两页):

这里先说一句抱歉,因为我找了半天表情图,最终还是有几个表情与 IOS 不一样。所以先让 IOS 的同学把不一样的表情注释掉。

这些就是共同的表情库了,先导入项目中。这里发一下表情资源地址:github

3、找规律(可跳过)

  先通过 IOS 向 Android 设备发送第一行表情


对比一下 EaseSmileUtils 中的表情符号:

public class EaseSmileUtils {
    public static final String DELETE_KEY = "em_delete_delete_expression";
    
	public static final String ee_1 = "[):]";
	public static final String ee_2 = "[:D]";
	public static final String ee_3 = "[;)]";
	public static final String ee_4 = "[:-o]";
	public static final String ee_5 = "[:p]";
	public static final String ee_6 = "[(H)]";
	public static final String ee_7 = "[:@]";
        public static final String ee_8 = "[:s]";
        public static final String ee_9 = "[:$]";
	public static final String ee_10 = "[:(]";
	……
}
复制代码

我们可以发现 IOS 发过来的表情符号分别对应 ee-1ee-4ee-7ee-10,中间都隔了两个。为什么会隔两个呢?再看一眼 IOS 表情库一共是有3行,会不会是跳过了下面的两行呢? 我们再通过 IOS 设备发送第1列表情。

可以看出对 Android 来说,IOS 真的是按照竖着的顺序排列表情的。如果我们按照这个顺序在 Icons 数组中添加图片的话,还需要删除一个符号 ee_17 = "[<o)]",然后重新排一下序号。 这样 IOS 和 Android 的表情就可以一一对应上,但是表情库一个是横着排,一个是竖着排,所以下面是最终方案。

4、最终方案

  为了统一表情库的排列顺序,需要更改 EaseSmileUtils 数组中表情符号与 IOS 排列顺序一致,然后图片与符号相对应即可。

public class EaseSmileUtils {
    public static final String DELETE_KEY = "em_delete_delete_expression";
    
        public static final String ee_1 = "[):]";
	public static final String ee_2 = "[:-o]";
	public static final String ee_3 = "[:@]";
	public static final String ee_4 = "[:(]";
	public static final String ee_5 = "[(a)]";
	public static final String ee_6 = "[+o(]";
	public static final String ee_7 = "[:-#]";
	public static final String ee_8 = "[:D]";
	public static final String ee_9 = "[:p]";
	public static final String ee_10 = "[:s]";
	public static final String ee_11 = "[:'(]";
	public static final String ee_12 = "[8o|]";
	public static final String ee_13 = "[|-)]";
	public static final String ee_14 = "[^o)]";
	public static final String ee_15 = "[;)]";
	public static final String ee_16 = "[(H)]";
	public static final String ee_17 = "[:$]";
	public static final String ee_18 = "[:|]";
	public static final String ee_19 = "[8-|]";
	public static final String ee_20 = "[*-)]";
	……
	
}
复制代码
private static int[] icons = new int[]{
            R.drawable.emoji_1,  
            R.drawable.emoji_2,  
            R.drawable.emoji_3,  
            R.drawable.emoji_4,
            R.drawable.emoji_5,
            R.drawable.emoji_6,
            R.drawable.emoji_7,
            R.drawable.emoji_8,
            R.drawable.emoji_9,
            R.drawable.emoji_10,
            R.drawable.emoji_11,
            R.drawable.emoji_12,
            R.drawable.emoji_13,
            R.drawable.emoji_14,
            R.drawable.emoji_15,
            R.drawable.emoji_16,
            R.drawable.emoji_17,
            R.drawable.emoji_18,
            R.drawable.emoji_19,
            R.drawable.emoji_20,
            <!--……-->
复制代码
该模块用于emoji编码转换,不过略有缺陷,参考其结构进行改造,精简 emoji表情的编码androidios两种操作系统的使用的码元不一样,本模块实现同时兼容两种系统的emoji编码 原理: VX客户Duan使用的是unicode编码(utf-16le),检测出emoji表情字符或易不能显示的字符,对其使用UCS-4进行编码(使用易自带的编码转换) 示例: 原始文本: android数据:{ 4, 226, 100, 0, 97, 0, 42, 227, 118, 86, 62, 216, 129, 221, 82, 224, 98, 86, 98, 86, 80, 224, 60, 216, 8, 223, 62, 216, 37, 221, 53, 0, 53, 0, 52, 0, 62, 216, 32, 221, 87, 93, 244, 78, 51, 109, 40, 98, 62, 216, 36, 221, 53, 0, 54, 0, 106, 0, 104, 0, 102, 0, 70, 226, 106, 0, 104, 0, 102, 0, 100, 0, 75, 226, 60, 216, 245, 221, 60, 216, 249, 221, 17, 229, 168, 88, 92, 149, 60, 216, 248, 221, 60, 216, 236, 221, 60, 216, 225, 223, 253, 78, 80, 91, 177, 148, 60, 216, 220, 223, 201, 98, 201, 98, 228, 136, 49, 0, 50, 0, 51, 0 } android编码后:  [u+E204]da[u+E32A]噶[u+1F981][u+E052]噢噢[u+E050][u+1F308][u+1F925]554[u+1F920]嵗仴洳戨[u+1F924]56jhf[u+E246]jhfd[u+E24B][u+1F1F5][u+1F1F9][u+E511]墨镜[u+1F1F8][u+1F1EC][u+1F3E1]份子钱[u+1F3DC]拉拉裤123 ios数据:{ 61, 216, 159, 220, 100, 0, 97, 0, 61, 216, 153, 220, 118, 86, 62, 216, 129, 221, 61, 216, 54, 220, 98, 86, 98, 86, 61, 216, 47, 220, 60, 216, 8, 223, 62, 216, 37, 221, 53, 0, 53, 0, 52, 0, 62, 216, 32, 221, 87, 93, 244, 78, 51, 109, 40, 98, 62, 216, 36, 221, 53, 0, 54, 0, 106, 0, 104, 0, 102, 0, 79, 38, 106, 0, 104, 0, 102, 0, 100, 0, 206, 38, 60, 216, 245, 221, 60, 216, 249, 221, 60, 216, 234, 221, 60, 216, 248, 221, 168, 88, 92, 149, 60, 216, 248, 221, 60, 216, 236, 221, 60, 216, 225, 223, 253, 78, 80, 91, 177, 148, 60, 216, 220, 223, 201, 98, 201, 98, 228, 136, 49, 0, 50, 0, 51, 0 } ios编码后:[u+1F49F]da[u+1F499]噶[u+1F981][u+1F436]噢噢[u+1F42F][u+1F308][u+1F925]554[u+1F920]嵗仴洳戨[u+1F924]56jhf[u+264F]jhfd[u+26CE][u+1F1F5][u+1F1F9][u+1F1EA][u+1F1F8]墨镜[u+1F1F8][u+1F1EC][u+1F3E1]份子钱[u+1F3DC]拉拉裤123
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值