偶然在一个需求中需要解析qq聊天记录表情,表情的格式是以/开始,比如:你好啊?/微笑,在网上找了半天,也没能找到一个比较合适的,所以准备自己实现一下,首先要将表情图片和表情字符对上号,我想了几种解决方案:

最后用了这种,操了qq的安装包,会发现,表情分为三种,一种是f_static_093.png,还有emoji_058.png,还有f022.gif,gif不知道怎么能显示好,emoji表情用的人不多,至少我很少用。所以就从f_static_106.png入手,一共107个表情都是以f_static_开始+数字.png ,然后用最笨的方法,找到表情对应的字符串,生成了一个faces.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="qqFaces"><item>呲牙</item><item>调皮</item><item>冷汗</item><item>偷笑</item><item>再见</item><item>敲打</item><item>擦汗</item><item>猪头</item><item>玫瑰</item><item>流泪</item><item>大哭</item><item>嘘...</item><item>酷</item><item>抓狂</item><item>委屈</item><item>便便</item><item>炸弹</item><item>菜刀</item><item>可爱</item><item>色</item><item>害羞</item><item>得意</item><item>吐</item><item>微笑</item><item>发怒</item><item>尴尬</item><item>惊恐</item><item>冷汗</item>
........

下面的工作就是解析出聊天记录中的表情,然后用图片替换字符串,找了几个大神的类似的demo里面都是用正则法则,但是我想换一个思路,所以就用了分割字符串的方法,将字符串从/处分割为一个数组,然后将前2,1,3个字符和表情的hashmap中比对,如果找到了表情,那么就将这表情用图片代替,其间没有什么难处,就是逻辑上有点饶,没有正则法则实现起来清爽,有一个注意点就是,根据拼接的图片名称找图片ID,代码如下,关键地方的注释已经加好:

public class FaceUtil {HashMap<String, Integer> mFaceHash;private Context context;public FaceUtil(Context context) {this.context = context;mFaceHash = new HashMap<String, Integer>();String faceStr[] = context.getResources().getStringArray(R.array.qqFaces);for (int i = 0; i < faceStr.length; i++) {mFaceHash.put(faceStr[i], i);}}/*** 得到一个SpanableString对象,通过传入的字符串,并进行正则判断* * @param context* @param str* @return*/public SpannableString getExpressionString(String str) {SpannableString spannableString = new SpannableString(str);String record[] = str.split("/");String msgStr = record[0]; // 计算长度的拼接字符串if (record.length > 1)for (int i = 1; i < record.length; i++) {String content = record[i].trim();int imgIndex = -1;int partLength = -1; // 计算每次表情的长度是1.2.3if (!content.equals("")) {try {imgIndex = mFaceHash.get(content.subSequence(0, 2));} catch (Exception e) {}if (imgIndex < 0) {try {imgIndex = mFaceHash.get(content.subSequence(0, 1));} catch (Exception e) {}if (imgIndex < 0) {try {imgIndex = mFaceHash.get(content.subSequence(0,3));} catch (Exception e) {}} else {partLength = 2;// 1/}} else {partLength = 3;// 2个/}}if (imgIndex >= 0) {try {int resID = context.getResources().getIdentifier("f_static_" + imgIndex, "drawable","com.james.qqchatrecord");Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resID);bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true);// 通过图片资源id来得到bitmap,用一个ImageSpan来包装@SuppressWarnings("deprecation")ImageSpan imageSpan = new ImageSpan(bitmap);if (partLength == -1) {partLength = 4;// 如果imgIndex不是-1,那就是有图片的,如果paetLength=-1,那么就能确认是3个长度的字符串}spannableString.setSpan(imageSpan, msgStr.length(),msgStr.length() + partLength,Spannable.SPAN_INCLUSIVE_EXCLUSIVE);} catch (Exception e) {e.printStackTrace();}}msgStr = msgStr + record[i] + "/";// spannableString的长度不会变,也就是说不是在字符串的基础上修改,而是有备份,那样的话就要把/长度算上}return spannableString;}
}

用的地方之间 peopleBcontent.setText( mFaceUtil .getExpressionString(itemData .getContent().trim()));就ok,

效果如下

转载于:https://www.cnblogs.com/fuhaots2009/p/3453882.html

Android解析qq聊天记录表情相关推荐

  1. Android仿qq聊天记录长按删除功能效果

    最近项目在做IM即时通讯开发,在删除聊天列表的时候跟删除聊天详细信息的时候,产品经理想要跟ios一样,在当前选中行上方弹出一个删除窗口.于是先从网上找demo,找了一个发现是Dialog做的,我感觉没 ...

  2. QQ 聊天记录简单数据分析

    手机里的聊天记录一直没删,有的群的消息已经几万条了,所以做一下简单的数据分析. 提取数据 Android 的 QQ 聊天记录比较容易导出,这里说一下 iOS 未越狱的,将 iOS 用 iTunes 备 ...

  3. 安卓开发-最简单快速的仿微信聊天实现-附赠微信原生表情,QQ原生表情

    前言:正常实现聊天功能想必大家都使用三方的Sdk比如环信融云集成的,但是聊天记录的保存只能有三天,想增加保存时长就需要花钱,so 我只好自己想办法实现了,这个demo是类似于留言板,并非即时通讯!只实 ...

  4. 如何保存QQ聊天记录

    1.直接保存文件夹(推荐)找到你的QQ安装目录,这个应该都没啥问题吧,然后可以看到在目录里有一个以你的QQ号命名的文件夹,对,就是它.在你想重装系统或重安装别的版本QQ前,把这个文件夹复制到一个安全的 ...

  5. android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...

    ####问题描述 * java 解析多层含有泛型对象的json数据获取不到泛型类型 * 如果将泛型改成实际的类型就能正常解析 * 如果不改成实际的类型泛型数据被解析成com.google.gson.i ...

  6. Mac QQ聊天记录迁移方法(Mac to Mac)

    因为QQ里面工作聊天记录很多,换电脑的时候想一并迁移过去,结果照网上的方法怎么试都不成功,后来自己瞎整给整成功了.看到V站上面40多天前还有人问这个问题,于是分享一下. 以下如实记录我自己的操作流程, ...

  7. pyecharts qq聊天记录数据可视化

    数据说明 1.本次数据来源于qq群聊天记录 2.一共3123条数据,可以直接用qq导出聊天记录 3.使用到的库有pyecharts jieba 发言排行 index_id name count 1 闰 ...

  8. IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换

    该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 通过该课程可以学习到以下知识点 1.了解和开发后台项目(这个是需要长期积累的,有了这个可以说入门没问题) 2.学习到I ...

  9. IM即时通讯项目讲解(一) 实现类似qq微信表情面板无缝切换

    IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换 标签(空格分隔): 开源项目 ###该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 #####通过该课 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 c++_ch02_02
  2. spring4声明式事务--01注解方式
  3. 在ISA 2006标准版上定制带宽和限制流量(测试)
  4. 百度语音识别rest html,delphi调用百度语音识别REST API(示例代码)
  5. LeetCode Algorithm 572. 另一棵树的子树
  6. 《设计模式之禅》--摘要
  7. 【Hadoop】Hadoop SocketChannelImpl UnresolvedAddressException
  8. php.js 文件下载,使用JavaScript开始下载文件
  9. Excel弱爆了!这个工具30分钟完成了我一天的工作量,零基础也能学!
  10. 世界备份日——如果您丢失了所有文件
  11. 【版本控制】分布式的版本控制系统GitHub学习资源汇总
  12. pokemon go 和 虚拟gps
  13. 计算机考试相关证书 (一)
  14. 方舟原始恐惧mod生物代码_《暗黑地牢》《方块方舟》周末免费试玩,多款游戏历史新低特惠...
  15. mysql在子查询中使用自定义变量和条件语句实现函数效果的查询语句
  16. D. Pythagorean Triples(1487D)(打表找规律 + 二分)
  17. VC6.0修改工程名字方法
  18. [NOIP2016PJ]魔法阵
  19. ModuleNotFoundError: No module named ‘torchvision.ops‘
  20. 网络:万维网(WWW)

热门文章

  1. 人生成功的六匹马(转自喷嚏网的一篇品书)
  2. 不规则图形数格子的方法_方格图中不规则图形的面积计算
  3. 《不看后悔》超赞 来一份常见 JVM 面试题+“答案”
  4. MATLAB位置1无法索引,位置 1 的索引超出数组范围(不能超过 1)
  5. 官方mysql的最新版下载网址
  6. c语言中U16和S16的意义
  7. 京东热key探测框架本地压测数据记录,单机(8核)QPS约16万/s,可水平扩展
  8. 百度搜索限定时间_几个方法教你用好手中的搜索,提高搜索效率和质量
  9. c语言循环语句输出五角型图案,C语言 用循环和if语句编程并打印输出实心五角星图案...
  10. 我在江北学安全(五) 渗透测试资源总览 和 XSS扫描系统原理 (续)