9

SearchViewウィジェットを含むアクティビティがあります。onQueryTextSubmitリスナーを使用してテキスト検索の結果を処理していますが、これは正常に機能します。(アクティビティ自体は検索可能アクティビティとして指定されます)。

最近、searchable.xmlファイルに「voiceSearchMode」属性を追加して音声認識を追加することにしました。

searchable.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/search_hint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">
</searchable>

音声認識を追加したとき、音声入力を提供した後にonQueryTextSubmitリスナーが呼び出されません(ただし、editTextボックスを使用してテキスト入力を提供した後も呼び出されます)。音声認識機能は、ACTION_SEARCHインテントを同じアクティビティ(onCreateメソッドで処理できます)に送り返します。音声レコグナイザー(またはアクティビティを再作成する必要のない同様のもの)を使用してonQueryTextSubmitメソッドをアクティブ化する方法はありますか?私が尋ねている理由は、レコグナイザーがインテントを送信する必要がある場合、作成してAPP_DATAを使用して追加のバンドルを送信しますが、機能していないようです。

だから私の質問は:

(1)音声認識検索が有効になっているonQueryTextSubmitリスナーをどのように使用しますか(または使用できますか)?(通常のテキストベースの検索で使用するのと同じ方法)

(2)(1)が不可能な場合、インテントを介して音声認識検索クエリで追加データを渡すにはどうすればよいですか?私は次のようにonSearchRequested()を介してそれを追加しようとしました:

@Override
public boolean onSearchRequested() {
    Bundle appData = new Bundle();
    appData.putInt("testKey", 44);
    this.startSearch(null, true, appData, false);
    return true;
}

しかし、onCreateでこれにアクセスしようとすると、appDataはnullになります。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.overview_list);

    Bundle extras = getIntent().getExtras();
    Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);

    // Receive search intents (from voice recognizer)
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      //doMySearch(query);
    }
}

(また、onSearchRequestedハンドラーを追加するときに、虫眼鏡アイコンを押すと、検索ウィジェットを2回重ねて展開する効果があります。これは、検索可能なxmlを設定したことに加えて、手動で検索を開始しているためだと思います。構成)。

関連するメモとして、同じアクティビティ内でリスナーを使用するよりもインテントを送信することの利点は何ですか?SearchableActivityが別のアクティビティである場合は、それにインテントを送信することをお勧めします。しかし、SearchableActivityが検索ウィジェットを含む同じアクティビティである場合、インテントを使用する意味は何ですか?

コメントや提案をいただければ幸いです。追加の詳細を提供する必要がある場合はお知らせください。

4

1 に答える 1

13

(1) 大規模なデバッグを通じてわかる限り、音声認識ボタンから検索クエリを入力しても、onQueryTextSubmit が呼び出されることはありません。ただし、簡単な回避策があります。以下を参照してください。

(2) アクティビティ起動モードを「singleTop」に設定することで問題を解決しました。これは、音声検索後にアクティビティを再作成する代わりに、新しい ACTION_SEARCH インテントが onNewIntent() のアクティビティの既存のインスタンス内で処理されることを意味します。ハンドラ。その結果、既存のアクティビティのすべてのプライベート メンバーにアクセスでき、検索インテントを変更してバンドルを介してデータを渡す必要はありません。

AndroidManifest.xml : 検索可能なアクティビティに launchmode=singleTop 属性を追加します。

<activity
    android:name=".SearchableActivity"
    android:label="@string/app_name"
    android:uiOptions="splitActionBarWhenNarrow"
    android:launchMode="singleTop">

    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

SearchableActivityに onNewIntent() メソッドを追加します。

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);      
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        // Gets the search query from the voice recognizer intent
        String query = intent.getStringExtra(SearchManager.QUERY);

        // Set the search box text to the received query and submit the search
        mSearchView.setQuery(query, true);
    }
}

これは基本的に、音声認識クエリを受け取り、それをテキスト ボックスに入れ、通常どおり onQueryTextSubmit によって処理されるテキスト ボックス検索を送信します。

于 2013-03-15T22:42:36.660 に答える