スペルチェック フレームワーク

Android プラットフォームには、アプリ内にスペルチェック機能を実装したり、スペルチェック機能へのアクセスを可能にしたりするスペルチェック フレームワークが用意されています。このフレームワークは、Android プラットフォームが提供する Text Service API の 1 つです。

アプリ内でこのフレームワークを使用するには、スペルチェック session オブジェクトを生成する特別なタイプの Android サービスを作成します。このセッション オブジェクトは、入力されたテキストを基に、スペルチェック機能が生成したスペル候補を返します。

スペルチェックのライフサイクル

スペルチェック サービスのライフサイクルを以下の図に示します。

図 1: スペルチェック サービスのライフサイクル

スペルチェックを開始する場合、アプリがスペルチェック サービス実装を起動します。アクティビティや個々の UI 要素など、アプリ内のクライアントは、スペルチェック サービスに対してスペルチェック セッションをリクエストし、そのセッションを使用してテキストの候補を取得します。クライアントは、処理を終了すると、スペルチェック セッションを閉じます。アプリは、必要に応じて、いつでもスペルチェック サービスを終了できます。

スペルチェック サービスを実装する

アプリ内でスペルチェック フレームワークを使用するには、セッション オブジェクト定義を格納するスペルチェック サービス コンポーネントを追加します。また、設定を制御するオプション アクティビティをアプリに追加することもできます。なお、スペルチェック サービスを記述する XML メタデータ ファイルを追加して、マニフェスト ファイルに適切な要素を追加する必要があります。

スペルチェック クラス

以下のクラスを使用してサービス オブジェクトとセッション オブジェクトを定義します。

SpellCheckerService のサブクラス
SpellCheckerService は、Service クラスとスペルチェック フレームワーク インターフェースの両方を実装します。このサブクラス内で、次のメソッドを実装する必要があります。
createSession()
スペルチェックを実行するクライアントに対して SpellCheckerService.Session オブジェクトを返すファクトリー メソッド。

このクラスの実装方法については、Spell Checker Service サンプルアプリをご覧ください。

SpellCheckerService.Session の実装
スペルチェック サービスがクライアントに提供するオブジェクト。このオブジェクトにより、クライアントは、テキストをスペルチェック サービスに渡し、候補を受け取ることができます。このクラス内で、次のメソッドを実装する必要があります。
onCreate()
createSession() に応じてシステムによって呼び出されます。このメソッドでは、現在の言語 / 地域などに基づいて、SpellCheckerService.Session オブジェクトを初期化できます。
onGetSentenceSuggestionsMultiple()
実際のスペルチェックを行います。このメソッドは、渡された文に対する候補を格納する SentenceSuggestionsInfo の配列を返します。

必要に応じて、スペルチェックのキャンセル リクエストを処理する onCancel() や、単語候補リクエストを処理する onGetSuggestions()、複数の単語候補リクエストを一括処理する onGetSuggestionsMultiple() を実装できます。

このクラスの実装方法については、Spell Checker Client サンプルアプリをご覧ください。

注: スペルチェック機能は、すべての側面を非同期かつスレッドセーフな方法で実装する必要があります。スペルチェックは、異なるコア上で稼働している異なるスレッドによって同時に呼び出される可能性があります。SpellCheckerServiceSpellCheckerService.Session は、この点について自動的に処理します。

スペルチェックのマニフェストとメタデータ

コードに加えて、スペルチェック用の適切なマニフェスト ファイルとメタデータ ファイルを指定する必要があります。

マニフェスト ファイルは、アプリ、サービス、アクティビティを定義して設定を制御します。以下のスニペットをご覧ください。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.samplespellcheckerservice" >
        <application
            android:label="@string/app_name" >
            <service
                android:label="@string/app_name"
                android:name=".SampleSpellCheckerService"
                android:permission="android.permission.BIND_TEXT_SERVICE" >
                <intent-filter >
                    <action android:name="android.service.textservice.SpellCheckerService" />
                </intent-filter>

                <meta-data
                    android:name="android.view.textservice.scs"
                    android:resource="@xml/spellchecker" />
            </service>

            <activity
                android:label="@string/sample_settings"
                android:name="SpellCheckerSettingsActivity" >
                <intent-filter >
                    <action android:name="android.intent.action.MAIN" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    

システムだけがスペルチェック サービスにバインドするように、このサービスを使用するコンポーネントは、BIND_TEXT_SERVICE パーミッションをリクエストする必要があります。サービスの定義は、spellchecker.xml メタデータ ファイルも指定します。この点については、次のセクションで説明します。

spellchecker.xml メタデータ ファイルには、次の XML が含まれます。

    <spell-checker xmlns:android="http://schemas.android.com/apk/res/android"
            android:label="@string/spellchecker_name"
            android:settingsActivity="com.example.SpellCheckerSettingsActivity">
        <subtype
                android:label="@string/subtype_generic"
                android:subtypeLocale="en”
        />
        <subtype
                android:label="@string/subtype_generic"
                android:subtypeLocale="fr”
        />
    </spell-checker>
    

このメタデータは、スペルチェック機能が設定を制御する際に使用するアクティビティを指定します。また、スペルチェックのサブタイプも定義します。この場合、サブタイプは、スペルチェック機能が処理可能な言語 / 地域を定義します。

クライアントからスペルチェック サービスにアクセスする

TextView ビューを使用するアプリの場合、TextView が自動的にスペルチェック機能を使用するため、自動的にスペルチェック機能のメリットを享受します。この点については、次のスクリーンショットをご覧ください。


図 2: TextView 内のスペルチェック

他のケースの場合でも、スペルチェック サービスを直接使用することができます。スペルチェック サービスを使用するための制御のフローを次の図に示します。

図 3: スペルチェック サービスとのインタラクション

スペルチェック サービスの使用方法については、Spell Checker Client サンプルアプリをご覧ください。また、Android オープンソース プロジェクトの LatinIME インプット メソッド エディタにも、スペルチェック機能の例が含まれています。