android 表情emoil转化

sogo 输入法等输入表情,在程序中如何转化为可上传为服务器的字符串,以及从服务器取下字符串如何转化成表情显示


因为emoji是有表情分组的,所以你要优先考虑解析出来的也是分好组的。

HashMap<String, ArrayList<String>> emoMap = new HashMap<String, ArrayList<String>>();

我是这么来分组的。

解析xml,然后把2600这样的字符串转换成unicode。这个很关键,映射对应不上肯定也解析不出来。要注意的一点是有的emoji是两个unicode组成的  U+1F1F0 U+1F1F7  这样。。所以么。又多了一个环节。

HashMap<List<Integer>, String> convertMap = new HashMap<List<Integer>, String>();

再定义一个map来存unicode和string字符的映射。


解析emoji.xml文件,获取表情分组

public void readMap(Context mContext) {
        if (convertMap == null || convertMap.size() == 0) {
            convertMap = new HashMap<List<Integer>, String>();
            XmlPullParser xmlpull = null;
            String fromAttr = null;
            String key = null;
            ArrayList<String> emos = null;
            try {
                XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
                xmlpull = xppf.newPullParser();
                InputStream stream = mContext.getAssets().open("emoji.xml");
                xmlpull.setInput(stream, "UTF-8");
                int eventCode = xmlpull.getEventType();
                while (eventCode != XmlPullParser.END_DOCUMENT) {
                    switch (eventCode) {
                        case XmlPullParser.START_DOCUMENT: {
                            break;
                        }
                        case XmlPullParser.START_TAG: {
                            if (xmlpull.getName().equals("key")) {
                                emos = new ArrayList<String>();
                                key = xmlpull.nextText();
                            }
                            if (xmlpull.getName().equals("e")) {
                                fromAttr = xmlpull.nextText();
                                emos.add(fromAttr);
                                List<Integer> fromCodePoints = new ArrayList<Integer>();
                                if (fromAttr.length() > 6) {
                                    String[] froms = fromAttr.split("\\_");
                                    for (String part : froms) {
                                        fromCodePoints.add(Integer.parseInt(part, 16));
                                    }
                                } else {
                                    fromCodePoints.add(Integer.parseInt(fromAttr, 16));
                                }
                                convertMap.put(fromCodePoints, fromAttr);
                            }
                            break;
                        }
                        case XmlPullParser.END_TAG: {
                            if (xmlpull.getName().equals("dict")) {
                                emoMap.put(key, emos);
                            }
                            break;
                        }
                        case XmlPullParser.END_DOCUMENT: {
                            Log.d("", "parse emoji complete");
                            break;
                        }
                    }
                    eventCode = xmlpull.next();
                }
            } catch (Exception e) {
                Log.e(TAG, e.toString(), e);
            }
        }
    }



输入内容解析为 字符串,即可上传至服务器

public String parseEmoji(String input) {
        if (input == null || input.length() <= 0) {
            return "";
        }
        StringBuilder result = new StringBuilder();
        int[] codePoints = toCodePointArray(input);
        List<Integer> key = null;
        for (int i = 0; i < codePoints.length; i++) {
            key = new ArrayList<Integer>();
            if (i + 1 < codePoints.length) {
                key.add(codePoints[i]);
                key.add(codePoints[i + 1]);
                if (convertMap.containsKey(key)) {
                    String value = convertMap.get(key);
                    if (value != null) {
                        result.append("[e]" + value + "[/e]");
                    }
                    i++;
                    continue;
                }
            }
            key.clear();
            key.add(codePoints[i]);
            if (convertMap.containsKey(key)) {
                String value = convertMap.get(key);
                if (value != null) {
                    result.append("[e]" + value + "[/e]");
                }
                continue;
            }
            result.append(Character.toChars(codePoints[i]));
        }
        return result.toString();
    }



服务器获取的表情字符串 需要转化成图片表情 ,根据表情id 找到对应图片

/**
     * 对spanableString进行正则判断,如果符合要求,则以表情图片代替
     */
    public static void dealExpression(Context context, SpannableString spannableString, Pattern patten, int start)
            throws Exception {
        Matcher matcher = patten.matcher(spannableString);
        while (matcher.find()) {
            String key = matcher.group();
            Log.d("Key", key);
            if (matcher.start() < start) {
                continue;
            }
            Field field = R.drawable.class.getDeclaredField("emoji_"
                    + key.substring(key.indexOf("]") + 1, key.lastIndexOf("[")));
            int resId = Integer.parseInt(field.get(null).toString());
            if (resId != 0) {
                Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);
                ImageSpan imageSpan = new ImageSpan(bitmap);
                int end = matcher.start() + key.length();
                spannableString.setSpan(imageSpan, matcher.start(), end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                if (end < spannableString.length()) {
                    dealExpression(context, spannableString, patten, end);
                }
                break;
            }
        }
    }



你可能感兴趣的:(android 表情emoil转化)