4

ネイティブ/ハードウェア キーボードが使用されているかどうかを確認し、可能であればサード パーティのキーボードを無効にしたいと考えています。

私の目標は単純です。編集ボックスに値を入力するためにネイティブの Android ソフト キーボードのみを使用します。他のキーボードではこれを行うことはできません。

ありがとう

編集

私がやろうとしていることをするのは良い考えではないことを知っています.Androidの基本的な考え方は、インテントフィルターに従っていくつかのタイプのインテントを処理することを知っているインテントとアクティビティとサービスを持つことであることを知っています. ただし、これはすべてのルールに例外があり、特にセキュリティについて話す場合はそうです。

サードパーティのキーボードをすべて無効にしたいのですが、API などで無効にできない場合、この問題の回避策はありますか?

編集

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

これは、現在有効になっている入力方法 (キーボード) を返しますが、「システム キーボード」のようなものが必要ですが、そのようなフラグは表示されません :-(.

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

考えられる解決策の 1 つは、検索しているキーボードとして list[0] を使用することですが、注文を中継したくありません (ただし、注文が常にインデックス 0 のキーボードがインストール時に付属するものであることが保証されている場合を除きます)。電話)

これはリストの値です

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

3 に答える 3

3

ネイティブ/ハードウェアキーボードが使用されているかどうかを確認したい

オブジェクトを使用してConfiguration、デバイスのハードウェアキーボードが非表示になっているかどうかを確認できます。ハードウェアキーボードが使用可能な場合、ほとんどのデバイスはIMEを表示しないため、通常、これはそのキーボードを使用していることを意味します。ただし、一部のデバイスは両方を同時にサポートする可能性があり、外部キーボード(USB、Bluetooth)がこの値とどのように相互作用するかわかりません。

また、可能であれば、サードパーティのキーボードを無効にします。

幸いなことに、これは不可能です。

この問題の回避策はありますか?

質問のこの時点まで引用された問題はありません。

はい、幸せではありませんが、安全なデータを破損させた場合、彼らははるかに不幸になります

ユーザーが別のキーボードを使用することを選択した場合、それがユーザーとしての選択です。ユーザーは、必要に応じてキーボードを完全に切り替えることができます。ユーザーはこれらの決定を完全に行うことができます。CarrierIQなどの要素からスパイウェアがロードされたデバイスが原因で、代替キーボードが組み込みキーボードよりも安全である可能性は十分にあります。したがって、ユーザーが選択したキーボードを攻撃することでセキュリティを向上させているというあなたの仮定には、根本的な欠陥があります。

もちろん、キーボードの使用をサポートする必要はまったくありません。ユーザーは、自分で考案したある種の画面上の入力オプションを使用する必要があります。これも完全に安全ではなく(たとえば、タップジャック攻撃)、特定の理由で特定のサードパーティ製キーボードを選択したユーザー(たとえば、目の不自由なユーザー、モーターコントロールの問題があるユーザー)のユーザビリティの問題を引き起こす可能性があります。

特にこれはデバイスやファームウェアによって異なるため、ファームウェア自体のIMEが何であるかを明確に判断する方法があることを私は知りません。

于 2011-11-17T12:08:36.463 に答える
1

このようなもので、ユーザーが非標準のキーボードを使用しているかどうかを確認できます。ただし、このキーボードの使用を禁止するのではなく、潜在的なセキュリティ リスクに関する有用な警告メッセージはどうでしょうか?

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;
}
于 2012-09-23T23:40:52.073 に答える
1

私は正確な解決策を見つけます

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;
于 2012-02-23T15:39:10.713 に答える