获取默认键盘的人类可读名称(不是包名称)
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
代替(即键盘选择菜单中显示的名称,而不是包名称)。
结果是 ComponentName
的 String
形式,因此我们可以使用 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 的信息,似乎必须从 InputMethodManager
的 getInputMethodList()
或 [=22] 返回的 List<InputMethodInfo>
中提取它=] 方法。在这两种情况下,您都需要遍历 List
,检查 InputMethodInfo#getId()
等于从 Settings
.
返回的 String
InputMethodInfo
class也有一个loadLabel(PackageManager)
方法可用,所以如果你正在使用这个方法,或者已经有必要的InputMethodInfo
,那么你可以直接使用它,而不是进行不必要的 getApplicationInfo()
调用。
是否有可能在 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
代替(即键盘选择菜单中显示的名称,而不是包名称)。
结果是 ComponentName
的 String
形式,因此我们可以使用 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 的信息,似乎必须从 InputMethodManager
的 getInputMethodList()
或 [=22] 返回的 List<InputMethodInfo>
中提取它=] 方法。在这两种情况下,您都需要遍历 List
,检查 InputMethodInfo#getId()
等于从 Settings
.
String
InputMethodInfo
class也有一个loadLabel(PackageManager)
方法可用,所以如果你正在使用这个方法,或者已经有必要的InputMethodInfo
,那么你可以直接使用它,而不是进行不必要的 getApplicationInfo()
调用。