我正在尝试在Android上创建一个自定义键盘,只需一个按钮即可启动一项活动(在这种情况下听取用户说话)并将其转换为文本,类似于Google的语音识别按钮的工作方式。
我已经创建了自定义键盘(使用Android开发者页面中的SoftKeyboard演示),点击我添加的按钮可以启动语音听取活动,当我记录结果时,它们会正确显示。但是,当我尝试做这样的事情时:
getCurrentInputConnection().commitText(result, 1); //result is a String
在活动中,我没有结果。我确保getCurrentInputConnection()
不是null
,并且编辑器类型(调用getCurrentInputEditorInfo()
时)不是null
类型,所以我知道我可以输入文本作为字符串,而不仅仅是逐个字符(建议here)。
我了解问题可能是我在新发布的活动中无法访问输入连接,但正如我在其他地方找到的那样,startActivityForResult
无效InputMethodServices
}。
基本上有没有办法影响我新发布的活动显示的文字,或者在活动结束后设置听众改变文字的方式?
感谢你们的任何帮助。
答案 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("");
希望这会有所帮助。实际上,我希望你在一年前问过你的问题后已经想到了这个问题.... 最好的鱼。