【问题标题】:Is there any way to programmatically determine whether android device has builtin spellchecker?有没有办法以编程方式确定 android 设备是否具有内置拼写检查器?
【发布时间】:2015-12-19 22:13:44
【问题描述】:

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

有没有办法以编程方式检测设备是否可以进行拼写检查?我希望用户可以选择打开或关闭它,但如果不能打开它就不行。然后我想将选项设为灰色。

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

【问题讨论】:

    标签: android spell-checking


    【解决方案1】:

    根据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) 都会说:

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

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

    【讨论】:

    • --谢谢,但需要有一个 xml 文件 spellchecker.xml ,我将看看我是否可以将它们放在一起。至少Gradle 是这么说的:Error:(36, 39) No resource found that matches the given name (at 'resource' with value '@xml/spellchecker'). 或者,如果你已经有了,请修改。
    • 在您的链接中找到的xml 文件存在我不知道如何修复的错误:&lt;spell-checker xmlns:android="http://schemas.android.com/apk/res/android" android:label="spellchecker_name" android:settingsActivity="com.example.SpellCheckerSettingsActivity"&gt; &lt;subtype android:label="@string/subtype_generic" &lt;&lt;&lt; RIGHT HERE AT THE @ IT SAYS "TAG START NOT CLOSED" android:subtypeLocale="en” /&gt; &lt;subtype android:label="@string/subtype_generic" android:subtypeLocale="fr” /&gt; &lt;/spell-checker&gt;
    • 但如果我同时删除了subtypes,那么您的Java 代码会告诉我我所知道的:LG 没有拼写检查器,而Verizon 有。非常感谢!!
    • 那个 xml 是拼写检查器 service(提供拼写检查功能)必须定义的。这是我随后发布的 Java 代码为何/如何工作的解释的一部分(通过检测系统上是否安装了此类服务的任何应用程序)。
    • 但是链接处的xml 有错误。然后怎样呢?不能忽视; Gradle 抱怨。任何;我的另一个答案中的四行似乎检测正确。
    【解决方案2】:

    这是用于管理PreferencesJava 代码,以使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"
        />
    

    【讨论】:

      【解决方案3】:

      要查看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”
      />
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        相关资源
        最近更新 更多