有没有办法以编程方式确定 android 设备是否具有内置拼写检查器?

Is there any way to programmatically determine whether android device has builtin spellchecker?

我在 couple of places 中读到,三星设备上 EditText 的拼写检查无法打开...所以这一定是真的,对吧?如果是这样,可能还有其他设备也无法进行拼写检查,例如我妻子刚从 Verizon 购买的 LG VK700 平板电脑(不要问)。

有没有办法以编程方式检测设备是否可以拼写检查?我想要一个选项让用户打开或关闭它,但如果不能'不要开机。然后我希望该选项变灰。

(谷歌搜索 programmatically determine whether android device can spellcheck 出现了 this,这看起来很有趣,但我不能为大多数用户可能会关闭或无论如何忽略,因为标记的单词只会出现在与用户 "word pattern"(例如,p?tt??n)匹配的单词列表中以解决单词拼图。)

根据 Android Spell Checker Framework documentation,拼写检查服务应在应用的清单中公开为具有特定意图过滤器和元数据标记的服务:

<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>

如此合理,我们应该能够通过尝试解析匹配的意图来检测是否安装了任何此类服务。

我没有三星设备来测试 "not found" 案例,但我认为这应该可行:

TextView tv = new TextView(this);
PackageManager pm = getPackageManager();
Intent spell = new Intent(SpellCheckerService.SERVICE_INTERFACE);
ResolveInfo info = pm.resolveService(spell, 0);
if (info == null) {
    tv.setText("no spell checker found");
} else {
    tv.setText("found spell checker " + info.serviceInfo.name + " in package " + info.serviceInfo.packageName);
}

无论我是否在“设置”中启用或禁用拼写检查,我的 Moto G (2013) 都会显示:

这是与原版 AOSP 键盘相同的包。我假设有问题的三星手机已经用自己的键盘替换了那个包,而不替换拼写检查服务?

请注意,即使您检测到匹配服务的存在,激活它的实际设置也可能因设备而异...

要查看 IF 设备具有 内置 拼写检查器,请使用此 xml:

<spell-checker xmlns:android="http://schemas.android.com/apk/res/android"
               android:label="spellchecker_name"
               android:settingsActivity="com.example.SpellCheckerSettingsActivity">
</spell-checker>

(我想要求实际上包括要进行拼写检查的文件,因为这不是我的目标,所以在结束前从上面提供的 link 的 xml 中删除以下行上面的标签有意义:

<subtype
    android:label="@string/subtype_generic"
    android:subtypeLocale="en”
/>
<subtype
        android:label="@string/subtype_generic"
android:subtypeLocale="fr”
/>

要提供拼写检查器,还有很多工作要做。我:不感兴趣。 )

这里是 Java 代码,用于管理 Preferences 是否使 Spellchecker 选项变灰,具体取决于用户的设备是否内置。

SettingsActivity.java:

public class SettingsActivity extends Activity
{
  public static boolean blnSpellcheckerPresent; // slight hack

  @Override protected void onCreate(Bundle _savedInstanceState) {
    super.onCreate(_savedInstanceState);
    // Inserted Snild's code here:    
    PackageManager pm = getPackageManager();
    Intent spell = new Intent(SpellCheckerService.SERVICE_INTERFACE);
    ResolveInfo info = pm.resolveService(spell, 0);
    blnSpellcheckerPresent = (info != null);
    // end insert
    setContentView(R.layout.activity_settings);
  }
} // end class SettingsActivity

SettingsFragment.java:

public class SettingsFragment extends PreferenceFragment
{
  @Override public void onCreate(Bundle _savedInstanceState){
    super.   onCreate(_savedInstanceState);

    addPreferencesFromResource(R.xml.preferences);

    Preference spellchecker = getPreferenceManager().findPreference("pref_spell_check");

    spellchecker.setEnabled(SettingsActivity.blnSpellcheckerPresent);

  }
} // end class SettingsFragment

这里是 preferences.xml 的补充:

<CheckBoxPreference
    android:key="pref_spell_check"
    android:defaultValue="false"
    android:persistent="true"
    android:enabled="false"
    android:title="Spell checker"
    android:summary="Allow your phone's built-in spell checker to underline questionable matches"
    />