如何检查是否使用本地/硬件键盘?

问题描述:

我想检查是否使用本机/硬件键盘,并且如果可能我想禁用第三方键盘。如何检查是否使用本地/硬件键盘?

我的目标很简单,我只使用了原生的Android软键盘在我的编辑框中输入值,并没有其他的键盘应该能够这样

感谢

编辑

我知道做我想做的事情并不是个好主意,我知道android的基本思想是有意图,活动和服务的人知道根据意图过滤处理某些类型的意图。但是,在每个规则中都存在一个例外,特别是当我们谈论安全性时。

我想禁用所有的第三方键盘,如果这是不可能做到这一点的API或什么...有没有解决这个问题的任何解决方法?

编辑

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}] 
+0

为什么? “原生”是指您购买设备时安装的设备吗?因为每个设备可能会有所不同。你是否试图确保用户使用的键盘不会跟踪密码? – FunkTheMonk

+0

是的我的意思是与设备一起安装的,我猜'原生'它不是正确的表达式,tnx的更正 – Lukap

+0

也许你可以得到'Default Input Method'并比较结果,也许你试试看在这里http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html – xDragonZ

我要检查,如果本机/硬件键盘是用来

可以使用Configuration对象,以确定设备的硬件键盘被隐藏。通常,这意味着他们正在使用该键盘,因为大多数设备在硬件键盘可用时不显示IME。但是,某些设备可能同时支持,我不知道外部键盘(USB,蓝牙)如何与此值进行交互。

如果可能我还想禁用第三方键盘。

幸运的是,这是不可能的。

有没有解决这个问题的办法?

这个问题中没有引用这个问题。

是该会不高兴,但如果你让他们安全的数据是,他们会更不开心腐败

如果用户选择使用替代键盘,那是他们的选择,因为用户。如果用户愿意,用户可以完全切换键盘。用户完全有能力做出这些决定。由于装有来自因素的间谍软件的设备(如CarrierIQ),所以替代键盘完全可能是更多比内置安全更安全。因此,你认为通过攻击用户的键盘选择来提高安全性的假设从根本上是有缺陷的。

当然,您不必支持使用任何键盘,迫使用户使用某种您自己设计的屏幕上输入选项。这不是完全安全的(例如,劫掠攻击),并且由于特定原因(例如,盲人用户,具有电机控制问题的用户)选择某些第三方键盘的人可能会导致可用性问题。

我不知道有一种方法可以明确确定固件自身的IME,特别是因为这取决于设备和固件。

我找到精确的解决方案

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; 

像这样的东西应该让你检查,如果用户使用的是非标准键盘。但是,不是阻止他们使用此键盘,而是如何提供有关可能的安全风险的有用警告消息?

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; 
} 
+0

这工作..但由于某种原因Swype被检测为标准键盘。不是我想要的......但那并不意味着它是错误的。 –