Mit der Spracheingabe können Sie eine benutzerfreundliche Oberfläche erstellen. Glas gibt es drei Möglichkeiten, die Spracheingabe zu nutzen.
Mithilfe von Haupt-Sprachbefehlen starten Sie Glassware über die Home-Karte, Befehle innerhalb einer Aktivität ausführen, und die Sprachausgabe über die Erkennungsaktivität können Sie Freitext-Spracheingaben von Nutzern erhalten.
Haupt-Sprachbefehle
Mit diesen Sprachbefehlen wird Glassware auf der Startseitenkarte (Uhrkarte) gestartet. Wenn Sie einen Haupt-Sprachbefehl deklarieren, erstellt Glass automatisch einen Menüpunkt wenn Nutzer Ihre Glassware durch Tippen auf das Startseitenkarte
So fügen Sie dem Hauptmenü der Ok Glass-Stimme einen Sprachbefehl hinzu:
Erstellen Sie eine XML-Ressource für den Sprachbefehl in
res/xml/<my_voice_trigger>.xml
, die einen der vorhandenen Sprachbefehle verwendet definiert inVoiceTriggers.Command
Hier siehst du zum Beispiel, wie „Starte Lauf“ verwendet wird.<?xml version="1.0" encoding="utf-8"?> <trigger command="START_A_RUN" />
Um einen Sprachbefehl zu erstellen, der den Nutzer auffordert, einen zusätzlichen bevor du mit der Aktivität oder der Dienstleistung beginnst, füge
input
hinzu. -Elements an. Das ist beispielsweise sinnvoll, wenn Sie über „Update posten“.<?xml version="1.0" encoding="utf-8"?> <trigger command="POST_AN_UPDATE"> <input prompt="@string/glass_voice_prompt" /> </trigger>
Registrieren Sie einen Intent-Filter mithilfe der
com.google.android.glass.action.VOICE_TRIGGER
Aktion in Ihrem Android-Manifest. Der Intent-Filter startet Ihre Aktivität oder Ihren Dienst wenn erkannt wird, dass Nutzer Ihren Sprachbefehl sagen.<?xml version="1.0" encoding="utf-8"?> <application ...> <activity | service ...> <intent-filter> <action android:name= "com.google.android.glass.action.VOICE_TRIGGER" /> </intent-filter> <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/my_voice_trigger" /> </activity | service> // ... </application>
Deklarieren Sie ein
android:icon
-Attribut für Ihre Aktivität oder Ihren Dienst. So kann Glass ein Symbol für Ihre Glassware im OK, Glass auf das Menü tippen.<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
Wenn bei Ihrem Sprachbefehl eine Aufforderung erscheint und eine Aktivität gestartet wird, sollten Sie transkribierten Text mit dem folgenden Code (z. B. in
onResume()
):ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
Wenn der Sprachbefehl einen Dienst startet, ist das Intent-Extra in der
onStartCommand()
-Callback:@Override public int onStartCommand(Intent intent, int flags, int startId) { ArrayList<String> voiceResults = intent.getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); // ... }
Einschränkungen festlegen
Wenn Sie zum Starten Ihrer Glassware eine oder alle der folgenden Funktionen benötigen,
und geben sie in der Ressource res/xml/<my_voice_trigger>.xml
an.
Wenn die Funktionen nicht verfügbar sind, deaktiviert Glass den Sprachbefehl:
camera
network
microphone
<trigger command="POST_AN_UPDATE"> <constraints camera="true" network="true" /> </trigger>
Kontextbezogene Sprachbefehle
Mit kontextbezogenen Sprachbefehlen können Nutzer Aktionen in bestimmten Aktivitäten ausführen. Sie erstellen kontextbezogene Sprachbefehle mit den standardmäßigen Android-Menü-APIs, aber können die Menüpunkte per Sprachbefehl statt durch Berührung aufgerufen werden.
So aktivieren Sie kontextbezogene Sprachbefehle für eine bestimmte Aktivität:
Rufen Sie uns unter
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
an. in der gewünschten Aktivität, um kontextbezogene Sprachbefehle zu aktivieren. Mit dieser Funktion aktiviert ist, wird im Fußzeilenbereich des Bildschirms das Menü Ok Glass angezeigt. wenn diese Aktivität im Fokus steht.onCreatePanelMenu()
überschreiben und den Fall zu lösen,WindowUtils.FEATURE_VOICE_COMMANDS
aktiviert ist. Wenn diese Option aktiviert ist, kannst du das Menü einmalig einrichten, z. B. eine Menüressource oder das Aufrufen derMenu.add()
Methoden zum Erstellen Ihres Sprachmenüsystems.onMenuItemSelected()
überschreiben die die Sprachbefehle der Nutzenden verarbeiten. Wenn Nutzer fertig sind wird die Auswahl eines Menüpunkts automatisch durch den Sprachbefehl "ok, Glass" erscheint wieder im Fußzeilenbereich des Bildschirms, wo eine neue Stimme angenommen werden kann. verwenden, solange die Aktivität im Fokus bleibt.Der folgende Code ermöglicht kontextbezogene Sprachbefehle und erhöht die Lautstärke einer Menüressource. und verarbeitet Sprachbefehle, wenn diese gesprochen werden:
public class ContextualMenuActivity extends Activity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); // Requests a voice menu on this activity. As for any other // window feature, be sure to request this before // setContentView() is called getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS); setContentView(R.layout.activity_main); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { getMenuInflater().inflate(R.menu.main, menu); return true; } // Pass through to super to setup touch menu. return super.onCreatePanelMenu(featureId, menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { switch (item.getItemId()) { case R.id.dogs_menu_item: // handle top-level dogs menu item break; case R.id.cats_menu_item: // handle top-level cats menu item break; case R.id.lab_menu_item: // handle second-level labrador menu item break; case R.id.golden_menu_item: // handle second-level golden menu item break; case R.id.calico_menu_item: // handle second-level calico menu item break; case R.id.cheshire_menu_item: // handle second-level cheshire menu item break; default: return true; } return true; } // Good practice to pass through to super if not handled return super.onMenuItemSelected(featureId, item); } }
Hier ist ein Beispiel für die Menüressource, die in der vorherigen Aktivität verwendet wurde. Beachten Sie, wie Sie verschachtelte Menüpunkte für eine hierarchische Stimme erstellen können. Menüsystems. Im folgenden Beispiel kann der erste Menüpunkt Zugriff als: ok Glass, Zeig mir Hunde, Labrador.
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/dogs_menu_item" android:title="@string/show_me_dogs"> <menu> <item android:id="@+id/lab_menu_item" android:title="@string/labrador" /> <item android:id="@+id/golden_menu_item" android:title="@string/golden" /> </menu> </item> <item android:id="@+id/cats_menu_item" android:title="@string/show_me_cats"> <menu> <item android:id="@+id/cheshire_menu_item" android:title="@string/cheshire" /> <item android:id="@+id/calico_menu_item" android:title="@string/calico" /> </menu> </item> </menu>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/play_menu_item" android:title="PLAY_MUSIC" /> <item android:id="@+id/pause_menu_item" android:title="PAUSE_MUSIC" /> </menu>
Optional: Überschreiben
onPreparePanel()
, um zu prüfen, obWindowUtils.FEATURE_VOICE_COMMANDS
ist aktiviert. Wenn diese Option aktiviert ist, können Sie das Menüsystem z. B. das Hinzufügen und Entfernen bestimmter Menüpunkte basierend auf bestimmten Kriterien. Sie können auch kontextbezogene Sprachmenüs ein- (zurücktrue
) und deaktivieren (false
zurückgeben) basierend auf bestimmten Kriterien. Beispiel:private boolean mVoiceMenuEnabled; ... @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { // toggle this boolean on and off based on some criteria return mVoiceMenuEnabled; } // Good practice to call through to super for other cases return super.onPreparePanel(featureId, view, menu); }
Gleichzeitige Unterstützung von Sprach- und Touch-Menüs
Da kontextbezogene Sprachbefehle die vorhandenen Android-Menü-APIs verwenden, können Sie viel von dem Code und den Ressourcen, die Sie bereits haben, für Touch-Menüs wiederverwenden. und unterstützen gleichzeitig beide Menütypen.
Du musst nur nach der Funktion „Window.FEATURE_OPTIONS_PANEL
“ suchen
neben der WindowUtils.FEATURE_VOICE_COMMANDS
-Funktion, die Sie bereits
nach denen Sie suchen, und fügen Sie dann eine Logik hinzu, um
einer Nutzeraktion, wie z. B. Tippen, angezeigt wird.
Sie können beispielsweise die vorherige Aktivität Beispiel für die Unterstützung von Touch-Menüs wie diesem (Änderungen werden kommentiert):
// 1. Check for Window.FEATURE_OPTIONS_PANEL
// to inflate the same menu resource for touch menus.
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
// 2. Check for Window.FEATURE_OPTIONS_PANEL
// to handle touch menu item selections.
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
Nach diesen Änderungen können Sie zum Anzeigen entweder auf Ok Glass tippen oder es sagen. Ihres Menüs.
Nicht gelistete Sprachbefehle für die Entwicklung verwenden
Wenn Sie Glassware vertreiben möchten, müssen Sie die genehmigte Haupt-
Sprachbefehle in
VoiceTriggers.Command
und zugelassenen kontextbezogenen Sprachbefehlen
ContextualMenus.Command
Wenn Sie Sprachbefehle verwenden möchten, die nicht im GDK verfügbar sind,
Sie können in Ihrer AndroidManifest.xml
-Datei eine Android-Berechtigung anfordern:
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT" />
Nicht gelistete Haupt-Sprachbefehle verwenden
Geben Sie einen Stringwert in
res/values/strings.xml
an, der definiert, den Namen Ihres Auslösers für die Sprachbedienung. Deklarieren Sie optional eine Sprachaufforderung um die Spracherkennungs-Glassware anzuzeigen, bevor Sie Ihre Glassware starten.<?xml version="1.0" encoding="utf-8"?> <resources> <string name="glass_voice_trigger">read me a story</string> <string name="glass_voice_prompt">what story?</string> </resources>
Erstellen Sie eine XML-Ressource für den Sprachtrigger in
res/xml/<my_voice_trigger>.xml
Für nicht gelistete Sprachbefehle verwenden Sie das Attributkeyword
anstelle des Attributscommand
, das für genehmigte Sprachbefehle verwenden. Das Attributkeyword
sollte ein Verweis auf den String sein Ressource, mit der der Sprachbefehl definiert wird. Für einen einfachen Sprachbefehl-Trigger, der eine Aktivität oder Dienst sofort verwenden, geben Sie einfach das Elementtrigger
an:<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger" />
Um einen Sprachtrigger zu erstellen, der den Nutzer auffordert, eine zusätzliche bevor Sie mit der Aktivität oder der Dienstleistung beginnen, fügen Sie ein Eingabeelement hinzu. Außerdem:
<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger"> <input prompt="@string/glass_voice_prompt" /> </trigger>
Nicht gelistete kontextbezogene Sprachbefehle verwenden
Verwenden Sie beim Titel des Menüpunkts beliebigen Text. Beispiel:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Use the constants defined in the ContextualMenus.Command enum-->
<item
android:id="@+id/pizza_menu_item"
android:title="@string/find_pizza" />
</menu>
Spracherkennung wird gestartet
Die Spracherkennungs-Glassware wartet, bis der Nutzer spricht und gibt den und transkribierten Text. So starten Sie die Aktivität:
startActivityForResult()
anrufen mit dem IntentACTION_RECOGNIZE_SPEECH
. Die folgenden Intent-Extras werden beim Starten der Aktivität unterstützt: <ph type="x-smartling-placeholder">Überschreiben Sie die
onActivityResult()
-Rückruf zurück, um den transkribierten Text vomEXTRA_RESULTS
zusätzliche Absicht. Dieser Callback wird aufgerufen, wenn der Nutzer mit dem Sprechen fertig ist.private static final int SPEECH_REQUEST = 0; private void displaySpeechRecognizer() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); startActivityForResult(intent, SPEECH_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) { List<String> results = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); String spokenText = results.get(0); // Do something with spokenText. } super.onActivityResult(requestCode, resultCode, data); }