Ses girişi sayesinde eller serbest bir arayüz oluşturabilirsiniz. Glass, ses girişini kullanmak için üç yol sunar.
Ana sesli komutlar Glassware'i ana karttan başlatır, bağlamsal sesli komutlar bir etkinlik içinde işlem yapabilir ve sistemin konuşma tanıma etkinliği, kullanıcılardan serbest biçimli ses girişi almanıza olanak tanır.
Ana sesli komutlar
Bu sesli komutlar, Glassware'i ana karttan (saat kartı) başlatır. Ana sesli komutu verdiğinizde Glass, otomatik olarak yedek menü öğesi oluşturur. Kullanıcılar, Ana Kart'a dokunarak Glassware'i başlatmaya karar verirse otomatik olarak yedek menü öğesi oluşturur.
ok cam sesli ana menüsüne sesli komut eklemek için:
res/xml/<my_voice_trigger>.xml
uygulamasında sesli komut için,VoiceTriggers.Command
içinde tanımlanan mevcut sesli komutlardan birini kullanan bir XML kaynağı oluşturun. Örneğin, "Koşu başlat"ı şu şekilde kullanabilirsiniz.<?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 ayrıca bir
input
öğesi ekleyin. Örneğin, "Güncelleme yayınla" seçeneğini 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. Niyet filtresi, sesli komutunuzu söyleyen kullanıcıları tespit ederse 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 belirtin. Bu şekilde Glass'ın ok, cam dokunma menüsünde Glassware'inize ait bir simge görüntülenebilir.<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
Sesli komutunuz sesli istem kullanır ve bir etkinlik başlatırsa aşağıdaki kodla (ör.
onResume()
) metne dönüştürülen bir metin alın:ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
Sesli komut bir hizmeti başlatıyorsa
onStartCommand()
geri çağırmasında ekstra niyet mevcut olur:@Override public int onStartCommand(Intent intent, int flags, int startId) { ArrayList<String> voiceResults = intent.getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); // ... }
Ayar kısıtlamaları
Glassware'i 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ğlamsal sesli komutlar
Bağlamsal sesli komutlar, kullanıcıların çeşitli işlemler yapmasına olanak tanır. Standart Android menüsü API'leriyle bağlamsal sesli komutlar oluşturursunuz. Kullanıcılar menü öğelerini dokunmak yerine sesli komutlarla çağırabilirler.
Belirli bir etkinlik için bağlama dayalı sesli komutları etkinleştirmek üzere:
Bağlamsal sesli komutları etkinleştirmek için istediğiniz etkinlikte
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
çağrısını gerçekleştirin. Bu özellik etkinleştirildiğinde, bu etkinlik her odaklanıldığında ekranın alt alanında "ok cam" menüsü görünür.onCreatePanelMenu()
alanını geçersiz kılın veWindowUtils.FEATURE_VOICE_COMMANDS
özelliğinin etkinleştirildiği büyük/küçük harf durumunu yönetin. Bu özellik etkinleştirildiğinde, bir menü kaynağını artırmak veya sesli menü sisteminizi oluşturmak içinMenu.add()
yöntemlerini çağırmak gibi tek seferlik bir menü kurulumu yapabilirsiniz.Kullanıcılar söylediklerinde sesli komutları işlemek için
onMenuItemSelected()
politikasını geçersiz kılın. Bir menü öğesini seçmeyi bitirdiğinizde, etkinlik odakta olduğu sürece "ok, cam" sesli komutu otomatik olarak ekranın altbilgi bölümünde yeniden görünür.Aşağıdaki kod, bağlamsal sesli komutları etkinleştirir, uygun olduğunda bir 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ğı örneğini burada bulabilirsiniz. Hiyerarşik bir sesli menü sistemi için nasıl iç içe yerleştirilmiş menü öğeleri oluşturacağınızı öğrenin. Aşağıdaki örnekte, ilk menü öğesine ok cam, Köpekleri göster, Labrador şeklinde erişilebilir.
<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
öğesinin etkin olup olmadığını kontrol ederekonPreparePanel()
değerini geçersiz kılın. Etkinleştirildiğinde menü sistemini ayarlamak için diğer faktörleri (ör. bazı ölçütlere göre belirli menü öğelerini ekleyip kaldırma gibi) yapabilirsiniz. Ayrıca, bazı kriterlere göre bağlamsal sesli menüleri açıp (true
dönüşünü) ve kapalı düğmesini (false
döndürme) de açabilirsiniz. Ö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üler aynı anda destekleniyor
Bağlamsal sesli komutlar mevcut Android menüsü API'lerini kullandığından, halihazırda sahip olduğunuz kod ve kaynakların büyük bir kısmını dokunmatik menüler için yeniden kullanabilir ve aynı anda her iki menü türünü de destekleyebilirsiniz.
Tek yapmanız gereken, halihazırda birkaç yöntemle kontrol ettiğiniz WindowUtils.FEATURE_VOICE_COMMANDS
özelliğine ek olarak Window.FEATURE_OPTIONS_PANEL
özelliğini kontrol etmek ve ardından, dokunma gibi bazı kullanıcı işlemlerinde dokunma menüsünü açmak için bir mantık eklemektir.
Örneğin, önceki etkinliğe ait etkinliği buna benzer dokunma menüleri için destek eklemek üzere değiştirebilirsiniz (değişiklikler yorumlanı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 cam diyebilirsiniz.
Geliştirme için liste dışı sesli komutları kullanma
Glassware'inizi dağıtmak istediğinizde, onaylanmış ana sesli komutları VoiceTriggers.Command
ve onaylı bağlamsal sesli komutları ContextualMenus.Command
dilinde kullanmanız gerekir.
GDK'da bulunmayan sesli komutları kullanmak isterseniz AndroidManifest.xml
dosyanızda Android için izin isteyebilirsiniz:
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT" />
Liste dışı ana sesli komutları kullanma
res/values/strings.xml
uygulamasında ses tetikleyicinizin adını tanımlayan bir dize değeri bildirin. İsteğe bağlı olarak, Glassware'i başlatmadan önce konuşma tanıma Glassware'i görüntülemek için bir sesli istem belirtin.<?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
uygulamasındaki ses tetikleyicisi için XML kaynağı oluşturun. Liste dışı sesli komutlarda, onaylanmış sesli komutlar için kullanılancommand
özelliği yerinekeyword
özelliğini kullanmanız gerekir.keyword
özelliği, sesli komutu tanımlayan dize kaynağına başvuru olmalıdır. Bir etkinliği veya hizmeti hemen başlatan basit bir ses tetikleyicisi 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ışı içeriğe dayalı sesli komutları kullanma
Menü öğeleri oluştururken menü öğesinin başlığı için herhangi bir metni 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 Glassware kullanıcıların konuşmasını bekler ve metne dönüştürüldükten sonra metni döndürür. Etkinliği başlatmak için:
startActivityForResult()
adlı kişiyiACTION_RECOGNIZE_SPEECH
niyetiyle arayın. Aktivite başlatılırken aşağıdaki amaç ekstraları desteklenir:Metne dönüştürülen metni
EXTRA_RESULTS
ekinden almak içinonActivityResult()
geri çağırmasını geçersiz kılın. Bu geri çağırma, kullanıcılar konuşmayı bitirdikten sonra ç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); }