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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.  
  4. <string-array name="qqFaces">
  5. <item>呲牙</item>
  6. <item>调皮</item>
  7. <item>冷汗</item>
  8. <item>偷笑</item>
  9. <item>再见</item>
  10. <item>敲打</item>
  11. <item>擦汗</item>
  12. <item>猪头</item>
  13. <item>玫瑰</item>
  14. <item>流泪</item>
  15. <item>大哭</item>
  16. <item>嘘...</item>
  17. <item></item>
  18. <item>抓狂</item>
  19. <item>委屈</item>
  20. <item>便便</item>
  21. <item>炸弹</item>
  22. <item>菜刀</item>
  23. <item>可爱</item>
  24. <item></item>
  25. <item>害羞</item>
  26. <item>得意</item>
  27. <item></item>
  28. <item>微笑</item>
  29. <item>发怒</item>
  30. <item>尴尬</item>
  31. <item>惊恐</item>
  32. <item>冷汗</item>
  1. ........

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

  1. public class FaceUtil {
  2.  
  3. HashMap<String, Integer> mFaceHash;
  4. private Context context;
  5.  
  6. public FaceUtil(Context context) {
  7. this.context = context;
  8. mFaceHash = new HashMap<String, Integer>();
  9. String faceStr[] = context.getResources().getStringArray(
  10. R.array.qqFaces);
  11. for (int i = 0; i < faceStr.length; i++) {
  12. mFaceHash.put(faceStr[i], i);
  13. }
  14. }
  15.  
  16. /**
  17. * 得到一个SpanableString对象,通过传入的字符串,并进行正则判断
  18. *
  19. * @param context
  20. * @param str
  21. * @return
  22. */
  23. public SpannableString getExpressionString(String str) {
  24. SpannableString spannableString = new SpannableString(str);
  25. String record[] = str.split("/");
  26. String msgStr = record[0]; // 计算长度的拼接字符串
  27. if (record.length > 1)
  28. for (int i = 1; i < record.length; i++) {
  29. String content = record[i].trim();
  30. int imgIndex = -1;
  31. int partLength = -1; // 计算每次表情的长度是1.2.3
  32. if (!content.equals("")) {
  33. try {
  34. imgIndex = mFaceHash.get(content.subSequence(0, 2));
  35. } catch (Exception e) {
  36. }
  37. if (imgIndex < 0) {
  38. try {
  39. imgIndex = mFaceHash.get(content.subSequence(0, 1));
  40. } catch (Exception e) {
  41. }
  42. if (imgIndex < 0) {
  43. try {
  44. imgIndex = mFaceHash.get(content.subSequence(0,
  45. 3));
  46. } catch (Exception e) {
  47.  
  48. }
  49. } else {
  50. partLength = 2;// 1/
  51. }
  52. } else {
  53. partLength = 3;// 2个/
  54. }
  55. }
  56. if (imgIndex >= 0) {
  57. try {
  58. int resID = context.getResources().getIdentifier(
  59. "f_static_" + imgIndex, "drawable",
  60. "com.james.qqchatrecord");
  61. Bitmap bitmap = BitmapFactory.decodeResource(
  62. context.getResources(), resID);
  63. bitmap = Bitmap
  64. .createScaledBitmap(bitmap, 50, 50, true);
  65. // 通过图片资源id来得到bitmap,用一个ImageSpan来包装
  66. @SuppressWarnings("deprecation")
  67. ImageSpan imageSpan = new ImageSpan(bitmap);
  68. if (partLength == -1) {
  69. partLength = 4;// 如果imgIndex不是-1,那就是有图片的,如果paetLength=-1,那么就能确认是3个长度的字符串
  70. }
  71. spannableString.setSpan(imageSpan, msgStr.length(),
  72. msgStr.length() + partLength,
  73. Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
  74. } catch (Exception e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. msgStr = msgStr + record[i] + "/";// spannableString的长度不会变,也就是说不是在字符串的基础上修改,而是有备份,那样的话就要把/长度算上
  79. }
  80. return spannableString;
  81. }
  82. }

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

效果如下

Android解析qq聊天记录表情的更多相关文章

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

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

  2. Android手机QQ文件夹解析

    注:切勿修改手机QQ文件夹,以免造成不必要的使用问题及无法修复的数据丢失] 安卓手机QQ tencent文件夹解析 QQ下载的聊天背景:tencent→MobileQQ→system_backgrou ...

  3. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  4. 测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现

    以下内容首发于微信公众号[ITester软件测试小栈]: 测试面试题集-2.测试用例设计 大家好 我是coco小锦鲤 上周五给大家分享了测试基础理论题 这个周五给大家分享测试用例设计题 测试用例的考察 ...

  5. 重装系统后QQ聊天记录恢复方法

    重装系统后QQ聊天记录恢复方法 近日又一次安装了系统,又一次安装了腾讯的.TM,TM也是安装在之前的文件夹底下,可是聊天记录和之前的自己定义表情都不见了,看来没有自己主动恢复回来. 我这里另一个特殊的 ...

  6. Android 实现QQ第三方登录

    Android 实现QQ第三方登录 在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了. 首先肯定是去下载SDK和DEMO http://wi ...

  7. 文本分析实例---QQ聊天记录分析

    对QQ聊天记录进行分析,由于每天产生的聊天记录比較多,所以选取的是从2月份整月的聊天记录数据.分析要产生的结果有三个,聊天记录中发消息的人前top15.统计24小时时间段那个时间段发贴人最多,还有对消 ...

  8. QQ聊天记录分析

    今天我们用R语言来处理一下.我们会用到一下技术:. (1)正则表达式 (2)词频统计 (3)文本可视化 (4)ggplot2绘图 (5)中文分词 一.数据处理 首先我们要讲QQ聊天记录导出成txt文件 ...

  9. 如何找回QQ聊天记录、语音、图片?

    多图长图预警,本教程适用于 安卓手机 认真仔细看完答案的成功几率翻倍哟! 请各位认真看答案!求您了~ 2020年/4/4日 更新 人民不会忘记,祖国不会忘记,我们不会忘记,先烈不朽. 调整答案顺序,使 ...

随机推荐

  1. php练习6——面向对象编程(打印乘法表)

    要求:编写一个成员函数,从键盘输入一个数(0—9),打印出对应的乘法表 程序:viewChengFB.html chengFB.class.php printChengFB.php   结果  

  2. struts2整合jfreechart

    需要的包: struts2-jfreechart-plugin-2.2.1.1.jar jfreechart-1.0.13.jar jcommon-1.0.17.jar 前台jsp页面中可以使用ifr ...

  3. 面试题:实现LRUCache::Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  4. qt5 基础知识

    QWidget wQLineEdit edit; edit.show(); //如果没有这句,编辑框edit将会显示在父窗口的左上角edit.setParent(&w); //以w为父窗口并显 ...

  5. 基于jsp+servlet图书管理系统之后台用户信息查询操作

    上一篇的博客写的是插入操作,且附有源码和数据库,这篇博客写的是查询操作,附有从头至尾写的代码(详细的注释)和数据库! 此次查询操作的源码和数据库:http://download.csdn.net/de ...

  6. C++中二维数组的动态创建与处理

    C++中用new动态创建二维数组的格式一般是这样: TYPE (*p)[N] = new TYPE [][N]; 其中,TYPE是某种类型,N是二维数组的列数.采用这种格式,列数必须指出,而行数无需指 ...

  7. PHP的MVC框架 深入解析

    本篇先介绍一下php的MVC实现原理,我们框架的MVC部分也是基于此原理实现的,但是今天的代码并不是框架内的代码,仅仅为说明原理     一.文件结构 建立3个文件夹 controller文件夹存放控 ...

  8. Android开源项目发现---ListView篇(持续更新)

    资料转载地址:https://github.com/Trinea/android-open-project 1. android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下 ...

  9. InvalidIndexNameException[Invalid index name [2Shard], must be lowercase]

    [2016-10-11 14:16:42,191][DEBUG][action.admin.indices.create] [Feron] [2Shard] f ailed to create [2S ...

  10. Apache benchmark 压力测试工具

    ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求. 安装apa ...