Introduzione al correttore ortografico di Android

introduzione

Se stai creando un IME personalizzato (Input Method Editor) o un'app di elaborazione del linguaggio, puoi utilizzare il correttore ortografico di Android per aggiungere rapidamente funzionalità di controllo ortografico alla tua app senza dover affrontare attività di basso livello, come il mantenimento di elenchi di parole o determinare le distanze di Damerau-Levenshtein tra le parole.

Il framework può anche essere utilizzato per creare un correttore ortografico personalizzato (ad esempio per una nuova lingua o per un dominio specifico) che altre app possono utilizzare.

Questo tutorial mostra in primo luogo come utilizzare il framework per interagire con il correttore ortografico predefinito di Android, quindi passa a comprendere le basi per lo sviluppo di un correttore ortografico personalizzato.

1. Interagire con un correttore ortografico

Passaggio 1: creare un Attività

Prima di immergerci nel framework, creiamo prima un Attività in grado di visualizzare i risultati dei controlli ortografici.

Crea una nuova classe Java chiamata SpellingsClient quello si estende Attività. Questa classe deve anche implementare il SpellCheckerSession.SpellCheckerSessionListener interfaccia per interagire con i servizi di controllo ortografico di Android. In Android Studio, puoi premere Alt + Ins generare automaticamente stub vuoti per i metodi dell'interfaccia.

Come questo Attività ne avrà solo uno TextView nel suo layout, non è necessario creare un XML di layout per questo. Ignora il onCreate metodo per inizializzare il TextView e passalo al setContentView metodo in modo che occupi l'intero schermo.

A questo punto, la tua classe dovrebbe assomigliare a questa:

public class SpellingsClient estende Activity implements SpellCheckerSession.SpellCheckerSessionListener suggerimenti TextView privati; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); suggerimenti = nuovo TextView (questo); setContentView (suggerimenti);  @Override public void onGetSuggestions (SuggestionsInfo [] results)  @Override public void onGetSentenceSuggestions (SentenceSuggestionsInfo [] results) 

Passaggio 2: inviare i dati al correttore ortografico predefinito

Passiamo ora a una frase contenente più parole digitate erroneamente al correttore ortografico predefinito di Android. Crea un metodo chiamato fetchSuggestionsFor che accetta un Stringa come parametro.

private void fetchSuggestionsFor (input per stringhe) 

Perché il correttore ortografico Servizio è una parte del Servizi di testo API, devi usare il getSystemService metodo per recuperare un'istanza di TextServicesManager. Puoi quindi chiamare il newSpellCheckerSession metodo per creare un nuovo sessione, che può essere utilizzato per inviare dati al correttore ortografico. Aggiungi il seguente codice al metodo:

TextServicesManager tsm = (TextServicesManager) getSystemService (TEXT_SERVICES_MANAGER_SERVICE); SpellCheckerSession session = tsm.newSpellCheckerSession (null, Locale.ENGLISH, this, true);

Assicurati che il località tu passi newSpellCheckerSession corrisponde alla lingua della frase inserita.

Ora che il sessione è pronto, puoi chiamare getSentenceSuggestions per ottenere suggerimenti di ortografia per una o più frasi.

Il getSentenceSuggestions il metodo richiede due parametri. Il primo parametro è un array di TextInfo oggetti. Tu usi il costruttore del TextInfo classe per convertire a Stringa in un TextInfo oggetto. Il secondo parametro è un int che specifica il numero di suggerimenti che dovrebbero essere generati. Per questo esempio, impostiamolo su 5.

Aggiungi il seguente codice al metodo:

session.getSentenceSuggestions (new TextInfo [] new TextInfo (input), 5);

Infine, chiama fetchSuggestionsFor nel onCreate metodo del Attività.

// Passando una frase che contiene due // parole errate fetchSuggestionsFor ("Peter livs in Brlin");

Si noti che il getSentenceSuggestions il metodo è stato introdotto nel livello API 16. Le versioni precedenti dell'API utilizzavano, ora deprecate, getSuggestions metodo.

Passaggio 3: Visualizza i suggerimenti

Il getSentenceSuggestions il metodo interagisce con il correttore ortografico in modo asincrono. Quando i suggerimenti sono stati generati, il onGetSentenceSuggestions il metodo è chiamato.

I suggerimenti per ogni frase introduttiva sono disponibili separatamente SentenceSuggestionsInfo oggetto. Ogni SentenceSuggestionsInfo l'oggetto contiene più SuggestionsInfo oggetti, di solito per ogni parola della frase. Ogni SuggestionsInfo oggetto contiene i suggerimenti effettivi per una parola sotto forma di Stringa oggetti.

Per questo esempio, analizziamo semplicemente tutti i suggerimenti e li aggiungiamo a StringBuffer. Uso getSuggestionsCount per determinare il numero di suggerimenti disponibili e getSuggestionInfoAt per ottenere un riferimento a un particolare SuggestionInfo.

Aggiungi il seguente codice al onGetSentenceSuggestions metodo:

final StringBuffer sb = new StringBuffer (""); for (SentenceSuggestionsInfo result: results) int n = result.getSuggestionsCount (); per (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");  

Ora puoi usare il TextView'S setText metodo per rendere il contenuto del StringBuffer. Tuttavia, non è possibile chiamare direttamente il metodo, perché onGetSentenceSuggestions gira sul proprio thread. Il tentativo di apportare modifiche nell'interfaccia utente da un thread non UI porterà a un'eccezione di runtime. Pertanto, assicurati di chiamare il setText metodo dall'interno del runOnUiThread metodo.

runOnUiThread (new Runnable () @Override public void run () suggestions.setText (sb.toString ()););

Se esegui la tua app ora, l'output sarà simile a questo:

Come puoi vedere, la nostra app sta attualmente mostrando suggerimenti per tutte le parole della frase, anche per quelle con la corretta ortografia.

Per mostrare solo suggerimenti per le parole errate, dovremo guardare le bandiere associate a ciascuna SuggestionsInfo oggetto. UN SuggestionsInfo oggetto per una parola errata ha il RESULT_ATTR_LOOKS_LIKE_TYPO bandiera impostata. Pertanto, dobbiamo aggiungere codice da ignorare SuggestionsInfo oggetti in cui questo flag non è impostato.

Aggiungi il seguente codice al onGetSentenceSuggestions metodo prima che inizi il ciclo più interno:

if ((result.getSuggestionsInfoAt (i) .getSuggestionsAttributes () & SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO)! = SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) continua;

Esegui nuovamente l'app per vedere l'output modificato.

2. Creazione di un correttore ortografico personalizzato

Ora che sai come interagire con il correttore ortografico di default, passiamo alla creazione di un correttore ortografico personalizzato.

Passaggio 1: creare a Servizio

Crea una nuova classe Java chiamata SpellingService. Affinché una classe venga trattata come un correttore ortografico dal sistema Android, è necessario estenderla SpellCheckerService classe e scavalcare il createSession metodo.

Aggiungere il seguente codice a SpellingService.java:

public class SpellingService estende SpellCheckerService @Override public Session createSession () 

Passaggio 2: creare una sessione

Tutta la logica di controllo ortografico personalizzata risiede nel Sessione. Crea una nuova classe chiamata MySpellingSession quello si estende Sessione. Puoi crearlo come sottoclasse di SpellingService.

Il Sessione la classe è una classe astratta. Dopo aver scavalcato tutti i metodi astratti, la tua classe dovrebbe assomigliare a questa:

classe MySpellingSession estende Session @Override public void onCreate ()  @Override public SuggestionsInfo onGetSuggestions (TextInfo textInfo, int suggestionsLimit)  @Override public SentenceSuggestionsInfo [] onGetSentenceSuggestionsMultiple (TextInfo [] textInfos, int suggestionsLimit) 

Per questo tutorial, creiamo un correttore ortografico molto semplice che abbia le seguenti caratteristiche:

  • Tratta la parola "Peter" come un errore di battitura.
  • Restituisce cinque ortografie alternative per la parola "Peter".

Il codice per implementare queste funzionalità può essere aggiunto al onGetSuggestions metodo, perché dovrebbe gestire singole parole (nella forma di a TextInfo oggetti).

Estrai la parola usando il getText metodo e verificare se è uguale a "Peter". Se lo è, aggiungi i suggerimenti appropriati a un array di Stringa oggetti. Se non lo è, mantieni l'array vuoto.

Infine, crea e restituisci un nuovo SuggestionsInfo oggetto che contiene la matrice di suggerimenti insieme alla bandiera RESULT_ATTR_LOOKS_LIKE_TYPO. Il codice effettivo potrebbe assomigliare a questo:

Parola stringa = textInfo.getText (); Suggerimenti per le stringhe [] = null; if (word.equals ("Peter")) suggestions = new String [] "Pedro", "Pietro", "Petar", "Pierre", "Petrus";  else suggestions = new String [] ;  SuggerimentiInfo suggerimentiInfo = new SuggestionsInfo (SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO, suggerimenti); suggerimenti di ritornoInfo;

Non abbiamo ancora finito. Il SpellingsClient la classe che abbiamo creato in precedenza ha passato intere frasi al correttore ortografico, non singole parole. Ciò significa il onGetSuggestions il metodo non verrà mai chiamato direttamente. Pertanto, abbiamo bisogno di scrivere un codice che possa dividere le frasi in parole e passarle come argomenti al onGetSuggestions metodo. Questo codice deve essere aggiunto al onGetSentenceSuggestionsMultiple metodo.

Ecco cosa fai in onGetSentenceSuggestionsMultiple metodo:

  • Passa attraverso l'array di TextInfo oggetti che riceve come input e converte ogni frase in una serie di parole usando il Diviso metodo.
  • Converti ogni parola in a TextInfo oggetto e passarlo come argomento al onGetSuggestions metodo.
  • Aggiungi i suggerimenti restituiti a un Lista di array di SuggestionsInfo oggetti.
  • Crea e restituisci un nuovo array di SentenceSuggestionsInfo oggetti che usano il Lista di array di SuggestionsInfo oggetti.

Aggiungi il seguente codice al onGetSentenceSuggestionsMultiple metodo:

Elenco suggestionsInfos = new ArrayList <> (); per (int i = 0; i

Ora che l'abitudine Sessione la classe è pronta, crea e restituisce un'istanza di essa nel servizio createSession metodo:

restituisce il nuovo MySpellingSession ();

Passaggio 3: creare i metadati per il servizio

Crea un nuovo file XML chiamato spellinginfo.xml nel res / xml cartella. Questo file viene utilizzato dal sistema Android per determinare il nome del correttore ortografico e le lingue supportate. Chiamiamo il nostro correttore ortografico Il mio correttore ortografico. Aggiungi il seguente codice al file:

    

Aggiorna il tuo Valori / strings.xml così che abbia SERVICE_LABEL:

Il mio correttore ortografico

Passaggio 4: aggiornare il manifest

Qualunque Servizio che vuole comportarsi come un correttore ortografico deve richiedere il android.permission.BIND_TEXT_SERVICE permesso e rispondere al android.service.textservice.SpellCheckerService azione. Dovrebbe anche contenere un riferimento all'XML dei metadati definito nel passaggio precedente. Definire SpellingService aggiungendo il seguente codice al tuo AndroidManifest.xml:

     

Passaggio 5: attiva il nuovo correttore ortografico

Se compili ed esegui la tua app ora, non vedrai differenze nell'output del tuo Attività. Questo perché sta ancora utilizzando il correttore ortografico predefinito di Android. Per attivare il correttore ortografico personalizzato, vai al impostazioni app e scegli il tuo correttore ortografico in Lingua ed inserimento sezione.

Una volta attivato, se si riavvia l'app, verranno visualizzati suggerimenti solo per la parola "Peter".

Conclusione

In questo tutorial, hai imparato come comunicare con i servizi di correttore ortografico di Android per eseguire operazioni di controllo ortografico nella tua app. Hai anche imparato a creare il tuo correttore ortografico personalizzato. Puoi utilizzare questa conoscenza per creare non solo IME migliori, ma anche correttori ortografici completi per le lingue che attualmente non sono supportate da Android per impostazione predefinita. Per saperne di più sull'API TextServices e sul framework Spelling Checker, consultare la Guida per gli sviluppatori Android.