Java: impostiamo automaticamente la tastiera

Roberto Orgiu
Roberto Orgiu
Java: impostiamo automaticamente la tastiera

Prima di cominciare, un disclaimer è d'obbligo:

Con la procedura descritta in questo articolo andrete ad impostare in maniera diversa rispetto a quella nativa la tastiera predefinita, per cui avrete bisogno sia dei permessi di root sia di impostarla come applicazione di sistema, quindi fate attenzione a quello che fate; né io né AndroidWorld.it ci riterremo responsabili per eventuali danni al vostro dispositivo.

Andiamo a rivedere il codice Java del precedente tutorial e quello riguardante la richiesta di permessi di root e andiamo a guardare la funzione per cambiare la tastiera dei nuovi sorgenti: questo codice è stato rielaborato dai sorgenti di Ne0fhyk , disponibili su BitBucket e non è stato scritto di nuovo riga per riga, ma è stato testato e funziona anche sull'ultima release di Jelly Bean 4.1.2 con qualche piccolo accorgimento.

L'unica modifica che abbiamo apportato, oltre al Listener sull'Item selezionato dalla lista (se non ci ricordiamo come fare, possiamo dare uno sguardo ai sorgenti o fare un salto indietro nel tempo), riguarda la funzione per cambiare la tastiera, previa richiesta dei permessi di root.

if(!Commons.getRoot(mContext)){
return;
}

In questo primo passo, l'unica cosa che facciamo è richiedere i permessi di amministratore al nostro dispositivo, in modo da poter eseguire questa operazione; a questo punto, prendiamo un riferimento all'InputMethodManager e chiudiamo la tastiera correntemente in uso:

final InputMethodManager imm = (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
stopIme(mContext,currentKeyboardID);

Ora, non ci rimane che utilizzare l'oggetto appena dichiarato per impostare la nuova tastiera e notificare al sistema l'avvenuto cambiamento tramite un Broadcast Intent:

imm.setInputMethod(null, newKeyboardID);
Intent updateImeIntent = new Intent(Intent.ACTION_INPUT_METHOD_CHANGED);
updateImeIntent.putExtra("input_method_id", newKeyboardID);
mContext.sendBroadcast(updateImeIntent);

Una volta salvato il nostro codice, dobbiamo andare ad agire sul nostro file Manifest e specificare che abbiamo bisogno di determinati permessi per eseguire queste operazioni, scrivendo quindi queste righe sotto la sezione uses-sdk:

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

Queste tre righe specificano al sistema che abbiamo bisogno di andare a scrivere sulle impostazioni più profonde e protette di Android e dobbiamo poter fermare i processi in background.

Se ora provassimo a far partire la nostra applicazione, al primo tap su uno degli elementi della lista, il software si chiuderebbe in maniera inaspettata ritornando l'eccezione

java.lang.SecurityException: Using null token requires permission android.permission.WRITE_SECURE_SETTINGS

Cosa significa? Effettivamente il permesso in questione l'abbiamo dichiarato, ma dobbiamo impostare il nostro apk come software di sistema. Per farlo, abbiamo utilizzato Titanium Backup Root (potete scaricarlo a fine articolo dal box di download), seguendo questa procedura: una volta installato il noto applicativo, ci siamo spostati sul tab Backup/Ripristino e abbiamo fatto scorrere la lista fino a trovare il nostro progetto. A questo punto, abbiamo effettuato un long-press su di esso e scelto Converti in app di sistema.

Per essere sicuri che tutto funzioni a dovere dobbiamo rifare il long-press e controllare che la voce direttamente superiore a quella appena scelta sia Scollega dal Market: se così non è, facciamo un tap sul bottone Collega al Market (forza) in modo da poter ricevere gli aggiornamenti dell'applicazione.

Come per gli altri tutorial, trovate tutte le informazioni nell'apposito thread del nostro forum e potete scaricare i software relativi dai box di download qui sotto, mentre possiamo reperire la vecchia versione dell'APK a questo indirizzo.

 [app]it.example.keyboard.listing[/app]

[app]com.keramidas.TitaniumBackup[/app]