Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blackberry 黑莓:聊天应用中的表情符号_Blackberry_Java Me_Chat_Emoticons - Fatal编程技术网

Blackberry 黑莓:聊天应用中的表情符号

Blackberry 黑莓:聊天应用中的表情符号,blackberry,java-me,chat,emoticons,Blackberry,Java Me,Chat,Emoticons,我想做一个聊天应用程序的表情是必要的。我试图编写自己的文本框来处理一些unicode字符,并用微笑和表情符号替换它们,但这是一项艰巨的工作,我遇到了许多问题 然后我试着做一个自定义字体,里面有表情符号,但我发现字体是黑白的,不能着色 然后我尝试使用不同的编辑字段,因此当我找到位图时,我会绘制它并启动不同的编辑字段,但这对几行都不起作用,并且出现了选择问题 最好的方法是编写自己的文本字段,找到一个特殊的unicode字符,在其中添加2个空格,获取unicode字符的位置,然后在此位置绘制位图图像。

我想做一个聊天应用程序的表情是必要的。我试图编写自己的文本框来处理一些unicode字符,并用微笑和表情符号替换它们,但这是一项艰巨的工作,我遇到了许多问题

然后我试着做一个自定义字体,里面有表情符号,但我发现字体是黑白的,不能着色

然后我尝试使用不同的编辑字段,因此当我找到位图时,我会绘制它并启动不同的编辑字段,但这对几行都不起作用,并且出现了选择问题

最好的方法是编写自己的文本字段,找到一个特殊的unicode字符,在其中添加2个空格,获取unicode字符的位置,然后在此位置绘制位图图像。但当表情符号的数量变大时,这是非常缓慢的


有没有我错过的工具、API或方法可以在BlackBerry设备上为我制作表情符号?请在本主题中提供帮助,我到处搜索,但未找到任何内容

我们可以尝试使用web论坛方法:

  • 允许用户为表情符号输入ASCII码
  • 在消息编辑模式下,将表情符号显示为文本代码
  • 在消息历史记录中将表情符号显示为图像(用于此目的)
  • 使用其他html格式

请尝试以下代码:

public final class ChatScreen extends MainScreen implements FieldChangeListener {
    static final int INT_MSG_MAX_LEN = 200;
    static final DateFormat FRMT_TIME = DateFormat
            .getInstance(DateFormat.TIME_SHORT);
    static final String STR_FRMT_IMG = "<img src=\"{0}\"></img>";
    static final String STR_FRMT_MSG = "<b>{0}</b> [{1}]: {2}</p>";

    // several emoticon ASCII codes
    static final String STR_CODE_SMILE = ":)";
    static final String STR_CODE_SADSMILE = ":(";
    static final String STR_CODE_WINK = ";)";

    // use emoticons from http://www.skypeemoticonslist.com
    static final String STR_IMG_URL = "http://www.skypeemoticonslist.com/images/";
    static final String STR_IMG_NAME_SMILE = "emoticon-0100-smile.png";
    static final String STR_IMG_NAME_SADSMILE = "emoticon-0101-sadsmile.png";
    static final String STR_IMG_NAME_WINK = "emoticon-0105-wink.png";

    static final Hashtable TABLE_URL = new Hashtable();
    static final Hashtable TABLE_IMG = new Hashtable();

    private static void initCode(String code, String imgFName) {
        String tag;
        // prepare table for online use
        // generate img tag with live url
        tag = MessageFormat.format(STR_FRMT_IMG, new Object[] { STR_IMG_URL
                + imgFName });
        TABLE_URL.put(code, tag);

        // prepare table for offline use
        // retrieve image from project resources
        try {
            EncodedImage img = EncodedImage.getEncodedImageResource(imgFName);
            // generate img tag with embedded data url
            String dataStr = getDataUrl(img.getData(), img.getMIMEType());
            tag = MessageFormat.format(STR_FRMT_IMG, new Object[] { dataStr });
            TABLE_IMG.put(code, tag);
        } catch (IOException e) {
            System.out.println("\n Troubles preparing res for code " + code
                    + "  \n");
        }
    }

    static {
        initCode(STR_CODE_SMILE, STR_IMG_NAME_SMILE);
        initCode(STR_CODE_SADSMILE, STR_IMG_NAME_SADSMILE);
        initCode(STR_CODE_WINK, STR_IMG_NAME_WINK);
    }

    boolean mIsOffline = true;
    String mChatHistory = "";

    BrowserField mBrowserField = new BrowserField();
    EditField mTextField = new EditField("Input message: ", "",
            INT_MSG_MAX_LEN, Field.USE_ALL_WIDTH);
    ButtonField mBtnUserLeft = new ButtonField("Send as Mr. Left",
            Field.FIELD_LEFT | ButtonField.CONSUME_CLICK);
    ButtonField mBtnUserRight = new ButtonField("Send as Mr. Right",
            Field.FIELD_RIGHT | ButtonField.CONSUME_CLICK);

    public ChatScreen() {
        super(Manager.NO_VERTICAL_SCROLL | Manager.NO_HORIZONTAL_SCROLLBAR);
        add(mTextField);
        HorizontalFieldManager hfm = new HorizontalFieldManager(
                Field.USE_ALL_WIDTH | Field.FIELD_HCENTER);
        mBtnUserLeft.setChangeListener(this);
        mBtnUserRight.setChangeListener(this);
        hfm.add(mBtnUserLeft);
        hfm.add(mBtnUserRight);
        add(hfm);
        VerticalFieldManager vfm = new VerticalFieldManager(Field.USE_ALL_WIDTH
                | Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR);
        vfm.add(mBrowserField);
        add(vfm);
    }

    protected void makeMenu(Menu menu, int instance) {
        menu.add(new MenuItem(mIsOffline ? "Go Online" : "Go Offline", 0, 0) {
            public void run() {
                mIsOffline = !mIsOffline;
            }
        });
        super.makeMenu(menu, instance);
    }

    public void fieldChanged(final Field field, int context) {
        if (field == mBtnUserLeft) {
            addMessage("Mr. Left");
        } else if (field == mBtnUserRight) {
            addMessage("Mr. Right");
        }
    }

    private void addMessage(String userName) {
        String message = mTextField.getText();

        // update message with emoticons
        message = replaceCodeWithImg(message, STR_CODE_SMILE);
        message = replaceCodeWithImg(message, STR_CODE_SADSMILE);
        message = replaceCodeWithImg(message, STR_CODE_WINK);
        String timeStr = FRMT_TIME.format(new Date(System.currentTimeMillis()));
        String text = MessageFormat.format(STR_FRMT_MSG, new Object[] {
                userName, timeStr, message });
        mChatHistory = text + mChatHistory;
        mTextField.setText("");
        // fix IllegalStateException up to
        // http://supportforums.blackberry.com/t5/Java-Development/IllegalStateException-at-displayContent-on-browserfield/td-p/1071991
        mBrowserField.setFocus();

        mBrowserField.displayContent("<html>" + mChatHistory + "</html>", "");
    }

    private String replaceCodeWithImg(String message, String code) {
        Hashtable table = mIsOffline ? TABLE_IMG : TABLE_URL;
        int index = message.indexOf(code);
        while (index != -1) {
            String begin = message.substring(0, index);
            String end = message.substring(index + code.length());
            String tag = (String) table.get(code);
            message = begin + tag + end;

            index = message.indexOf(code, index + tag.length());
        }
        return message;
    }

    // src taken from http://bfo.com/blog/files/src/DataStreamHandler.java
    private static final String getDataUrl(byte[] data, String mimetype)
            throws IOException {
        final StringBuffer sb = new StringBuffer();
        sb.append("data:");
        sb.append(mimetype);
        sb.append(";base64,");
        OutputStream out = new OutputStream() {
            public void write(int c) {
                sb.append((char) (c & 0xFF));
            }
        };
        Base64OutputStream fout = new Base64OutputStream(out);
        fout.write(data);
        fout.close();
        return sb.toString();
    }
}
公共最终类ChatScreen扩展MainScreen实现FieldChangeListener{
静态最终整数整数最大长度=200;
静态最终日期格式FRMT\U TIME=日期格式
.getInstance(DateFormat.TIME\u SHORT);
静态最终字符串STR_FRMT_IMG=“”;
静态最终字符串STR_FRMT_MSG=“{0}[{1}]:{2}

”; //几种表情ASCII码 静态最终字符串STR_CODE_SMILE=“:)”; 静态最终字符串STR_CODE_SADSMILE=“:(”; 静态最终字符串STR_CODE_WINK=“;)”; //使用来自http://www.skypeemoticonslist.com 静态最终字符串STR\u IMG\u URL=”http://www.skypeemoticonslist.com/images/"; 静态最终字符串STR\u IMG\u NAME\u SMILE=“emoticon-0100-SMILE.png”; 静态最终字符串STR_IMG_NAME_SADSMILE=“emoticon-0101-SADSMILE.png”; 静态最终字符串STR_IMG_NAME_WINK=“emoticon-0105-WINK.png”; 静态最终哈希表_URL=新哈希表(); 静态最终哈希表_IMG=新哈希表(); 私有静态void initCode(字符串代码,字符串imgFName){ 字符串标签; //准备在线使用的表格 //使用实时url生成img标记 tag=MessageFormat.format(STR_FRMT_IMG,新对象[]{STR_IMG_URL +imgFName}); 表URL.put(代码、标签); //准备表格以供脱机使用 //从项目资源中检索图像 试一试{ EncodedImage img=EncodedImage.getencodedimagesource(imgFName); //使用嵌入的数据url生成img标记 字符串dataStr=getDataUrl(img.getData(),img.getMIMEType()); tag=MessageFormat.format(STR_FRMT_IMG,新对象[]{dataStr}); 表\u IMG.put(代码、标签); }捕获(IOE异常){ System.out.println(“\n为代码准备res时遇到问题”+代码 +“\n”); } } 静止的{ 初始化代码(STR_CODE_SMILE,STR_IMG_NAME_SMILE); 初始化代码(STR_CODE_SADSMILE,STR_IMG_NAME_SADSMILE); 初始化代码(STR_CODE_WINK,STR_IMG_NAME_WINK); } 布尔值=true; 字符串mChatHistory=“”; BrowserField mBrowserField=新BrowserField(); EditField mTextField=新的EditField(“输入消息:”,“”, INT_MSG_MAX_LEN,字段。使用所有宽度); ButtonField mBtnUserLeft=新的ButtonField(“作为左先生发送”, Field.Field_LEFT | ButtonField.consum_CLICK); ButtonField mBtnUserRight=新的ButtonField(“作为右先生发送”, Field.Field_RIGHT | ButtonField.consum_CLICK); 公共聊天屏幕(){ 超级(Manager.NO_垂直滚动条| Manager.NO_水平滚动条); 添加(mTextField); HorizontalFieldManager hfm=新的HorizontalFieldManager( Field.USE_ALL_WIDTH | Field.Field_HCENTER); mBtnUserLeft.setChangeListener(这个); mBtnUserRight.setChangeListener(此); hfm.add(mBtnUserLeft); hfm.add(mBtnUserRight); 添加(hfm); VerticalFieldManager vfm=新的VerticalFieldManager(Field.USE\u ALL\u WIDTH |Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR); vfm.add(mBrowserField); 添加(vfm); } 受保护的void makeMenu(菜单菜单,int实例){ 添加(新菜单项(脱机错误?“联机”:“脱机”,0,0){ 公开募捐{ mIsOffline=!mIsOffline; } }); makeMenu(菜单,实例); } 公共无效字段已更改(最终字段,int上下文){ 如果(字段==mBtnUserLeft){ addMessage(“左先生”); }else if(字段==mBtnUserRight){ addMessage(“右先生”); } } 私有void addMessage(字符串用户名){ String message=mTextField.getText(); //使用表情符号更新消息 message=replaceCodeWithImg(message,STR\u CODE\u SMILE); message=replaceCodeWithImg(message,STR\u CODE\u SADSMILE); message=replaceCodeWithImg(message,STR\u CODE\u WINK); 字符串timeStr=FRMT_TIME.format(新日期(System.currentTimeMillis()); String text=MessageFormat.format(STR\u FRMT\u MSG,new Object[]{ 用户名、timeStr、message}); mChatHistory=文本+mChatHistory; mTextField.setText(“”); //将非法状态异常修复到 // http://supportforums.blackberry.com/t5/Java-Development/IllegalStateException-at-displayContent-on-browserfield/td-p/1071991 mBrowserField.setFocus(); 显示内容(“+mChatHistory+”,“”); } P