2015-05-10 10 views
15

Wie findet man den ComponentName des Standard-System-Spracherkenners, d. H. Den, der zurückgegeben wird, wenn createSpeechRecognizer(Context context) aufgerufen wird? (Eigentlich brauche ich nur, um herauszufinden, welche Eingabesprachen unterstützt, so dass, wenn es eine Antwort auf diese Frage ist nur, dann würde ich es auch zu schätzen wissen.)So fragen Sie nach dem Standard-SpeechRecognizer

Das Framework löst dies durch

String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(), 
         Settings.Secure.VOICE_RECOGNITION_SERVICE); 

(Siehe source code of SpeechRecognizer.)

Diese Lösung scheint jedoch nicht für eine App von Drittanbietern verfügbar sein.

Antwort

4

UPDATE (I falsch interpretiert die ursprüngliche Frage)

SpeechRecognizer ist nicht das, was die Sprachverarbeitung zu tun, die Intent Sie SpeechRecognizer passieren, ist aber (über startListening(Intent intent)). Diese Absicht verwendet RecognizerIntent.ACTION_RECOGNIZE_SPEECH und, AFAIK, kann in der altmodischen Weise erkannt werden.

Um Standardwerte zu erkennen, versuchen Sie, die Absicht zu lösen, für die die Suche der Standard sein soll, aber mit PackageManager.MATCH_DEFAULT_ONLY festgelegt.

Ungeprüfte Code:

String detectDefaultSpeechRecognizer(Context context) { 
    final Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    // 1: Try to find the default speech intent 
    final ResolveInfo defaultResolution = context.getPackageManager().resolveService(speechIntent, PackageManager.MATCH_DEFAULT_ONLY); 
    if (defaultResolution != null) { 
    final ActivityInfo activity = defaultResolution.activityInfo; 
    if (!activity.name.equals("com.android.internal.app.ResolverActivity")) { 
     //ResolverActivity was launched so there is no default speech recognizer 
     return ""; 
    } 
    } 
    // 2: Try to find anything that we can launch speech recognition with. Pick up the first one that can. 
    final List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentServices(speechIntent, PackageManager.MATCH_DEFAULT_ONLY); 
    if (!resolveInfoList.isEmpty()) { 
    speechIntent.setClassName(resolveInfoList.get(0).activityInfo.packageName, resolveInfoList.get(0).activityInfo.name); 
    return resolveInfoList.get(0).activityInfo.packageName; 
    } 
    return ""; 
} 

ALTE ANTWORT

Check out GAST, hat es eine Möglichkeit zu überprüfen, ob eine Sprache in einer Spracherkennungsvorrichtung unterstützt wird.
https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/speech/SpeechRecognizingActivity.java#L70

Sie können auch versuchen, das Metadaten-Tag <recognition-service> manuell zu überprüfen. http://developer.android.com/reference/android/speech/RecognitionService.html#SERVICE_META_DATA

+0

Danke, aber ich sehe nicht, wie das ist meine Frage beantwortet.Ich weiß bereits, wie man überprüft, welche Sprachen ein Erkenner unterstützt, sobald ich weiß, welcher Erkenner danach fragt. Was ich brauche, ist herauszufinden, welcher Erkenner als Standard festgelegt wurde. Metadaten helfen hier nicht, da dies einem Erkenner nicht erlaubt zu deklarieren, dass es der Standard ist, nur dass es ein Erkenner ist. – Kaarel

+0

Ich sehe. Ich habe meine Antwort aktualisiert, um mehr von dem zu unterscheiden, was du meinst. SpeechRecognizer ist nicht das, was eigentlich die Spracherkennung macht, es startet nur den Dienst. – Andrew

+0

Ist Ihre neue Antwort nicht auf Aktivitäten anfragend? Ich bin nur an Dienstleistungen interessiert. – Kaarel

7

Diese Lösung ist jedoch offenbar nicht an Dritte App verfügbar sein.

Ich nehme an, Sie auf eine solche Schlussfolgerung gekommen, weil Settings.Secure.VOICE_RECOGNITION_SERVICE keine öffentliche API ist. Settings.Secure.getString() erfordert jedoch, dass der Name der Zeile in der sicheren Tabelle nach dem zweiten Argument gesucht wird. So können Sie einfach den tatsächlichen Namen der Zeile angeben, nach der Sie suchen: "voice_recognition_service".

Das ist, können Sie den gleichen Code von SpeechRecognizer mit geringfügiger Änderung verwenden:

String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(), 
     "voice_recognition_service"); 

Hoffnung, das hilft.

+0

Danke! Dies ist, was ich gerade benutze, aber ich dachte, dass es vielleicht einen anderen (bevorzugten) Weg gibt. – Kaarel

0

Wenn Sie nur herausfinden möchten, welche Eingabesprachen der Standardsystem-Spracherkenner unterstützt (createSpeechRecognizer (Context context)), gibt es einen einfacheren Weg dazu.

Alles, was Sie tun müssen, ist mit einer RecognizerIntent.getVoiceDetailsIntent Absicht, die die Standard-Systemspracherkennungssprachen überprüfen:

Intent intent = RecognizerIntent.getVoiceDetailsIntent(getApplicationContext()); 

     if (intent != null) { 
      ctx.sendOrderedBroadcast(intent, null, new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, final Intent intent) { 
        Log.d(TAG, 
          "Receiving Supported Speech Recognition Languages broadcast " 
            + intent); 

        final Bundle extra = getResultExtras(false); 

        if ((getResultCode() == Activity.RESULT_OK) 
          && (extra != null) 
          && (mHandler != null) 
          && ((extra 
            .containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) || (extra 
            .containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)))) { 

         List<String> supportedLanguages = extra 
           .getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES); 
         String prefLang = extra 
           .getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE); 

        } 
       } 

      }, 

      null, Activity.RESULT_OK, null, null); 
     } 
+0

@Kaarel ist nicht das, wonach Sie suchen? Eine einfache Möglichkeit, die unterstützten Sprachen des Standardsystem-Spracherkenners zu finden? Bitte beachten Sie, dass der gesamte Code in der öffentlichen API ist (was vorzuziehen ist) und einfacher zu pflegen ist –

+0

Danke. Ich denke, 'getVoiceDetailsIntent' gibt mir die _activity_, die' ACTION_WEB_SEARCH' implementiert (siehe den Quellcode). Ich brauche stattdessen einen Service. – Kaarel

Verwandte Themen