BlackBerry - обрабатывать и переводить сообщения (sms / email / pim / pin)?

Позволяет ли собственный Blackberry API изменять какой-либо интерфейс обмена сообщениями?

Например, я хотел бы иметь возможность создать приложение, которое добавляло бы кнопку внизу полученного сообщения с надписью «переведите это». Я слышал, что такое возможно при использовании J2ME плюс собственный BlackBerry API. Можно ли это сделать для всех видов сообщений, например SMS, электронной почты и сообщений BB?

Аспект перевода не имеет значения, он просто предоставляет контекст для той функции, которую я ищу.


person nedned    schedule 23.03.2010    source источник


Ответы (1)


Попробуйте API перевода Google, не должно быть проблем для управления правильным переводом http запросы:

Для разработчиков Flash и тех разработчиков, которым требуется доступ к API-интерфейсу AJAX из других сред, отличных от Javascript, API предоставляет простой интерфейс RESTful. Во всех случаях поддерживается метод GET, а формат ответа - результат в кодировке JSON со встроенными кодами состояния. . Для google.language.translate доступен метод POST. Приложения, использующие этот интерфейс, должны соблюдать все существующие условия использования. Область, на которую следует обратить особое внимание, связана с правильной идентификацией себя в ваших запросах. Приложения ДОЛЖНЫ всегда включать в свои запросы действительный и точный http://en.wikipedia.org/wiki/HTTP_referer. Кроме того, мы просим, ​​но не требуем, чтобы каждый запрос содержал действительный ключ API. Предоставляя ключ, ваше приложение предоставляет нам вторичный механизм идентификации, который будет полезен, если нам понадобится связаться с вами для решения каких-либо проблем.

И если говорить об интеграции такого сервиса, я вижу две альтернативы:

  • вы можете обработать событие получения сообщения и использовать глобальный диалог для выбора настроек перевода, а затем снова показать результат в глобальном диалоге
  • вы можете интегрировать элемент меню в собственные приложения для сообщений, чтобы перевести выбранный элемент, а затем использовать глобальный диалог для отображения результатов перевода.

ОБНОВЛЕНИЕ Я наконец-то сумел реализовать эту прекрасную идею :)
Вот в чем дело: будет два приложения: основное и служебное. Основное приложение может быть запущено отдельно и используется для перевода. Сервис будет отвечать за обработку сообщений и запуск основного приложения для перевода.

Основной код приложения:

public class TranslatorApp extends UiApplication {
    public TranslatorApp(String text) {
        pushScreen(new TranslationScreen(text));
    }

    public TranslatorApp() {
        pushScreen(new TranslationScreen());
    }

    public static void main(String[] args) {
        TranslatorApp app = null;
        if (null == args || args.length == 0) {
            app = new TranslatorApp();
        } else {
            app = new TranslatorApp(args[0]);
        }
        app.enterEventDispatcher();
    }
}

class TranslationScreen extends MainScreen implements TranslateCallback {
    final static int TMODE_MANUAL = 0;
    final static int TMODE_INTEGRATED = 1;
    Translator mTranslator = null;
    BasicEditField mOriginalTextEdit = new BasicEditField("", "");
    LabelField mOriginalTextLabel = new LabelField("");
    LabelField mTranslatedTextLabel = new LabelField("");
    String mOriginalText = "";
    int mTranslationMode = TMODE_MANUAL;

    public TranslationScreen() {
        mTranslationMode = TMODE_MANUAL;
        add(mOriginalTextEdit);
        add(mTranslatedTextLabel);
        mTranslator = new Translator(this);
    }

    protected void makeMenu(Menu menu, int instance) {
        super.makeMenu(menu, instance);
        if (mTranslationMode == TMODE_MANUAL) {
            menu.add(new MenuItem("translate", 0, 0) {
                public void run() {
                    mOriginalText = mOriginalTextEdit.getText();
                    translate();
                }
            });
        }
    }

    public TranslationScreen(String text) {
        mTranslationMode = TMODE_INTEGRATED;
        mOriginalText = text;
        mOriginalTextLabel.setText(mOriginalText);
        add(mOriginalTextLabel);
        add(mTranslatedTextLabel);
        mTranslator = new Translator(this);
        translate();
    }

    public void translationComplete(final String translatedText) {
        UiApplication.getUiApplication().invokeLater(
            new Runnable(){
                public void run() {
                mTranslatedTextLabel.setText(translatedText);   
        }});
    }

    public void exception(Exception ex) {
        Dialog.alert(ex.getMessage());
    }

    private void translate() {
        if (null != mOriginalText
                && 0 != mOriginalText.trim().length()) {
            mTranslator.translate(mOriginalText);
        } else {
            Dialog.alert("text is empty");
        }
    }
}

interface ExceptionHandler {
    public void exception(Exception ex);
}

interface TranslateCallback extends ExceptionHandler {
    public void translationComplete(String translatedText);
}

class Translator {
    TranslateCallback mCallback;
    static final String url = "http://ajax.googleapis.com/ajax/"+
            "services/language/translate?";

    //remember to change referrer :)
    static final String referrerUrl = "http://stackoverflow.com";

    public Translator(TranslateCallback callback) {
        mCallback = callback;
    }

    public void translate(final String text) {
        Runnable translation = new Runnable() {
            public void run() {
                String result = "";
                StringBuffer sb = new StringBuffer();
                sb.append(url);
                sb.append("v=1.0&");
                sb.append("q=");
                sb.append(URLencode(text));
                sb.append("&");
                sb.append("langpair=en|uk");
                String requestUrl = sb.toString();
                try {
                    HttpConnection connection = (HttpConnection) Connector
                            .open(requestUrl);
                    connection.setRequestMethod("POST");
                    connection.setRequestProperty("Referer", referrerUrl);
                    result = new String(IOUtilities.streamToBytes(connection
                            .openInputStream()), "UTF-8");
                } catch (IOException e) {
                    mCallback.exception(e);
                }
                translationEnd(result);
            }
        };

        Thread t = new Thread(translation);
        t.start();
    }

    public static String URLencode(String s)
    {
        if (s!=null) {
            StringBuffer tmp = new StringBuffer();
            int i=0;
            try {
                while (true) {
                    int b = (int)s.charAt(i++);
                    if ((b>=0x30 && b<=0x39) || (b>=0x41 && b<=0x5A) 
                        || (b>=0x61 && b<=0x7A)) {
                        tmp.append((char)b);
                    }
                    else {
                        tmp.append("%");
                        if (b <= 0xf) tmp.append("0");
                        tmp.append(Integer.toHexString(b));
                    }
                }
            }
            catch (Exception e) {}
            return tmp.toString();
        }
        return null;
    }

    private void translationEnd(String result) {
        String key = "translatedText";
        int index = result.indexOf(key)+key.length()+"\"".length();     
        int beginIndex = result.indexOf("\"", index + 1)+1;
        int endIndex = result.indexOf("\"", beginIndex);
        String traslatedText = result.substring(beginIndex, endIndex);      
        mCallback.translationComplete(traslatedText);
    }
}

А вот и Сервисный код:

public class TranslatorSrvc extends Application implements MessageProcessor {
    SMSListener mSMSListener = null;
    EmailListener mEmailListener = null;
    PIMListener mPIMListener = null;
    public TranslatorSrvc() {
        // SMS
        mSMSListener = new SMSListener(this);

        // Email
        mEmailListener = new EmailListener(this);

        //PIM
        mPIMListener = new PIMListener(this);
    }

    public static void main(String[] args) {
        TranslatorSrvc app = new TranslatorSrvc();
        app.enterEventDispatcher();
    }

    private void showMessage(String message) {
        synchronized (Application.getEventLock()) {
            Dialog dlg = new Dialog(Dialog.D_OK, message, Dialog.OK, null,
                    Manager.FIELD_HCENTER);
            Ui.getUiEngine().pushGlobalScreen(dlg, 1, UiEngine.GLOBAL_QUEUE);
        }
    }

    public void processMessage(String text) {
        try {
            ApplicationManager.getApplicationManager().launch(
                    "SOTranslatorApp?" + text);
        } catch (ApplicationManagerException e) {
            exception(e);
        }
    }

    public void exception(Exception ex) {
        showMessage(ex.getMessage());
    }
}

interface ExceptionHandler {
    public void exception(Exception ex);
}

interface MessageProcessor extends ExceptionHandler {
    public void processMessage(String text);
}

abstract class AMessageListener {
    MessageProcessor mProcessor;

    public AMessageListener(MessageProcessor processor) {
        mProcessor = processor;
    }
}

Код прослушивателя SMS:

import java.io.IOException;

import javax.microedition.io.Connector;
import javax.wireless.messaging.Message;
import javax.wireless.messaging.MessageConnection;
import javax.wireless.messaging.MessageListener;
import javax.wireless.messaging.TextMessage;

public class SMSListener extends AMessageListener implements MessageListener {
    MessageConnection mSMSConnection = null;
    boolean mSMSReceiveDone = false;
    Reader mSMSReader = null;

    public SMSListener(MessageProcessor processor) {
        super(processor);
        try {
            mSMSConnection = (MessageConnection) Connector.open("sms://:0");
            mSMSConnection.setMessageListener(this);
            mSMSReader = new Reader();
            new Thread(mSMSReader).start();
        } catch (IOException e) {
            mProcessor.exception(e);
        }
    }

    public void notifyIncomingMessage(MessageConnection conn) {
        if (mSMSConnection == conn) {
            mSMSReader.handleMessage();
        }
    }

    // Isolate blocking I/O on a separate thread, so callback
    // can return immediately.
    class Reader implements Runnable {
        private int pendingMessages = 0;

        // The run method performs the actual message reading.
        public void run() {
            while (!mSMSReceiveDone) {
                synchronized (this) {
                    if (pendingMessages == 0) {
                        try {
                            wait();
                        } catch (Exception e) {
                            mProcessor.exception(e);
                        }
                    }
                    pendingMessages--;
                }
                try {
                    Message mess = mSMSConnection.receive();
                    processSMSMessage(mess);
                } catch (IOException ioe) {
                    mProcessor.exception(ioe);
                }
            }
        }

        public synchronized void handleMessage() {
            pendingMessages++;
            notify();
        }
    }

    public void processSMSMessage(Message mess) {
        if (mess instanceof TextMessage) {
            TextMessage txtMessage = (TextMessage) mess;
            String messageText = txtMessage.getPayloadText();
            mProcessor.processMessage(messageText);
        }
    }
}

Код прослушивателя электронной почты:

import net.rim.blackberry.api.mail.Session;
import net.rim.blackberry.api.mail.event.FolderEvent;
import net.rim.blackberry.api.mail.event.FolderListener;

public class EmailListener extends AMessageListener implements FolderListener {
    public EmailListener(MessageProcessor processor) {
        super(processor);
        Session.getDefaultInstance().getStore().addFolderListener(this);
    }

    public void messagesAdded(FolderEvent e) {
        String text = e.getMessage().getBodyText();
        mProcessor.processMessage(text);
    }

    public void messagesRemoved(FolderEvent e) {
    }
}

Код PIM Listener (к сожалению, не тестировался, буду благодарен за отзывы!):

import java.io.UnsupportedEncodingException;

import net.rim.blackberry.api.blackberrymessenger.BlackBerryMessenger;
import net.rim.blackberry.api.blackberrymessenger.Message;
import net.rim.blackberry.api.blackberrymessenger.Session;
import net.rim.blackberry.api.blackberrymessenger.SessionListener;
import net.rim.blackberry.api.blackberrymessenger.SessionRequestListener;
import net.rim.device.api.system.ApplicationDescriptor;

public class PIMListener extends AMessageListener implements
        SessionRequestListener, SessionListener {
    ApplicationDescriptor mAppDescr = ApplicationDescriptor
            .currentApplicationDescriptor();

    public PIMListener(MessageProcessor processor) {
        super(processor);
        BlackBerryMessenger msgr = BlackBerryMessenger.getInstance();
        msgr.addSessionRequestListener(this, mAppDescr);
    }

    public void sessionRequestAccepted(Session session) {
        session.addListener(this, mAppDescr);
    }

    public void messageReceived(Session session, Message message) {
        try {
            mProcessor.processMessage(new String(message.getData(), "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            mProcessor.exception(e);
        }
    }

    public void messageSent(Session session, Message message) {
    }

    public void sessionClosed(Session session) {
    }

    public void messageDelivered(Session session, Message message) {
    }

    public void messageQueuedForSend(Session session, Message message) {
    }
}
person Maksym Gontar    schedule 23.03.2010
comment
Извините, возможно, мой вопрос был недостаточно ясным. Переводная сторона этого особо не актуальна. Я хотел бы знать, можно ли изменить различные функции обмена сообщениями в BlackBerry OS через приложение. - person nedned; 23.03.2010
comment
Хорошо, круто, так что это возможно. Вы знаете, можно ли это сделать со всеми типами сообщений, которые я упоминаю в вопросе? - person nedned; 23.03.2010
comment
Для обработки события приема используйте blackberry.com/developers /docs/4.6.0api/javax/wireless/ (есть образец смс, о других типах сказать не могу) - person Maksym Gontar; 23.03.2010
comment
а для обработки нового почтового сообщения можно использовать blackberry.com/developers/docs/4.5.0api/net/rim/blackberry/api/ - person Maksym Gontar; 23.03.2010
comment
и, наконец, вы можете использовать blackberry .com / developers / docs / 4.5.0api / net / rim / blackberry / api /, чтобы добавить приложение в качестве службы и зарегистрировать SessionListener (для получения сообщения о доходах) - person Maksym Gontar; 24.03.2010
comment
Вау, теперь это довольно исчерпывающий ответ. Я просто входил в систему, чтобы принять ваш ответ, и это было до того, как вы разместили код. Большое спасибо. - person nedned; 28.03.2010