Android SDK, Glass EE2 ile kullanılabilen çeşitli girişlere ve sensörlere erişmenizi sağlar. Bu sayfada mevcut özellikler, uygulama ayrıntıları ve faydalı ipuçları hakkında genel bir bakış sunulmaktadır.
Dokunma hareketleri
Glass dokunmatik ekranından ham verilere erişimi etkinleştirmek için Android SDK'yı kullanabilirsiniz. Bu işlem; Glass'taki dokunma, sallanma ve kaydırma gibi yaygın hareketleri otomatik olarak algılayan bir hareket algılayıcı üzerinden gerçekleştirilir.
Ayrıca dokunma, ileri, geri ve geri kaydırma işlemlerini hesaba katmak için uygulamalarınızda bu hareket algılayıcıyı kullanabilirsiniz. Bu özellik önceki Glass cihazlarına benzer.
Bu hareketleri aşağıdaki şekillerde kullanmanız önerilir:
- Dokunma: Onayla veya girin.
- İleri kaydır, geri kaydır: Kartlar ve ekranlarda gezinin.
- Aşağı kaydırın: Geri veya çıkış.
Uygulama ayrıntıları için örnek hareket algılayıcıyı okuyun.
Android hareket algılayıcı ile hareketleri algılama
Android GestureDetector
, birden fazla parmak kullanan veya kaydırma işlemi yapan basit ve karmaşık hareketleri tespit etmenizi sağlar.
Etkinlik düzeyindeki hareketleri algılama
Kullanıcı arayüzünüzün hangi kısmına odaklanılmış olursa olsun, hareket düzeyindeki hareketleri algılayabilir.
Örneğin, kullanıcı dokunmatik alana dokunduğunda, hangi görünüme odaklandığına bakılmaksızın bir menü açmak istiyorsanız etkinliğin içinde yer alan MotionEvent
simgesini kullanın.
Aşağıda, GestureDetector
kullanan ve tanınan hareketleri işlemesi için GestureDetector.OnGestureListener
uygulayan etkinlik düzeyinde hareket algılama örneği verilmiştir: Daha sonra işlenip şunlara dönüştürülür:
TAP
SWIPE_FORWARD
SWIPE_BACKWARD
SWIPE_UP
SWIPE_DOWN
Kotlin
class GlassGestureDetector(context: Context, private val onGestureListener: OnGestureListener) : GestureDetector.OnGestureListener { private val gestureDetector = GestureDetector(context, this) enum class Gesture { TAP, SWIPE_FORWARD, SWIPE_BACKWARD, SWIPE_UP, SWIPE_DOWN } interface OnGestureListener { fun onGesture(gesture: Gesture): Boolean } fun onTouchEvent(motionEvent: MotionEvent): Boolean { return gestureDetector.onTouchEvent(motionEvent) } override fun onDown(e: MotionEvent): Boolean { return false } override fun onShowPress(e: MotionEvent) {} override fun onSingleTapUp(e: MotionEvent): Boolean { return onGestureListener.onGesture(Gesture.TAP) } override fun onScroll( e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { return false } override fun onLongPress(e: MotionEvent) {} /** * Swipe detection depends on the: * - movement tan value, * - movement distance, * - movement velocity. * * To prevent unintentional SWIPE_DOWN and SWIPE_UP gestures, they are detected if movement * angle is only between 60 and 120 degrees. * Any other detected swipes, will be considered as SWIPE_FORWARD and SWIPE_BACKWARD, depends * on deltaX value sign. * * ______________________________________________________________ * | \ UP / | * | \ / | * | 60 120 | * | \ / | * | \ / | * | BACKWARD <------- 0 ------------ 180 ------> FORWARD | * | / \ | * | / \ | * | 60 120 | * | / \ | * | / DOWN \ | * -------------------------------------------------------------- */ override fun onFling( e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float ): Boolean { val deltaX = e2.x - e1.x val deltaY = e2.y - e1.y val tan = if (deltaX != 0f) abs(deltaY / deltaX).toDouble() else java.lang.Double.MAX_VALUE return if (tan > TAN_60_DEGREES) { if (abs(deltaY) < SWIPE_DISTANCE_THRESHOLD_PX || Math.abs(velocityY) < SWIPE_VELOCITY_THRESHOLD_PX) { false } else if (deltaY < 0) { onGestureListener.onGesture(Gesture.SWIPE_UP) } else { onGestureListener.onGesture(Gesture.SWIPE_DOWN) } } else { if (Math.abs(deltaX) < SWIPE_DISTANCE_THRESHOLD_PX || Math.abs(velocityX) < SWIPE_VELOCITY_THRESHOLD_PX) { false } else if (deltaX < 0) { onGestureListener.onGesture(Gesture.SWIPE_FORWARD) } else { onGestureListener.onGesture(Gesture.SWIPE_BACKWARD) } } } companion object { private const val SWIPE_DISTANCE_THRESHOLD_PX = 100 private const val SWIPE_VELOCITY_THRESHOLD_PX = 100 private val TAN_60_DEGREES = tan(Math.toRadians(60.0)) } }
Java
public class GlassGestureDetector implements GestureDetector.OnGestureListener { enum Gesture { TAP, SWIPE_FORWARD, SWIPE_BACKWARD, SWIPE_UP, SWIPE_DOWN, } interface OnGestureListener { boolean onGesture(Gesture gesture); } private static final int SWIPE_DISTANCE_THRESHOLD_PX = 100; private static final int SWIPE_VELOCITY_THRESHOLD_PX = 100; private static final double TAN_60_DEGREES = Math.tan(Math.toRadians(60)); private GestureDetector gestureDetector; private OnGestureListener onGestureListener; public GlassGestureDetector(Context context, OnGestureListener onGestureListener) { gestureDetector = new GestureDetector(context, this); this.onGestureListener = onGestureListener; } public boolean onTouchEvent(MotionEvent motionEvent) { return gestureDetector.onTouchEvent(motionEvent); } @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return onGestureListener.onGesture(Gesture.TAP); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } /** * Swipe detection depends on the: * - movement tan value, * - movement distance, * - movement velocity. * * To prevent unintentional SWIPE_DOWN and SWIPE_UP gestures, they are detected if movement * angle is only between 60 and 120 degrees. * Any other detected swipes, will be considered as SWIPE_FORWARD and SWIPE_BACKWARD, depends * on deltaX value sign. * * ______________________________________________________________ * | \ UP / | * | \ / | * | 60 120 | * | \ / | * | \ / | * | BACKWARD <------- 0 ------------ 180 ------> FORWARD | * | / \ | * | / \ | * | 60 120 | * | / \ | * | / DOWN \ | * -------------------------------------------------------------- */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final float deltaX = e2.getX() - e1.getX(); final float deltaY = e2.getY() - e1.getY(); final double tan = deltaX != 0 ? Math.abs(deltaY/deltaX) : Double.MAX_VALUE; if (tan > TAN_60_DEGREES) { if (Math.abs(deltaY) < SWIPE_DISTANCE_THRESHOLD_PX || Math.abs(velocityY) < SWIPE_VELOCITY_THRESHOLD_PX) { return false; } else if (deltaY < 0) { return onGestureListener.onGesture(Gesture.SWIPE_UP); } else { return onGestureListener.onGesture(Gesture.SWIPE_DOWN); } } else { if (Math.abs(deltaX) < SWIPE_DISTANCE_THRESHOLD_PX || Math.abs(velocityX) < SWIPE_VELOCITY_THRESHOLD_PX) { return false; } else if (deltaX < 0) { return onGestureListener.onGesture(Gesture.SWIPE_FORWARD); } else { return onGestureListener.onGesture(Gesture.SWIPE_BACKWARD); } } } }
Örnek kullanım
Etkinlik düzeyinde hareket algılamadan yararlanmak için aşağıdaki görevleri tamamlamanız gerekir:
- Aşağıdaki beyanı manifest dosyanıza uygulama beyanının içine ekleyin. Bu sayede uygulamanız, etkinlikteki
MotionEvent
öğesini alabilir:<application> <!-- Copy below declaration into your manifest file --> <meta-data android:name="com.google.android.glass.TouchEnabledApplication" android:value="true" /> </application>
- Hareket etkinliklerini hareket dedektörü
onTouchEvent(motionEvent)
yöntemine iletmek için aktivitenindispatchTouchEvent(motionEvent)
yöntemini geçersiz kılın. - Etkinliğinize
GlassGestureDetector.OnGestureListener
uygulayın.
Aşağıda, etkinlik düzeyinde hareket algılayıcısına bir örnek verilmiştir:
Kotlin
class MainAcvitiy : AppCompatActivity(), GlassGestureDetector.OnGestureListener { private lateinit var glassGestureDetector: GlassGestureDetector override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) glassGestureDetector = GlassGestureDetector(this, this) } override fun onGesture(gesture: GlassGestureDetector.Gesture): Boolean { when (gesture) { TAP -> // Response for TAP gesture return true SWIPE_FORWARD -> // Response for SWIPE_FORWARD gesture return true SWIPE_BACKWARD -> // Response for SWIPE_BACKWARD gesture return true else -> return false } } override fun dispatchTouchEvent(ev: MotionEvent): Boolean { return if (glassGestureDetector.onTouchEvent(ev)) { true } else super.dispatchTouchEvent(ev) } }
Java
public class MainActivity extends AppCompatActivity implements OnGestureListener { private GlassGestureDetector glassGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); glassGestureDetector = new GlassGestureDetector(this, this); } @Override public boolean onGesture(Gesture gesture) { switch (gesture) { case TAP: // Response for TAP gesture return true; case SWIPE_FORWARD: // Response for SWIPE_FORWARD gesture return true; case SWIPE_BACKWARD: // Response for SWIPE_BACKWARD gesture return true; default: return false; } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (glassGestureDetector.onTouchEvent(ev)) { return true; } return super.dispatchTouchEvent(ev); } }
Ses girişi
Glass Enterprise Edition 2, temel ses kaynaklarını destekleyen standart AOSP tabanlı bir cihazdır.
Aşağıdaki ses kaynaklarında gelişmiş sinyal işleme uygulanır:
Ses tanıma
Glass Enterprise Edition 2, konuşma tanıma için yerel uygulamayı destekler. Bu özellik yalnızca İngilizce için desteklenir.
Konuşma tanıma kullanıcı arayüzü, kullanıcıların konuşmasını bekler ve metne dönüştürüldükten sonra metne dönüştürülen metni döndürür. Etkinliği başlatmak için aşağıdaki adımları uygulayın:
ACTION_RECOGNIZE_SPEECH
niyetiylestartActivityForResult()
numarasını arayın. Etkinliği başlattığınızda aşağıdaki amaç ekstraları desteklenir:- Aşağıdaki kod örneğinde gösterildiği gibi,
EXTRA_RESULTS
intent'inden 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.
Kotlin
private const val SPEECH_REQUEST = 109 private fun displaySpeechRecognizer() { val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) startActivityForResult(intent, SPEECH_REQUEST) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) { val results: List<String>? = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) val spokenText = results?.get(0) // Do something with spokenText. } super.onActivityResult(requestCode, resultCode, data) }
Java
private static final int SPEECH_REQUEST = 109; 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); }
Uygulama ayrıntıları için örnek ses tanıma uygulamasını okuyun.
Anahtar kelimeler için ön yargı
Glass'taki konuşma tanıma özelliği, bir anahtar kelime listesi için taraflı olabilir. Ağırlıklandırma, anahtar kelime doğruluğunu artırır. Anahtar kelimelere ağırlık vermeyi etkinleştirmek için aşağıdakileri kullanın:
Kotlin
val keywords = arrayOf("Example", "Biasing", "Keywords") val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) intent.putExtra("recognition-phrases", keywords) startActivityForResult(intent, SPEECH_REQUEST)
Java
final String[] keywords = {"Example", "Biasing", "Keywords"}; Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra("recognition-phrases", keywords); startActivityForResult(intent, SPEECH_REQUEST);
Sesli komutlar
Sesli komutlar, kullanıcıların etkinliklerden işlem gerçekleştirmesine olanak tanır. Sesli komutlar, standart Android menü API'larıyla oluşturulur, ancak kullanıcılar dokunmak yerine sesli komutları kullanarak menü öğelerini çağırabilirler.
Belirli bir etkinlik için sesli komutları etkinleştirmek üzere şu adımları uygulayın:
- Sesli komutları etkinleştirmek için istediğiniz etkinlikte
getWindow().requestFeature(FEATURE_VOICE_COMMANDS)
numaralı telefonu arayın. Bu özellik etkinleştirildiğinde, odaklanılan her zaman ekranın sol alt köşesinde mikrofon simgesi görünür. - Uygulamanızda
RECORD_AUDIO
iznini isteyin. onCreatePanelMenu()
değerini geçersiz kılın ve bir menü kaynağını şişirin.- Algılanan sesli komutları işlemek için
onContextItemSelected()
değerini geçersiz kılın.
Kotlin
class VoiceCommandsActivity : AppCompatActivity() { companion object { const val FEATURE_VOICE_COMMANDS = 14 const val REQUEST_PERMISSION_CODE = 200 val PERMISSIONS = arrayOf(Manifest.permission.RECORD_AUDIO) val TAG = VoiceCommandsActivity::class.java.simpleName } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) window.requestFeature(FEATURE_VOICE_COMMANDS) setContentView(R.layout.activity_voice_commands) // Requesting permissions to enable voice commands menu ActivityCompat.requestPermissions( this, PERMISSIONS, REQUEST_PERMISSION_CODE ) } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { if (requestCode == REQUEST_PERMISSION_CODE) { for (result in grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "Permission denied. Voice commands menu is disabled.") } } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults) } } override fun onCreatePanelMenu(featureId: Int, menu: Menu): Boolean { menuInflater.inflate(R.menu.voice_commands_menu, menu) return true } override fun onContextItemSelected(item: MenuItem): Boolean { return when (item.itemId) { // Handle selected menu item R.id.edit -> { // Handle edit action true } else -> super.onContextItemSelected(item) } } }
Java
public class VoiceCommandsActivity extends AppCompatActivity { private static final String TAG = VoiceCommandsActivity.class.getSimpleName(); private static final int FEATURE_VOICE_COMMANDS = 14; private static final int REQUEST_PERMISSION_CODE = 200; private static final String[] PERMISSIONS = new String[]{Manifest.permission.RECORD_AUDIO}; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(FEATURE_VOICE_COMMANDS); setContentView(R.layout.activity_voice_commands); // Requesting permissions to enable voice commands menu ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_PERMISSION_CODE); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_PERMISSION_CODE) { for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "Permission denied. Voice commands menu is disabled."); } } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @Override public boolean onCreatePanelMenu(int featureId, @NonNull Menu menu) { getMenuInflater().inflate(R.menu.voice_commands_menu, menu); return true; } @Override public boolean onContextItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { // Handle selected menu item case R.id.edit: // Handle edit action return true; default: return super.onContextItemSelected(item); } } }
Aşağıda, önceki etkinlik tarafından kullanılan menü kaynağı örneği verilmiştir:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/delete" android:icon="@drawable/ic_delete" android:title="@string/delete"/> <item android:id="@+id/edit" android:icon="@drawable/ic_edit" android:title="@string/edit"/> <item android:id="@+id/find" android:icon="@drawable/ic_search" android:title="@string/find"/> </menu>
Tam bir örnek için örnek not alma uygulamasını okuyun.
Sesli komut listesi yeniden yükleniyor
Sesli komut listesini dinamik olarak yeniden yükleyebilirsiniz. Bunu yapmak için onCreatePanelMenu()
yönteminde menu
kaynağını değiştirin veya onPreparePanel()
yöntemindeki menü nesnesini değiştirin. Değişiklikleri uygulamak için invalidateOptionsMenu()
yöntemini çağırın.
Kotlin
private val options = mutableListOf<String>() fun onPreparePanel(featureId: Int, view: View?, menu: Menu): Boolean { if (featureId != FEATURE_VOICE_COMMANDS) { return super.onCreatePanelMenu(featureId, menu) } for (optionTitle in options) { menu.add(optionTitle) } return true } /** * Method showing example implementation of voice command list modification * * If you call [Activity.invalidateOptionsMenu] method, voice command list will be * reloaded (onCreatePanelMenu and onPreparePanel methods will be called). */ private fun modifyVoiceCommandList() { options.add("Delete") options.add("Play") options.add("Pause") invalidateOptionsMenu() }
Java
private final List<String> options = new ArrayList<>(); @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { if (featureId != FEATURE_VOICE_COMMANDS) { return super.onCreatePanelMenu(featureId, menu); } for (String optionTitle : options) { menu.add(optionTitle); } return true; } /** * Method showing example implementation of voice command list modification * * If you call {@link Activity#invalidateOptionsMenu()} method, voice command list will be * reloaded (onCreatePanelMenu and onPreparePanel methods will be called). */ private void modifyVoiceCommandList() { options.add("Delete"); options.add("Play"); options.add("Pause"); invalidateOptionsMenu(); }
AppCompatActivity çözümü
AppCompatActivity
uzantısını içeren bir etkinlikte sesli komut listesini yeniden yüklemek için reload-voice-commands
intent işlemiyle sendBroadcast()
yöntemini kullanın:
Kotlin
sendBroadcast(Intent("reload-voice-commands"))
Java
sendBroadcast(new Intent("reload-voice-commands"));
Sesli komutları çalışma zamanında etkinleştir ve devre dışı bırak
Sesli komutları çalışma zamanında etkinleştirebilir ve devre dışı bırakabilirsiniz. Bunu yapmak için onCreatePanelMenu()
yönteminden uygun bir değeri aşağıdaki gibi döndürün:
- Etkinleştirmek için değeri
true
olarak ayarlayın. - Devre dışı bırakmak için değeri
false
olarak ayarlayın.
Hata ayıklama modu
Sesli komutlarda hata ayıklama modunu etkinleştirmek için istediğiniz etkinlikte getWindow().requestFeature(FEATURE_DEBUG_VOICE_COMMANDS)
işlevini çağırın. Hata ayıklama modu aşağıdaki özellikleri etkinleştirir:
- Logcat, hata ayıklama için tanınan kelime öbeğini içeren günlüğü içerir.
- Aşağıdaki gibi, tanınmayan bir komut algılandığında kullanıcı arayüzü yer paylaşımı gösterilir:
Kotlin
class VoiceCommandsActivity : AppCompatActivity() { companion object { const val FEATURE_VOICE_COMMANDS = 14 const val FEATURE_DEBUG_VOICE_COMMANDS = 15 const val REQUEST_PERMISSION_CODE = 200 val PERMISSIONS = arrayOf(Manifest.permission.RECORD_AUDIO) val TAG = VoiceCommandsActivity::class.java.simpleName } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) window.requestFeature(FEATURE_VOICE_COMMANDS) window.requestFeature(FEATURE_DEBUG_VOICE_COMMANDS) setContentView(R.layout.activity_voice_commands) // Requesting permissions to enable voice commands menu ActivityCompat.requestPermissions( this, PERMISSIONS, REQUEST_PERMISSION_CODE ) } . . . }
Java
public class VoiceCommandsActivity extends AppCompatActivity { private static final String TAG = VoiceCommandsActivity.class.getSimpleName(); private static final int FEATURE_VOICE_COMMANDS = 14; private static final int FEATURE_DEBUG_VOICE_COMMANDS = 15; private static final int REQUEST_PERMISSION_CODE = 200; private static final String[] PERMISSIONS = new String[]{Manifest.permission.RECORD_AUDIO}; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(FEATURE_VOICE_COMMANDS); getWindow().requestFeature(FEATURE_DEBUG_VOICE_COMMANDS); setContentView(R.layout.activity_voice_commands); // Requesting permissions to enable voice commands menu ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_PERMISSION_CODE); } . . . }
Uygulama ayrıntıları için örnek sesli komutları yeniden yükleme uygulamasını okuyun.
Metin Okuma (TTS)
Metin Okuma işlevi, dijital metni sentezlenmiş konuşma çıkışına dönüştürür. Daha fazla bilgi için Android Geliştiricileri Dokümanları Metin Konuşma sayfasını ziyaret edin.
Glass EE2'de Google Metin Okuma motoru yüklüdür. Varsayılan TTS motoru olarak ayarlanır ve çevrimdışı çalışır.
Aşağıdaki yerel ayarlar Google Metin Okuma motoru ile birlikte sunulur:
Bengalce Mandarin Çincesi Çekçe Danca Almanca Yunanca İngilizce İspanyolca Estonca Fince Fransızca Guceratça Hintçe |
Macarca Endonezce İtalyanca Japonca Cava Avusturya Avusturya Kannada Korece Malayalam Norveççe Felemenkçe |
Lehçe Portekizce Rusça Slovakça Sunda dili İsveççe Tamil Telugu Tayca Türkçe Ukraynaca Vietnamca |
Kamera
Glass Enterprise Edition 2, f/2.4 diyafram, 4:3 sensör en boy oranına ve 83° diyagonal görüş alanına (yatay yönde 71° x 57°) sahip 8 megapiksel, sabit odaklı bir kamera içerir. Standart KameraX veya Kamera2 API'sini kullanmanızı öneririz.
Uygulama ayrıntıları için örnek kamera uygulamasını okuyun.
Kamera düğmesi
Kamera düğmesi, Glass Enterprise Edition 2 cihazının menteşesindeki fiziksel düğmedir.
Bu işlem, standart bir klavye işlemi gibi işlenebilir ve KeyEvent#KEYCODE_CAMERA
anahtar anahtarıyla tanımlanabilir.
OPM1.200313.001 OS güncellemesi sırasında, aşağıdaki işlemleri içeren nitelikler Başlatıcı uygulamasından gönderilir:
MediaStore#ACTION_IMAGE_CAPTURE
kamera düğmesine kısa basın.MediaStore#ACTION_VIDEO_CAPTURE
kamera düğmesine uzun basın.
Sensörler
Geliştiriciler, Glass EE2'de uygulama geliştirirken kullanılabilen çeşitli sensörler vardır.
Glass'ta aşağıdaki standart Android sensörleri desteklenir:
-
TYPE_ACCELEROMETER
-
TYPE_GRAVITY
-
TYPE_GYROSCOPE
-
TYPE_LIGHT
-
TYPE_LINEAR_ACCELERATION
-
TYPE_MAGNETIC_FIELD
-
TYPE_ORIENTATION
(kullanımdan kaldırıldı) -
TYPE_ROTATION_VECTOR
Aşağıdaki Android sensörleri Glass'ta desteklenmez:
Cam sensör koordinat sistemi aşağıdaki resimde gösterilmektedir. Cam ekranla göreli olarak değişir. Daha fazla bilgi için Sensör koordinat sistemi başlıklı makaleyi inceleyin.
İvme ölçer, jiroskop ve manyetometre, Glass cihazının optik kapsülünde bulunur. Kullanıcılar bu cihazı görüş açısına göre hizalar. Optik kapsülün açısını doğrudan ölçemezsiniz. Bu nedenle, pusula başlığı gibi uygulamalar için bu sensörlerden gelen açıları kullanırken dikkatli olun.
Pil ömrünü korumak için sensörleri yalnızca ihtiyacınız olduğunda dinleyin. Sensörleri dinlemeye ne zaman başlayacağınıza ve durduracağınıza karar verirken uygulamanın ihtiyaçlarını ve yaşam döngüsünü göz önünde bulundurun.
Sensör etkinliği geri çağırmaları kullanıcı arayüzü iş parçacığında çalıştığından etkinlikleri ve dönüşleri mümkün olduğunca hızlı bir şekilde işleyin. İşlem çok uzun sürüyorsa sensör etkinliklerini sıraya aktarın ve arka plandaki bir iş parçacığını kullanarak işleyin.
50 Hz, genellikle hareketin izlenmesi için yeterli bir örnekleme hızıdır.
Sensörlerin nasıl kullanılacağı hakkında daha fazla bilgi için Android geliştirici kılavuzuna bakın.
Konum hizmetleri
Glass Enterprise Edition 2 cihazı bir GPS modülüne sahip değildir ve kullanıcının konumunu sağlamaz. Ancak, uygulanan kablosuz bağlantı ağları ve Bluetooth cihazlarının listesini görüntülemek için gereken konum hizmetleri uygulanır.
Uygulamanız cihaz sahibi ayrıcalıklarına sahipse karşılık gelen güvenli ayarın değerini programatik olarak değiştirmek için uygulamanızı kullanabilirsiniz:
Kotlin
val devicePolicyManager = context .getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager if (devicePolicyManager.isDeviceOwnerApp(context.getPackageName())) { val componentName = ComponentName(context, MyDeviceAdmin::class.java) devicePolicyManager.setSecureSetting( componentName, Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_SENSORS_ONLY.toString() ) }
Java
final DevicePolicyManager devicePolicyManager = (DevicePolicyManager) context .getSystemService(Context.DEVICE_POLICY_SERVICE); if (devicePolicyManager.isDeviceOwnerApp(context.getPackageName())) { final ComponentName componentName = new ComponentName(context, MyDeviceAdmin.class); devicePolicyManager.setSecureSetting(componentName, Settings.Secure.LOCATION_MODE, String.valueOf(Settings.Secure.LOCATION_MODE_SENSORS_ONLY)); }
Üçüncü taraf bir MDM çözümü kullanıyorsanız MDM çözümünün sizin için bu ayarları değiştirebilmesi gerekir.