1

Google の音声認識ボタンの動作と同様に、アクティビティを起動し (この場合はユーザーの会話を聞いて)、それをテキストに変換するボタンを 1 つ追加して、Android でカスタム キーボードを作成しようとしています。

カスタム キーボードを作成し (Android 開発者ページのSoftKeyboardデモを使用)、追加したボタンをクリックすると、音声リスニング アクティビティが正常に起動し、結果をログに記録すると正しく表示されます。ただし、次のようなことをしようとすると:

getCurrentInputConnection().commitText(result, 1); //result is a String

アクティビティ内で、結果が得られません。getCurrentInputConnection()ではないことnull、およびエディターのタイプ ( を呼び出すときgetCurrentInputEditorInfo()) がタイプではないことを確認したnullので、テキストを 1 文字ずつ入力するだけでなく、文字列として入力できることがわかります (ここで提案されているように)。

新しく起動したアクティビティ内で入力接続にアクセスできないことが問題である可能性があることを理解していますが、他の場所やここで見つけたようにstartActivityForResultInputMethodServices.

基本的に、新しく起動したアクティビティから表示されるテキストに影響を与える方法や、アクティビティが終了したらテキストを変更するようにリスナーを設定する方法はありますか?

助けてくれてありがとう。

4

1 に答える 1

0

ごぎしゃ、

私も似たような考えでした。アクティビティは、ime が作業しているドキュメントに挿入するテキスト文字列のリストになります。これが私がやった方法です。

マニフェストに、次のアクティビティを追加しました。

    <activity
        android:name="org.this_voice.prakeyboard.KeyboardMacros"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:excludeFromRecents="true"
        android:label="@string/keyboardmacros"
        android:screenOrientation="portrait" >
    </activity> 

次に、ime で、アクティビティを開始するための escape-char コードを取得します。

    } else if (primaryCode == 27) {         
        Intent i = new Intent(this, KeyboardMacros.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.putExtra("MODE","okay");
        startActivity(i);

しかし、onCreate でアクティビティを開始する ime に問題がありました。おそらくAndroidのバグ/機能です。だから私はこれをアクティビティの onCreate に入れました:

    Intent origin = this.getIntent();
    String okay = origin.getStringExtra("MODE");
    if ((okay == null) || (!okay.matches("okay"))){ finish(); }

そのため、27 (Esc) を送信するソフト キーを押したときにのみアクティビティが開始されます。アクティビティが開始され、リストが表示され、ユーザーがテキスト項目を選択すると、アクティビティがそれをクリップボードに読み込みます。

            String macro = dbs.get(result);
            ClipboardManager clipboard = (ClipboardManager) 
                getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(macro);
            finish();

そのため、ime を使用してエディターに戻ります。したがって、ime.startInput には次のものがあります。

    ClipboardManager clipboard = (ClipboardManager) 
        getSystemService(Context.CLIPBOARD_SERVICE);
    if (clipboard.hasText()){
        getCurrentInputConnection().commitText(clipboard.getText(), 1);
        clipboard.setText("");

クリップボードをクリアすることが重要です。Android 8以降と互換性があるように、setTextを使用しています。11 でより手の込んだものに変わりました。ああ、そして onCreate の ime では、クリップボードもクリアします。

    ClipboardManager clipboard = (ClipboardManager) 
        getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText("");

お役に立てれば。実は、1 年前に質問して以来、このことをすでに理解していることを願っています.... 最高の魚。

于 2013-09-24T03:22:27.813 に答える