从IME启动活动以添加文本(Android)

时间:2011-11-03 21:29:16

标签: android ime

我正在尝试在Android上创建一个自定义键盘,只需一个按钮即可启动一项活动(在这种情况下听取用户说话)并将其转换为文本,类似于Google的语音识别按钮的工作方式。

我已经创建了自定义键盘(使用Android开发者页面中的SoftKeyboard演示),点击我添加的按钮可以启动语音听取活动,当我记录结果时,它们会正确显示。但是,当我尝试做这样的事情时:

getCurrentInputConnection().commitText(result, 1); //result is a String

在活动中,我没有结果。我确保getCurrentInputConnection()不是null,并且编辑器类型(调用getCurrentInputEditorInfo()时)不是null类型,所以我知道我可以输入文本作为字符串,而不仅仅是逐个字符(建议here)。

我了解问题可能是我在新发布的活动中无法访问输入连接,但正如我在其他地方找到的那样,startActivityForResult无效InputMethodServices }。

基本上有没有办法影响我新发布的活动显示的文字,或者在活动结束后设置听众改变文字的方式?

感谢你们的任何帮助。

1 个答案:

答案 0 :(得分:0)

gogisha,

我有类似的想法。该活动将是一个文本字符串列表,用于注入ime正在处理的文档中。我就是这样做的。

在清单中,我添加了一项活动:

    <activity
        android:name="org.this_voice.prakeyboard.KeyboardMacros"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:excludeFromRecents="true"
        android:label="@string/keyboardmacros"
        android:screenOrientation="portrait" >
    </activity> 

然后在ime中,我拿起了escape-char代码来启动活动:

    } else if (primaryCode == 27) {         
        Intent i = new Intent(this, KeyboardMacros.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.putExtra("MODE","okay");
        startActivity(i);

但是ime在onCreate中启动活动时出现了问题。也许是Android的bug /功能。所以我把它放在活动的onCreate:

    Intent origin = this.getIntent();
    String okay = origin.getStringExtra("MODE");
    if ((okay == null) || (!okay.matches("okay"))){ finish(); }

因此,活动仅在我按下发送27(Esc)的软键时开始。活动开始,列表出现,用户选择一个文本项,活动将其加载到剪贴板中:

            String macro = dbs.get(result);
            ClipboardManager clipboard = (ClipboardManager) 
                getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(macro);
            finish();

所以我们用我们的ime回到编辑器中。所以在ime.startInput中我们有:

    ClipboardManager clipboard = (ClipboardManager) 
        getSystemService(Context.CLIPBOARD_SERVICE);
    if (clipboard.hasText()){
        getCurrentInputConnection().commitText(clipboard.getText(), 1);
        clipboard.setText("");

清除剪贴板非常重要。我正在使用setText,以便我们与Android 8+兼容。它变成了11个更高级的东西。哦, 在ime onCreate中,我们也清除了剪贴板:

    ClipboardManager clipboard = (ClipboardManager) 
        getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText("");

希望这会有所帮助。实际上,我希望你在一年前问过你的问题后已经想到了这个问题.... 最好的鱼。