1

Я пытаюсь реализовать службу проверки орфографии as described here под названием SampleSpellCheckerService, но, похоже, учебник неполный, и исходный код для него, похоже, не доступен.Android - Как получить сеанс из моей службы проверки орфографии?

Я борюсь с тем, как получить сеанс от моего заклинания службы проверки в setSuggestionsFor() метод моей деятельности, как было подчеркнуто здесь:

public class SpellCheckerSettingsActivity extends AppCompatActivity implements SpellCheckerSession.SpellCheckerSessionListener { 

    private static final String LOG_TAG = SpellCheckerSettingsActivity.class.getSimpleName(); 

    private TextView textView = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_spell_checker_settings); 

     final EditText editText = (EditText)findViewById(R.id.editText); 

     textView = (TextView)findViewById(R.id.textView); 

     Button button = (Button)findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       fetchSuggestionsFor(editText.getText().toString()); 
      } 
     }); 

     startService(new Intent(this, SampleSpellCheckerService.class)); 

    } 

    private void fetchSuggestionsFor(String input){ 

     Log.d(LOG_TAG, "fetchSuggestionsFor(\"" + input + "\")"); 

     /*************************************************** 
     * 
     * This line is invalid. What do I replace it with? 
     * 
     ***************************************************/ 
     SpellCheckerSession session = SampleSpellCheckerService.getSession(); 

     TextInfo[] textInfos = new TextInfo[]{ new TextInfo(input) }; 
     int suggestionsLimit = 5; 
     session.getSentenceSuggestions(textInfos, suggestionsLimit); 

    } 

    @Override 
    public void onGetSuggestions(SuggestionsInfo[] results) { 

     Log.d(LOG_TAG, "onGetSuggestions(" + results + ")"); 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       textView.setText("Suggestions obtained (TODO - get from results[])"); 
      } 
     }); 

    } 

    @Override 
    public void onGetSentenceSuggestions(SentenceSuggestionsInfo[] results) { 

     Log.d(LOG_TAG, "onGetSentenceSuggestions(" + results + ")"); 

     if (results != null) { 
      final StringBuffer sb = new StringBuffer(""); 
      for (SentenceSuggestionsInfo result : results) { 
       int n = result.getSuggestionsCount(); 
       for (int i = 0; i < n; i++) { 
        int m = result.getSuggestionsInfoAt(i).getSuggestionsCount(); 

        for (int k = 0; k < m; k++) { 
         sb.append(result.getSuggestionsInfoAt(i).getSuggestionAt(k)) 
           .append("\n"); 
        } 
        sb.append("\n"); 
       } 
      } 

      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        textView.setText(sb.toString()); 
       } 
      }); 
     } 

    } 

    @Override 
    public void onDestroy() { 
     stopService(new Intent(this, SampleSpellCheckerService.class)); 
     super.onDestroy(); 
    } 
} 

Так что правильный способ получить сеанс из SampleSpellCheckerService ?

Для полноты, вот мой заклятье класс проверки службы:

public class SampleSpellCheckerService extends SpellCheckerService { 

    public static final String LOG_TAG = SampleSpellCheckerService.class.getSimpleName(); 

    public SampleSpellCheckerService() { 
     Log.d(LOG_TAG, "SampleSpellCheckerService"); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     Log.d(LOG_TAG, "SampleSpellCheckerService.onCreate"); 
    } 

    @Override 
    public Session createSession() { 

     Log.d(LOG_TAG, "createSession"); 

     return new AndroidSpellCheckerSession(); 
    } 

    private static class AndroidSpellCheckerSession extends SpellCheckerService.Session { 

     @Override 
     public void onCreate() { 

      Log.d(LOG_TAG, "AndroidSpellCheckerSession.onCreate"); 

     } 



     @Override 
     public SentenceSuggestionsInfo[] onGetSentenceSuggestionsMultiple(TextInfo[] textInfos, int suggestionsLimit) { 

      Log.d(LOG_TAG, "onGetSentenceSuggestionsMultiple"); 

      SentenceSuggestionsInfo[] suggestionsInfos = null; 
      //suggestionsInfo = new SuggestionsInfo(); 
      //... // look up suggestions for TextInfo 
      return suggestionsInfos; 
     } 

     @Override 
     public SuggestionsInfo onGetSuggestions(TextInfo textInfo, int suggestionsLimit) { 

      Log.d(LOG_TAG, "onGetSuggestions"); 

      SuggestionsInfo suggestionsInfo = null; 
      //suggestionsInfo = new SuggestionsInfo(); 
      //... // look up suggestions for TextInfo 
      return suggestionsInfo; 
     } 

     @Override 
     public void onCancel() { 
      Log.d(LOG_TAG, "onCancel"); 
     } 


    } 
} 

Вот мой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example"> 

    <permission android:name="android.permission.BIND_TEXT_SERVICE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <service 
      android:name="com.example.SampleSpellCheckerService" 
      android:label="@string/app_name" 
      android:enabled="true" 
      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="com.example.SpellCheckerSettingsActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

А вот мой spellchecker.xml:

<?xml version="1.0" encoding="utf-8"?> 
<spell-checker 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/spellchecker_name" 
    android:settingsActivity="com.example.SpellCheckerSettingsActivity"> 
    <subtype 
     android:label="@string/subtype_generic" 
     android:subtypeLocale="en" /> 
    /> 
    <subtype 
     android:label="@string/subtype_generic" 
     android:subtypeLocale="en_GB" /> 
    /> 
</spell-checker> 

NB - Я тестирую устройство Samsung.

ответ

0

Насколько я могу видеть из документов и некоторых примеров кода, похоже, есть неправильное представление о API проверки орфографии android, что приводит к ошибке.

Насколько я могу судить, вы не можете позвонить в свою службу напрямую, так как целью API является определение орфографической проверки, которую пользователь должен сначала выбрать из системных настроек. В основном вы смешиваете активность настроек (которая отображается для параметров, связанных с сервисом) с тестовой активностью для вашей службы.

Некоторые лучшие учебники написаны в android dev blog и here, некоторые примеры кода для testing client и rudimentary example service можно найти между зеркальными андроид образцов на GitHub.

Что вы получили до сих пор - это пример службы (хотя связанные образцы предоставляют еще один код, чтобы увидеть, как методы могут быть реализованы), у вас есть ваш spellchecker.xml, необходимый для определения локали, и имя проверки орфографии, появляющееся в настройках , у вас уже есть активность настроек (как определено в вашем spellchecker.xml, но не требуется, если вам не нужны какие-либо предпочтения), и у вас есть активность, реализующая ваш SpellCheckerSessionListener (хотя вы назвали его как активность настроек).

Что вам еще нужно сделать, это перейти к settings ->Language & keyboard -> активировать Spell checker и выбрать свою проверку орфографии.

Чтобы получить сеанс с этого спеллчекер вы можете сделать вызов к API с

 final TextServicesManager tsm = (TextServicesManager) getSystemService(
      Context.TEXT_SERVICES_MANAGER_SERVICE); 
    mScs = tsm.newSpellCheckerSession(null, null, this, true); 

, как видно в образцах.

Edit: если вам не нужны какие-либо настройки для вашей службы, вы можете удалить атрибут XML из вашего XML:

android:settingsActivity="com.example.SpellCheckerSettingsActivity" 
+0

Спасибо. Ожидание того, что пользователь будет работать со своими настройками, не является жизнеспособным решением для меня. Можете ли вы порекомендовать мне лучший способ реализовать свою обычную проверку орфографии в SearchView?Требование состоит в том, чтобы, если пользователь неправильно вводит имя продукта (например, * Badli Spelled Product *), им будет предложен фактический продукт (например, мой * Плохо написанный продукт *). Нужно ли мне писать эту функциональность с нуля? (Или, может быть, есть бесплатный, надежный, основанный на веб-интерфейсе API, который я могу использовать?) –

+0

IMHO: весь API проверки орфографии - всего лишь своего рода дочерний шаг. на моем HTC ни клавиатура google, ни htc-смысл не используют пользовательский spellchecker, но оба используют свои собственные - то, и другое приложение, которое хочет использовать ваш spellchecker, должно реализовать определенный интерфейс, делает этот вид бесполезным для пользователя. для конкретного приложения проверки орфографии (как вы этого хотите) я бы отбросил весь API проверки правописания и просто пошел с текстовым комментарием –

+0

Спасибо, но как бы TextWatcher помог проверить проверку орфографии? –

 Смежные вопросы

  • Нет связанных вопросов^_^