Как я могу получить список всех методов ввода (и их имена), которые установлены на телефоне? - PullRequest
3 голосов
/ 18 ноября 2010

Я пытаюсь отобразить список всех методов ввода, которые в настоящее время установлены на телефоне.Я получаю список объектов InputMethodInfo, выполняя это:

InputMethodManager imeManager = (InputMethodManager)getApplicationContext().getSystemService(INPUT_METHOD_SERVICE);
List<InputMethodInfo> InputMethods = imeManager.getEnabledInputMethodList();

Это работает, но у объекта InputMethodInfo нигде нет понятного имени.Например, вместо «Swype» он выдаст мне «com.swype.android.inputmethod.SwypeInputMethod»

Это не очень удобный способ отображения списка для пользователя, и эти имена пакетов нене следовать строгому шаблону, поэтому у меня нет способа надежно разобрать имя клавиатуры по имени класса.

Я даже пытался по-настоящему выкрутиться и получить соответствующий объект ServiceInfo объекта InputMethodInfo, чтобы я мог разрешить его меткуРесурс целочисленный, но я просто получаю NameNotFoundExceptions каждый раз, когда это выполняется.

ComponentName componentName = inputMethodInfo.getComponent();
ServiceInfo serviceInfo = packageManager.getServiceInfo(componentName, 0);
Resources resources = getResources();
try 
{
 String imeServiceLabel = resources.getString(serviceInfo.labelRes);
} 
catch (NameNotFoundException e) { }

Кто-нибудь знает, как этого добиться?Мне все равно, как я должен это сделать, мне просто нужно иметь возможность составить список методов ввода, которые появляются в меню «Язык» и «Клавиатура» телефона, и затем сохранить выбор пользователя.Я подумал, может быть, я мог бы просто использовать InputMethodManager, чтобы запустить стандартное меню выбора метода ввода, а затем посмотреть, какой пользователь выбрал, посмотрев, какой IME выбран в данный момент после закрытия меню, но насколько я могу судить, нет никакого способа увидетькакой IME в данный момент выбран в системе.

1 Ответ

8 голосов
/ 18 ноября 2010

Я потратил много времени на это, когда оно было прямо у меня под носом. Я нашел ответ на свой вопрос, когда занимался чем-то другим. Это даст вам понятное имя метода ввода через обычный объект InputMethodInfo.

inputMethodInfo.loadLabel(packageManager).toString();

Я слишком привык писать на C #, где все реализовано как Property, поэтому я провел большую часть своего исследования, просматривая свойства объекта во время выполнения. Java, однако, предлагает большую часть этого типа информации с помощью открытых методов, и я только что заметил это, когда в Eclipse появилось окно автозаполнения.

...