获取默认键盘的人类可读名称(不是包名称)

Get human-readable name of default keyboard (not package name)

是否有可能在 Android (API 24 - 29) 中获取当前默认键盘的人类可读名称?当我使用下面的代码时

String keyboard = Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);

我得到

com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME

但我想用 Gboard 代替(即键盘选择菜单中显示的名称,而不是包名称)。

结果是 ComponentNameString 形式,因此我们可以使用 unflattenFromString() 方法轻松解析出包名,然后检索包的标签——即, 人类可读的名字——从它的 ApplicationInfo 获得 PackageManager。例如,在一个简单的 Java 实用程序方法中:

public static CharSequence getCurrentImeLabel(Context context) {
    CharSequence readableName = null;

    String keyboard = Settings.Secure.getString(context.getContentResolver(), DEFAULT_INPUT_METHOD);
    ComponentName componentName = ComponentName.unflattenFromString(keyboard);
    if (componentName != null) {
        String packageName = componentName.getPackageName();
        try {
            PackageManager packageManager = context.getPackageManager();
            ApplicationInfo info = packageManager.getApplicationInfo(packageName, 0);
            readableName = info.loadLabel(packageManager);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }

    return readableName;
}

以及 Context 上的等效 Kotlin 扩展:

fun Context.getCurrentImeLabel() : CharSequence? {
    val keyboard = Settings.Secure.getString(contentResolver, DEFAULT_INPUT_METHOD)
    return ComponentName.unflattenFromString(keyboard)?.let {
        packageManager.getApplicationInfo(it.packageName, 0).loadLabel(packageManager)
    }
}

如果您只需要人类可读的名称,那么这似乎是最直接的方法,因为 InputMethodManager 似乎没有任何 public 方法 returns 当前输入法。

但是,如果您需要其他特定于 IME 的信息,似乎必须从 InputMethodManagergetInputMethodList() 或 [=22] 返回的 List<InputMethodInfo> 中提取它=] 方法。在这两种情况下,您都需要遍历 List,检查 InputMethodInfo#getId() 等于从 Settings.

返回的 String

InputMethodInfoclass也有一个loadLabel(PackageManager)方法可用,所以如果你正在使用这个方法,或者已经有必要的InputMethodInfo,那么你可以直接使用它,而不是进行不必要的 getApplicationInfo() 调用。