有没有办法以编程方式确定Android设备是否内置了拼写检查程序?

时间:2015-09-22 19:27:15

标签: android spell-checking

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

有没有办法以编程方式检测设备是否可以进行拼写检查?我想要一个用户可以打开或关闭它的选项,但是如果无法启用则不行。我希望这个选项变灰了。

(谷歌搜索programmatically determine whether android device can spellcheck出现this,这看起来很有趣,但我无法证明大部分用户可能会关闭或忽略的工作(学习速度慢,这里)因为标记的单词只出现在与用户的“单词模式”匹配的单词列表中(例如,p?tt??n),用于解决单词拼图。)

3 个答案:

答案 0 :(得分:4)

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

合理地说,我们应该能够通过尝试解决匹配的意图来检测是否安装了这样的服务。

我没有三星设备来测试“未找到”的情况,但我认为这应该有效:

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)都说:found spell checker com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService in package com.android.inputmethod.latin

这与香草AOSP键盘相同。我认为有问题的三星手机用自己的键盘替换了这个包,而没有更换拼写检查服务?

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

答案 1 :(得分:1)

此处有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"
    />

答案 2 :(得分:0)

要查看 IF 设备有内置拼写检查程序,请使用此xml

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

(我想这些要求包括实际有文件进行拼写检查,因为那不是我的目标,在上面的结束标记之前删除上面提供的链接上xml的以下行有道理:

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

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