Android解析qq聊天记录表情

原创 2013年12月02日 09:53:31

偶然在一个需求中需要解析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聊天记录待定与删除功能效果

模仿手机qq,历史聊天记录长按会弹出待定和删除按钮的效果。 qq效果图  代码实现的效果图  首先,看到这个效果,想一下实现的思路:弹出的待办和删除按钮,是通过dialog实现的。那么这个dialog...

Android仿qq聊天记录待定与删除功能效果

模仿手机qq,历史聊天记录长按会弹出待定和删除按钮的效果。 qq效果图  代码实现的效果图   首先,看到这个效果,想一下实现的思路:弹出的待办和删除按钮,是通过dialog实现的。...
  • jdsjlzx
  • jdsjlzx
  • 2015年01月06日 17:46
  • 7594

【东安手机qq聊天记录查看器2013V1.1】

东安手机qq聊天记录查看器 2013V1.1 [轻松查看手机里QQ聊天记录] 授权方式:免费软件 界面语言:简体中文 软件大小:504KB 所属专题:网络聊天 ...

恢复格式化硬盘数据之前的QQ聊天记录

在着两天,遇到恢复数据的需求。 事情的背景是: 硬盘之前被我重新分表格式化,而我需要将装在原先硬盘的QQ聊天记录恢复 操作步骤: 1,在得知你需要恢复硬盘数据时请不要再操作该硬盘,也就是说不能写入...

恐怖QQ聊天记录

光头和尚:你好呀! ­ 灵尚女人:你好。 ­­ 光头和尚:可以聊聊吗? ­ 灵尚女人:可以。 ­ ­光头和尚:你是女人吗? ­ 灵尚女人:是的。 ­ ­光头和尚:可以问一下你多大了吗? ­...

把QQ聊天记录插入数据库中

最近在做毕设,其中一个环节是分析qq聊天记录,在分析之前需要先把qq聊天记录导出,然后存入数据库中,qq聊天记录导出后是文本文档,导出方式: 1.登录qq后,点击任意一个好友,查看与他的聊天记录,点...

简单的文本挖掘-用于QQ聊天记录(R)

平时的交流很多都在QQ上,QQ交流已经离不开日常的生活,这里我用R来分析QQ聊天记录,看看平时都聊了什么。 首先介绍下用的文本挖掘的包:Rwordseg  一个 R 环境下的中文分词工具,使用 rJa...

云盘同步本地文件和QQ聊天记录

一、腾讯微云同步QQ聊天记录和QQ接受的文件1. 下载QQ,开始安装QQ时,点击自定义安装选项,如下图 以上是QQ安装的默认形式,为了以后安全的考虑,我们将QQ软件安装目录定义为D:\CMWang\...

重装系统后QQ聊天记录导入

好久没重装系统了,系统运行变得缓慢。所以今天一早就起床重装系统,但是我最不喜欢的是重装后是我软件回不到以前的设置,幸好google  chrome可以通过google账号进行同步,这很简单就可以让我找...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android解析qq聊天记录表情
举报原因:
原因补充:

(最多只允许输入30个字)