You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API29下KeyEvent ACTION_MULTIPLE及getCharacters弃用后接收重音字符方案咨询

问题描述

根据Android官方文档,KeyEvent的ACTION_MULTIPLE(值为2)常量与getCharacters()方法在API 29中被标记为弃用,官方说明输入系统不再使用这些特性。但在Android 10(API 29)平板上测试时发现:用户通过软键盘输入的重音字符仍会通过onKeyMultiple()回调传递,对应的KeyEvent action为ACTION_MULTIPLE,调用getCharacters()能正常获取到重音字符,而onKeyUp()不会被触发。当前代码能正常运行,但会收到弃用警告。

此外,文档未明确说明接收欧洲重音元音这类非ASCII字符的正确方式,尝试用getUnicodeChar()获取Unicode码点时返回0,非ASCII字符对应的keyCode也为0。

目前在自研跨平台引擎的原生应用中,于Java NativeActivity里重写了以下方法:

@Override
public boolean onKeyUp( int keyCode, KeyEvent event )
{
    // 输入'e'时,keyCode为33,action为1,unicode字符为101
    // 非ASCII字符不会触发此方法
    Log.i( "MyApp", "onKeyUp " + keyCode );
    Log.i( "MyApp", "action " + event.getAction() );
    Log.i( "MyApp", "unicode " + event.getUnicodeChar() );

    return true;
}

@Override
public boolean onKeyMultiple( int keyCode, int repeatCount, KeyEvent event )
{
    // 输入带重音的'e'时,keyCode为0,action为2,unicode为0
    // getCharacters()会返回包含重音字符的字符串
    // 仅非ASCII字符会触发此方法
    Log.i( "MyApp", "onKeyMultiple " + keyCode );
    Log.i( "MyApp", "action " + event.getAction() );
    Log.i( "MyApp", "unicode " + event.getUnicodeChar() );
    Log.i( "MyApp", "chars " + event.getCharacters() );
    return true;
}

咨询问题:

  1. Android官方文档是否存在错误?
  2. 接收非ASCII字符的正确方式是什么?
解答

1. 文档是否存在错误?

不算文档错误,只是描述不够严谨。官方标记ACTION_MULTIPLE和getCharacters()为弃用,针对的是标准物理键盘的输入路径,但部分软键盘(尤其是第三方软键盘)可能未及时适配新的输入机制,仍通过旧的onKeyMultiple()路径传递非ASCII字符。这属于版本过渡阶段的兼容现象,并非文档本身的错误。

2. 接收非ASCII字符的正确方式

Android官方推荐的文本输入处理方式是使用InputConnection相关接口,而非依赖KeyEvent回调,具体实现步骤如下:

  • 在NativeActivity中重写onCreateInputConnection()方法,返回自定义的InputConnection实例(或直接使用BaseInputConnection)。
  • 通过InputConnection提供的commitText()、setComposingText()等方法接收完整的文本内容,这些方法可以直接获取包括重音、表情在内的所有Unicode字符。

示例代码片段:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    BaseInputConnection inputConnection = new BaseInputConnection(this, false);
    outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
    return inputConnection;
}

为了兼容旧版本系统和未适配的软键盘,可以保留onKeyMultiple()的实现(可通过@SuppressWarnings("deprecation")注解屏蔽弃用警告),但核心输入逻辑应逐步迁移到InputConnection上,这是官方认可的长期解决方案。

另外,getUnicodeChar()返回0是因为非ASCII重音字符并非单一按键触发,KeyEvent无法通过按键码映射到对应的Unicode码点,这也是官方不推荐用KeyEvent处理复杂文本输入的原因。

内容的提问来源于stack exchange,提问作者drjon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:58:34