连接有物理键盘时,如何不要让弹出软键盘

硬件:AIO-3399J,源码“Android 7.1 SDK源码(industry版本)”,下载时间2020-7-13。

public class InputMethodService extends AbstractInputMethodService {
    public boolean onEvaluateInputViewShown() {
        if (mSettingsObserver == null) {
            Log.w(TAG, "onEvaluateInputViewShown: mSettingsObserver must not be null here.");
            return false;
        }
        if (mSettingsObserver.shouldShowImeWithHardKeyboard()) {
            return true;
        }
        Configuration config = getResources().getConfiguration();
        return config.keyboard == Configuration.KEYBOARD_NOKEYS
                || config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES;
    }
}

跟踪下来,连接有物理键盘时,config.keyboard的确是Configuration.KEYBOARD_QWERTY,但该函数要返回false,还须要同时满足两个条件,一是mSettingsObserver.shouldShowImeWithHardKeyboard()返回false,二是config.hardKeyboardHidden不是Configuration.HARDKEYBOARDHIDDEN_YES。我试下来,这两个条件都没有满足。

第一个条件:mSettingsObserver.shouldShowImeWithHardKeyboard()。会调用Settings.Secure.getInt(mService.getContentResolver(), Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0),得到的值是ShowImeWithHardKeyboardType.TRUE,也就是说函数返回true。

第二个条件:config.hardKeyboardHidden值是Configuration.HARDKEYBOARDHIDDEN_YES。对这问题我对照之前下过的“Android 7.1 SDK源码”(非industry版本),发现两个版本在computeScreenConfigurationLocked时赋给config.hardKeyboardHidden值不一样。以下是industry版本,设的值是Configuration.HARDKEYBOARDHIDDEN_YES。

void computeScreenConfigurationLocked(Configuration config) {
  ....
  // Let the policy update hidden states.
  config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO;
  config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES;
  config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO;
  mPolicy.adjustConfigurationLw(config, keyboardPresence, navigationPresence);
}

而在非industry版本,设置的值是Configuration.HARDKEYBOARDHIDDEN_NO。

——“Android 7.1 SDK源码(industry版本)”下,连接有物理键盘时,如何不要让弹出软键盘?