1

我正在尝试在 Android 上创建一个带有一个附加按钮的自定义键盘,该按钮将启动一个活动(在本例中是听用户说话)并将其转换为文本,类似于 Google 的语音识别按钮的工作方式。

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

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

在活动中,我没有得到任何结果。我确定getCurrentInputConnection()is not null,并且编辑器类型(调用时getCurrentInputEditorInfo())不是类型null,所以我知道我可以将文本作为字符串输入,而不仅仅是逐个字符输入(如此处所建议

我知道问题可能是我无法访问我新启动的活动中的输入连接,但正如我在其他地方和这里发现的那样,startActivityForResult不能从InputMethodServices.

基本上有什么方法可以影响从我新启动的活动中显示的文本,或者有什么方法可以设置监听器以在活动完成后更改文本?

感谢你们的任何帮助。

4

1 回答 1

0

戈吉沙,

我也有类似的想法。该活动将是一个文本字符串列表,以注入 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 错误/功能。所以我把它放在活动的 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("");

希望这可以帮助。实际上,我希望你在一年前提出问题后就已经明白了这一点……最好的鱼。

于 2013-09-24T03:22:27.813 回答