Android解析qq聊天记录表情
偶然在一个需求中需要解析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.3
if (!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,
效果如下
Android解析qq聊天记录表情的更多相关文章
- Android仿qq聊天记录长按删除功能效果
最近项目在做IM即时通讯开发,在删除聊天列表的时候跟删除聊天详细信息的时候,产品经理想要跟ios一样,在当前选中行上方弹出一个删除窗口.于是先从网上找demo,找了一个发现是Dialog做的,我感觉没 ...
- Android手机QQ文件夹解析
注:切勿修改手机QQ文件夹,以免造成不必要的使用问题及无法修复的数据丢失] 安卓手机QQ tencent文件夹解析 QQ下载的聊天背景:tencent→MobileQQ→system_backgrou ...
- 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践
本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...
- 测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现
以下内容首发于微信公众号[ITester软件测试小栈]: 测试面试题集-2.测试用例设计 大家好 我是coco小锦鲤 上周五给大家分享了测试基础理论题 这个周五给大家分享测试用例设计题 测试用例的考察 ...
- 重装系统后QQ聊天记录恢复方法
重装系统后QQ聊天记录恢复方法 近日又一次安装了系统,又一次安装了腾讯的.TM,TM也是安装在之前的文件夹底下,可是聊天记录和之前的自己定义表情都不见了,看来没有自己主动恢复回来. 我这里另一个特殊的 ...
- Android 实现QQ第三方登录
Android 实现QQ第三方登录 在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了. 首先肯定是去下载SDK和DEMO http://wi ...
- 文本分析实例---QQ聊天记录分析
对QQ聊天记录进行分析,由于每天产生的聊天记录比較多,所以选取的是从2月份整月的聊天记录数据.分析要产生的结果有三个,聊天记录中发消息的人前top15.统计24小时时间段那个时间段发贴人最多,还有对消 ...
- QQ聊天记录分析
今天我们用R语言来处理一下.我们会用到一下技术:. (1)正则表达式 (2)词频统计 (3)文本可视化 (4)ggplot2绘图 (5)中文分词 一.数据处理 首先我们要讲QQ聊天记录导出成txt文件 ...
- 如何找回QQ聊天记录、语音、图片?
多图长图预警,本教程适用于 安卓手机 认真仔细看完答案的成功几率翻倍哟! 请各位认真看答案!求您了~ 2020年/4/4日 更新 人民不会忘记,祖国不会忘记,我们不会忘记,先烈不朽. 调整答案顺序,使 ...
随机推荐
- 解决 nginx 返回数据不完整的方法
通过PHP请求接口时发现接口的内容输出没有完整的返回整个数据,早上只修改了nginx api_metrics插件里的计算response大小的代码,观察日志发现一条: 2012/08/28 02:13 ...
- php版网易视频云api
最近在做在线教育课程,使用网易云视频作为在线视频直播. 网易官方只有java示例,我们使用php,就自己写个api. 当然实现也是很简单的. 演示:http://www.deitui.com/inde ...
- Codeforces Round #336 (Div. 2) D. Zuma
Codeforces Round #336 (Div. 2) D. Zuma 题意:输入一个字符串:每次消去一个回文串,问最少消去的次数为多少? 思路:一般对于可以从中间操作的,一般看成是从头开始(因 ...
- 如何得到django中form表单里的复选框(多选框)的值( MultipleChoiceField )
直接写代码吧 CHECKBOX_CHOICES = ( ('Value1','Value1'), ('Value2','Value2'), ) class EditProfileForm(ModelF ...
- iBatis入手案例
第一部分,iBatis组织架构分析 1.1 组织架构图 1.2 架构分析 DAO层上面,DAO类通过SqlMapConfig文件,来构建iBatis提供的SqlMapClient,SqlMapConf ...
- html 5 中的 6位 十六进制颜色码 代表的意思
人的眼睛看到的颜色有两种: ⒈ 一种是发光体发出的颜色,比如计算机显示器屏幕显示的颜色: ⒉ 另一种是物体本身不发光,而是反射的光产生 十六进制颜色码 的颜色,比如看报纸和杂志上的颜色. 我们又知道任 ...
- ThinkPHP学习手记——环境搭建
怀着激动的心情打开了thinkPHP的文档,开启了第一次php框架学习. 下载 ThinkPHP最新版本可以在官方网站(http://thinkphp.cn/down/framework.html) ...
- HTML5之本地文件系统API - File System API
HTML5之本地文件系统API - File System API 新的HTML5标准给我们带来了大量的新特性和惊喜,例如,画图的画布Canvas,多媒体的audio和video等等.除了上面我们提到 ...
- [BZOJ 2721] [Violet 5] 樱花 【线性筛】
题目链接:BZOJ - 2721 题目分析 题目大意:求出 1 / x + 1 / y = 1 / n! 的正整数解 (x, y) 的个数. 显然,要求出正整数解 (x, y) 的个数,只要求出使 y ...
- Python3整理文件
晚上打算把播放器下载下来的音乐拷贝到mp3里边,但是它是如下形式存放的,相当头痛…… 作为程序员,想到使用python来遍历这个目录,并将有大于限制的音乐文件拷贝到指定目录,相关实现代码如下: # a ...