2016-06-16 20 views
8

SpeechRecognizer funziona bene su Android che con Google Apps (GApps). Tuttavia, in Cina, la maggior parte dei dispositivi Android rimuoverà queste Google Apps. Cosa succederà quando viene utilizzato SpeechRecognizer? Come posso testarlo senza un dispositivo reale?SpeechRecognizer su dispositivo Android senza Google Apps

speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext()); 
speechRecognizer.setRecognitionListener(new CustomListener()); 
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh_HK"); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); 
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); 
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false); 
intent.putExtra("android.speech.extra.EXTRA_ADDITIONAL_LANGUAGES", new String[]{"zh_HK", "en-US"}); 
speechRecognizer.startListening(intent); 

dove CustomListener() implementa RecognitionListener.

+2

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

+0

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

+0

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

risposta

4

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.

Problemi correlati