Как проверить, используется ли родная / аппаратная клавиатура? - PullRequest
4 голосов
/ 17 ноября 2011

Я хочу проверить, используется ли встроенная / аппаратная клавиатура, а также, если возможно, я хочу отключить сторонние клавиатуры.

Моя цель проста: я использую только встроенную программную клавиатуру Android для ввода значений в мои поля ввода, и никакая другая клавиатура не должна этого делать

Спасибо

EDIT

Я знаю, что делать то, что я пытаюсь сделать, не очень хорошая идея. Я знаю, что основная идея Android состоит в том, чтобы иметь намерения, действия и службы, которые знают, как обрабатывать некоторые типы намерений в соответствии с фильтром намерений. Но в каждом правиле есть исключение, особенно когда мы говорим о безопасности.

Я хочу отключить все сторонние клавиатуры, и если это невозможно сделать с помощью какого-либо API или чего-то еще ... есть ли способ обойти эту проблему?

EDIT

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

Возвращает активированный в настоящее время метод ввода (клавиатура), но мне нужно что-то вроде «системной клавиатуры», и я не вижу такого флага: - (.

List<InputMethodInfo> list = m.getInputMethodList();

Одним из возможных решений является использование списка [0] в качестве клавиатуры, которую я ищу, но я не хочу ретранслировать заказ (за исключением случаев, когда гарантируется, что всегда приходит клавиатура с индексом 0) установить с телефона)

это значение списка

[InputMethodInfo{com.htc.android.htcime/.HTCIMEService, settings: com.htc.android.htcime.HTCIMESettings}, InputMethodInfo{com.volosyukivan/.WiFiInputMethod, settings: null}]

Ответы [ 3 ]

2 голосов
/ 24 сентября 2012

Что-то вроде этого должно позволить вам проверить, использует ли пользователь нестандартную клавиатуру.Однако вместо того, чтобы запретить им использовать эту клавиатуру, как насчет предупреждающего сообщения о возможных угрозах безопасности?

public boolean isUsingCustomInputMethod() {
    InputMethodManager imm = (InputMethodManager) mCtx.getSystemService(
        Context.INPUT_METHOD_SERVICE);
    List<InputMethodInfo> mInputMethodProperties = imm.getEnabledInputMethodList();
    final int N = mInputMethodProperties.size();
    for (int i = 0; i < N; i++) {
        InputMethodInfo imi = mInputMethodProperties.get(i);
        if (imi.getId().equals(
            Settings.Secure.getString(mCtx.getContentResolver(),
                    Settings.Secure.DEFAULT_INPUT_METHOD))) {
            if ((imi.getServiceInfo().applicationInfo.flags & 
                ApplicationInfo.FLAG_SYSTEM) == 0) {
                return true;
            }
        }
    }
    return false;
}
2 голосов
/ 17 ноября 2011

Я хочу проверить, используется ли встроенная / аппаратная клавиатура

Вы можете использовать объект Configuration, чтобы проверить, не скрыта ли аппаратная клавиатура устройства. Обычно это подразумевает, что они используют эту клавиатуру, поскольку большинство устройств не показывают IME, когда аппаратная клавиатура доступна. Однако некоторые устройства могут поддерживать оба одновременно, и я не знаю, как внешние клавиатуры (USB, Bluetooth) взаимодействуют с этим значением.

также, если возможно, я хочу отключить сторонние клавиатуры.

К счастью, это невозможно.

есть ли решение этой проблемы?

Нет вопросов, упомянутых в этом пункте в вопросе.

да, они не будут счастливы, но они будут гораздо несчастнее, если вы позволите их защищенным данным испортиться

Если пользователи предпочитают использовать альтернативную клавиатуру, это их выбор в качестве пользователей. Пользователь вполне способен переключать клавиатуры, если они пожелают. Пользователь вполне способен принимать эти решения. Вполне возможно, что альтернативная клавиатура защищена на больше , чем встроенная, из-за устройств, загруженных шпионским ПО с таким фактором, как CarrierIQ . Следовательно, ваше предположение о том, что вы повышаете безопасность, атакуя выбранную пользователем клавиатуру, в корне неверно.

Конечно, вам вообще не нужно поддерживать использование какой-либо клавиатуры, что заставляет пользователей использовать какую-то опцию ввода на экране, которую вы сами придумаете. Это также не является полностью безопасным (например, атаки с использованием кражи), и это может вызвать проблемы с удобством использования для людей, которые по определенным причинам выбрали определенные сторонние клавиатуры (например, слепые пользователи, пользователи с проблемами управления двигателем).

Мне не известно, что существует способ окончательно определить, какой IME встроенного программного обеспечения является, особенно если это зависит от устройства и встроенного программного обеспечения.

1 голос
/ 23 февраля 2012

Я нахожу точное решение

InputMethodManager m = (InputMethodManager) ctx.getSystemService("input_method");
List<InputMethodInfo> a = m.getInputMethodList();
for (InputMethodInfo inputMethodInfo : a) {
        if (inputMethodInfo.getIsDefaultResourceId() == 0) {
            //it is not default
            return false;
        }
}
//it is default
return true;
...