(非常に適当に)Android ICS SpellCheckerServiceを使ってみる
Android4.xから使える(んだと思われる)SpellCheckerServiceを使って、独自のスペルチェックを行うサービスを作りそれをアプリから利用してみる
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="sample.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
<service 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:name=".SampleActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SampleSpellCheckerPreferenceActivity" android:label="@string/app_name" />
</application>
</manifest>
な感じで。SpellCheckerService固有の設定画面というPreferenceActivityを持つこともできます。それが最後のSampleSpellCheckerPreferenceActivityなところになります。今回はこいつに関しては省略します。で独自のSpellCheckerServiceを作るには設定ファイルが別途で必要(上で言うとres/xml/spellchecker.xml)になるので作成
res/xml/spellchecker.xml
<?xml version="1.0" ?>
<spell-checker
xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/spellchecker_name"
android:settingsActivity="sample.test.SampleSpellCheckerPreferenceActivity">
<subtype android:label="@string/subtype_generic" android:subtypeLocale="en" />
</spell-checker>
まぁ詳しくはAndroidのドキュメント読んでください。でここからJavaソースを作る。必要なのはSampleActivity.javaとSampleSpellCheckerService.javaだけ
SampleActivity.java
package sample.test;
import java.util.Locale;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.textservice.SpellCheckerSession;
import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener;
import android.view.textservice.SuggestionsInfo;
import android.view.textservice.TextInfo;
import android.view.textservice.TextServicesManager;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
public class SampleActivity extends Activity {
private ArrayAdapter<string> adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initAdapter();
((ListView)findViewById(R.id.listView)).setAdapter(adapter);
}
@Override
protected void onResume() {
super.onResume();
final EditText view = (EditText)LayoutInflater.from(this).inflate(R.layout.dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String text = view.getText().toString();
if (!TextUtils.isEmpty(text)) {
TextServicesManager manager = (TextServicesManager)getSystemService(TEXT_SERVICES_MANAGER_SERVICE);
SpellCheckerSessionListener listener = new SpellCheckerSessionListener() {
public void onGetSuggestions(SuggestionsInfo[] results) {
if (adapter == null) {
initAdapter();
}
for(SuggestionsInfo result : results) {
if(result.getSuggestionsCount() <= 0) {
continue;
}
for(int i = 0;i < result.getSuggestionsCount();i++) {
String suggest = result.getSuggestionAt(i);
adapter.add(suggest);
}
}
}
};
SpellCheckerSession session = manager.newSpellCheckerSession(null, Locale.ENGLISH, listener, false);
session.getSuggestions(new TextInfo(text), 10);
}
}
});
builder.create().show();
}
private void initAdapter() {
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
}
}
SampleSpellCheckerService.java
package sample.test;
import android.service.textservice.SpellCheckerService;
public class SampleSpellCheckerService extends SpellCheckerService {
private static final String TAG = "SampleSpellCheckerService";
private static final String[] names = { "hoge", "fuga", "foobar" };
@Override
public Session createSession() {
Log.v(TAG,"createSession");
return new SampleSpellCheckerSession();
}
private class SampleSpellCheckerSession extends Session {
private static final String TAG = "SampleSpellCheckerSession";
@Override
public void onCreate() {
Log.v(TAG, "onCreate");
}
@Override
public SuggestionsInfo onGetSuggestions(TextInfo textInfo, int suggestionsLimit) {
Log.v(TAG, "onGetSuggestions");
String text = textInfo.getText();
int minDistance = -1;
String minDistanceString = null;
for (String name : names) {
// ここで入力されたテキストと辞書を照らし合わせて候補を選定する
}
return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY, new String[]{ minDistanceString });
}
}
}
結局な所これ何に使えるのかって思う所なんだけど、物にもよるとは思いますがSpellCheckって言ってるけど要はサジェストサービス的なを作れるんだと思います