sono sicuro che siete a conoscenza di più di quanto segue, ma per il bene di una risposta esauriente:
qualsiasi applicazione può registrarsi come provider di riconoscimento vocale, a patto che registra un RecognitionService correttamente. Nel caso dei dispositivi Samsung, le impostazioni di ricerca vocale di Android mostreranno due provider, Google e Vlingo.
Google RecognitionService
è contenuto nella loro applicazione Google 'Now', che, come sapete, dipende da Google Play Services.
Il numero RecognitionService
di Vlingo è all'interno dell'applicazione S-Voice, che è disponibile solo preinstallata pubblicamente su dispositivi Samsung, quindi non applicabile alla domanda, ma a causa del mio commento più avanti.
Prima di utilizzare il SpeechRecognizer, è necessario utilizzare sempre il metodo statico di supporto:
if (SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) {
// initialise
} else {
// nope
}
Come ha notato la method documentation:
Verifica se un servizio di riconoscimento vocale è disponibile sul sistema . Se questo metodo restituisce false, createSpeechRecognizer (Context) avrà esito negativo.
Restituisce vero se il riconoscimento è disponibile, false altrimenti
Se si utilizza questo metodo in vostro particolare caso d'uso, dovrebbe restituire false, in modo da non dovete preoccuparvi di crash di inizializzazione.
Come nota, Vlingo restituirà true qui, ma in realtà non restituirà mai le risposte vocali, ma per un motivo o per l'altro, sarà sufficiente generare ERROR_NETWORK. È fastidioso.
A parte il controllo di cui sopra, si può anche interrogare il quale, se del caso, le applicazioni sono registrati come una provider di riconoscimento vocale nel modo seguente:
final List<ResolveInfo> services = context.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
Qualsiasi elenco vuoto, significherebbe non provider sono disponibili.
Infine, come accennato nei commenti, si può sempre assegno alti e assicurarsi che l'applicazione Google è installato:
Supponendo che si sta rivolte a Jelly Bean + Io uso il seguente metodo comodo:
/**
* Check if the user has a package installed
*
* @param ctx the application context
* @param packageName the application package name
* @return true if the package is installed
*/
public static boolean isPackageInstalled(@NonNull final Context ctx, @NonNull final String packageName) {
try {
ctx.getApplicationContext().getPackageManager().getApplicationInfo(packageName, 0);
return true;
} catch (final PackageManager.NameNotFoundException e) {
return false;
}
}
Dove il nome del pacchetto di Google è com.google.android.googlequicksearchbox
Infine, piuttosto che il mal di testa di convincere gli utenti a caricare gapps laterali, sono sicuro che ci sono molti altri provider di riconoscimento vocale là fuori, che fornitore di servizi RESTful che potresti utilizzare. Non tutti sono gratuiti.
una possibilità è controllare tramite PackageManager se 'Gapps' è installato, ad esempio controllare' com.android.vending'. In caso contrario, un modo alternativo di riconoscimento vocale potrebbe essere la sfinge: http://cmusphinx.sourceforge.net/ – Opiatefuchs
Buona idea. Tuttavia, il file della lingua di Sphinx occupa molti spazi. Il codice sopra riportato andrà in crash se non viene aggiunto alcun controllo? – Raptor
bene, questa è una domanda molto buona e se potessi darei più voti a questo. Ma davvero ..... non lo so. Se parto dal caso normale, un Intento per gestire qualche azione andrà in crash se non ci sono pacchetti per farlo. Penso che sia lo stesso con gapp mancanti, perché dovrebbe essere trattato in un altro modo. Evitare questo può essere fatto da intent.resolveActivity (pckManager)! = Null', immagino. – Opiatefuchs