Ses girişi ile gerçekten eller serbest bir arayüz oluşturabilirsiniz. Glass, ses girişini üç farklı şekilde kullanmanızı sağlar.
Ana sesli komutlar Glassware'i Ana Sayfa kartından başlatır, bağlamsal sesli komutlar bir etkinlik içinde işlem yapabilir ve sistemin konuşma tanıma etkinliği de kullanıcılardan serbest biçimli ses girişi almanıza olanak tanır.
Ana sesli komutlar
Bu sesli komutlar Ana Sayfa kartından (Saat kartı) Glassware'i başlatır. Bir ana sesli komut bildirdiğinizde, kullanıcılar Glassware hizmetini Ana Sayfa kartına dokunarak başlatmaya karar verirse Glass otomatik olarak yedek olarak bir dokunma menü öğesi oluştururlar.
Ok Glass sesli ana menüsüne sesli komut eklemek için:
res/xml/<my_voice_trigger>.xml
uygulamasındaki sesli komut içinVoiceTriggers.Command
içinde tanımlanan mevcut sesli komutlardan birini kullanan bir XML kaynağı oluşturun. Örneğin, "Koşu başlat" özelliğinin nasıl kullanılacağı burada açıklanmaktadır.<?xml version="1.0" encoding="utf-8"?> <trigger command="START_A_RUN" />
Etkinliğinizi veya hizmetinizi başlatmadan önce kullanıcıdan ek bir ifade söylemesini isteyen bir sesli komut oluşturmak için
input
öğesi de ekleyin. Örneğin, "Güncelleme yayınla" kullanıyorsanız bunu yapmak isteyebilirsiniz.<?xml version="1.0" encoding="utf-8"?> <trigger command="POST_AN_UPDATE"> <input prompt="@string/glass_voice_prompt" /> </trigger>
Android manifest'inizdeki
com.google.android.glass.action.VOICE_TRIGGER
işlemini kullanarak bir intent filtresi kaydedin. Amaç filtresi, sesli komutunuzu konuşan kullanıcıların olduğunu algılarsa etkinliğinizi veya hizmetinizi başlatır.<?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>
Etkinliğiniz veya hizmetiniz için bir
android:icon
özelliği beyan edin. Bu şekilde Glass, tamam, cam dokunma menüsünde Glassware'iniz için bir simge görüntüleyebilir.<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
Sesli komutunuz sesli istem kullanıp etkinlik başlatırsa aşağıdaki kodu içeren, metne dönüştürülen metinleri alın (ör.
onResume()
):ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
Sesli komut bir hizmet başlatırsa Intent extra,
onStartCommand()
geri çağırmasında kullanılabilir:@Override public int onStartCommand(Intent intent, int flags, int startId) { ArrayList<String> voiceResults = intent.getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); // ... }
Kısıtlamalar ayarlama
Glassware uygulamanızı başlatmak için aşağıdaki özelliklerden birine veya tümüne ihtiyacınız varsa bunları res/xml/<my_voice_trigger>.xml
kaynağında belirtin.
Özellikler kullanılamıyorsa Glass sesli komutu devre dışı bırakır:
camera
network
microphone
<trigger command="POST_AN_UPDATE"> <constraints camera="true" network="true" /> </trigger>
Bağlama dayalı sesli komutlar
Bağlama dayalı sesli komutlar, kullanıcıların etkinliklerdeki işlemleri gerçekleştirmesine olanak tanır. Bağlama dayalı sesli komutları standart Android menü API'leriyle oluşturursunuz ancak kullanıcılar menü öğelerini dokunmak yerine sesli komutlarla çağırabilirler.
Belirli bir etkinlikle ilgili olarak bağlama dayalı sesli komutları etkinleştirmek için:
İçeriğe dayalı sesli komutları etkinleştirmek için istediğiniz etkinlikte
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
numaralı telefonu arayın. Bu özellik etkinleştirildiğinde, bu etkinliğe odaklanıldığında ekranın alt bilgi alanında "ok Glass" menüsü görünür.onCreatePanelMenu()
değerini geçersiz kılın veWindowUtils.FEATURE_VOICE_COMMANDS
özelliğinin etkinleştirildiği destek kaydını ele alın. Bu ayar etkinleştirilirse tek seferlik menü ayarlarını (ör. menü kaynağını şişirme veya sesli menü sisteminizi oluşturmak içinMenu.add()
yöntemlerini çağırma) yapabilirsiniz.Kullanıcılar söylediğinde sesli komutları işlemek için
onMenuItemSelected()
kodunu geçersiz kılın. Kullanıcılar bir menü öğesini seçdiklerinde, etkinlik odakta kaldığı sürece "ok, Glass" sesli komutu otomatik olarak ekranın altbilgi bölümünde yeniden görünür ve yeni bir sesli komutu kabul etmeye hazır olur.Aşağıdaki kod, bağlamsal sesli komutları etkinleştirir, uygun olduğunda menü kaynağını şişirir ve söylendiğinde sesli komutları işler:
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); } }
Önceki etkinlik tarafından kullanılan menü kaynağının bir örneğini burada bulabilirsiniz. Hiyerarşik bir ses menüsü sistemi için iç içe yerleştirilmiş menü öğelerini nasıl oluşturabileceğinize dikkat edin. Aşağıdaki örnekte ilk menü öğesine şu şekilde erişilebilir: ok cam, Köpekleri göster, 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>
(İsteğe bağlı)
WindowUtils.FEATURE_VOICE_COMMANDS
'in etkin olup olmadığını kontrol ederekonPreparePanel()
değerini geçersiz kılın. Etkinleştirildiğinde, menü sistemini ayarlamak için başka işlemler yapabilirsiniz. Örneğin, bazı ölçütlere dayalı olarak belirli menü öğelerini ekleyip kaldırabilirsiniz. Ayrıca, bazı ölçütlere göre içeriğe dayalı sesli menüleri açabilir (döndürtrue
) ve kapatabilirsiniz (dönüşfalse
). Örneğin: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); }
Sesli ve dokunmatik menüleri aynı anda destekleme
Bağlamsal sesli komutlar mevcut Android menü API'lerini kullandığından, dokunmatik menüler için sahip olduğunuz kod ve kaynakların çoğunu yeniden kullanabilir ve aynı anda her iki menü türünü de destekleyebilirsiniz.
Tek yapmanız gereken, birkaç yöntemle kontrol ettiğiniz WindowUtils.FEATURE_VOICE_COMMANDS
özelliğine ek olarak Window.FEATURE_OPTIONS_PANEL
özelliğini de kontrol etmek ve ardından dokunma gibi bir kullanıcı işleminde dokunma menüsünü açmak için mantık eklemektir.
Örneğin, önceki etkinlik örneğini değiştirerek aşağıdaki gibi dokunma menüleri için destek ekleyebilirsiniz (değişikliklere yorum yapılır):
// 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) {
...
}
Bu değişikliklerle, menünüzü görüntülemek için dokunun veya ok Glass demeniz yeterli.
Geliştirme için liste dışı sesli komutları kullanma
Glassware uygulamanızı dağıtmak istediğinizde VoiceTriggers.Command
ürününde onaylanmış ana sesli komutları, ContextualMenus.Command
içinde de onaylanmış içeriğe dayalı sesli komutları kullanmanız gerekir.
GDK'da bulunmayan sesli komutları kullanmak isterseniz AndroidManifest.xml
dosyanızdan bir Android izni isteyebilirsiniz:
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT" />
Liste dışı ana sesli komutları kullanma
res/values/strings.xml
içinde ses tetikleyicinizin adını tanımlayan bir dize değeri tanımlayın. İsteğe bağlı olarak, Glassware'inizi başlatmadan önce konuşma tanıma Bardağı'nı görüntülemek için bir sesli istem bildirebilirsiniz.<?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>
res/xml/<my_voice_trigger>.xml
bölgesinde ses tetikleyici için XML kaynağı oluşturun. Liste dışı sesli komutlarda, onaylanmış sesli komutlar için kullanılancommand
özelliği yerinekeyword
özelliğini kullanmalısınız.keyword
özelliği, sesli komutu tanımlayan dize kaynağına referans olmalıdır. Bir etkinliği veya hizmeti hemen başlatan basit bir sesli tetikleyici içintrigger
öğesini belirtmeniz yeterlidir:<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger" />
Etkinliğinizi veya hizmetinizi başlatmadan önce kullanıcıdan ek bir ifade söylemesini isteyen bir sesli tetikleyici oluşturmak için bir giriş öğesi de ekleyin:
<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger"> <input prompt="@string/glass_voice_prompt" /> </trigger>
Liste dışı bağlamsal sesli komutları kullanma
Menü öğelerini oluştururken menü öğesinin başlığı için herhangi bir metin kullanın. Örneğin:
<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>
Konuşma tanıma başlatılıyor
Konuşma tanıma Bardağı, kullanıcıların konuşmasını bekler ve metne dönüştürülen metni bitirdikten sonra geri getirir. Etkinliği başlatmak için:
ACTION_RECOGNIZE_SPEECH
niyetiylestartActivityForResult()
numaralı telefonu ara. Etkinliği başlatırken aşağıdaki intent ekstraları desteklenir:EXTRA_RESULTS
intent ekstrasından metne dönüştürülen metni almak içinonActivityResult()
geri çağırmasını geçersiz kılın. Bu geri çağırma, kullanıcı konuşmayı bitirdiğinde çağrılır.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); }