有没有办法通过程序确定Android设备是否具有内置拼写检查器?

4
我曾在一些 地方 读到,三星设备上的EditText无法开启拼写检查...那肯定是真的了,对吧?如果是这样,可能还有其他设备也不能进行拼写检查,比如我妻子刚从Verizon购买的LG VK700平板电脑(别问我为什么)。

有没有办法通过编程来检测设备是否可以进行拼写检查?我想提供一个选项让用户打开或关闭拼写检查,但如果不能开启,我就不想提供这个选项。我想把这个选项灰掉。

(Googling programmatically determine whether android device can spellcheck turned up this,这看起来很有趣,但我不能为了大多数用户可能会关闭或忽略的东西而做出很多工作(因为标记的单词只会出现在与用户“单词模式”(例如p?tt??n)匹配的单词列表中,用于解决单词拼图问题。))
3个回答

4
根据Android拼写检查框架文档,拼写检查服务应在应用程序的清单中公开为服务,并具有特定的意图过滤器和元数据标记:
<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键盘相同。我想有问题的三星手机可能已经用他们自己的键盘替换了该包,但没有替换拼写检查服务?请注意,即使您检测到匹配的服务存在,激活它的实际设置也可能因设备而异…

谢谢,但需要有一个名为spellchecker.xmlxml文件,我将尝试组合它。至少这是Gradle所说的:Error:(36, 39) No resource found that matches the given name (at 'resource' with value '@xml/spellchecker')。或者,如果您已经有了它,请进行修订。 - DSlomer64
你提供的链接中的 xml 文件存在错误,我不知道如何修复: <spell-checker xmlns:android="http://schemas.android.com/apk/res/android" android:label="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> - DSlomer64
那个XML文件是拼写检查器服务(提供拼写检查功能)必须定义的内容。它是解释我随后发布的Java代码为什么/如何工作的一部分(通过检测系统上是否安装了此类服务来检测是否有任何应用程序)。 - Snild Dolkow
再次强调,那个XML文件是为某人提供拼写检查器而准备的;它并不适用于包含在您的应用程序中。我将其包含在帖子中,作为背景信息,解释resolveService()函数如何检测其存在。我认为我在帖子中已经表述得很清楚了,但也许您只是复制粘贴而没有阅读我解释的其他部分? - Snild Dolkow
你读完我写的所有内容了吗?显然,我不仅仅是剪切和粘贴。无论链接中代码的意图如何,也许是出于偶然的原因,我提供的四行“xml”确实正确地告诉了我的两个设备中哪一个具有内置拼写检查器(Verizon Ellipsis平板电脑,无论拼写检查是否打开),哪一个没有(LG VK700)。为什么不剪切和粘贴我的“xml”和“Java”代码“boolean blnSpellcheckerPresent = (pm.resolveService(new Intent(SpellCheckerService.SERVICE_INTERFACE), 0)!= null)”来查看它是否正确地告诉您的设备是否具有内置拼写检查器呢? - DSlomer64
显示剩余3条评论

1
这是管理“首选项”以灰掉“拼写检查器”选项或不灰掉的Java代码,具体取决于用户设备是否内置它。

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

0

要查看设备是否具有内置的拼写检查器,请使用此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”
/>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接