Standart Android platform API'lerini kullanarak konum ve sensör verilerine erişirsiniz.
Konum
Glass'ta konum özelliği, mevcut konum sağlayıcılardan konum verisi almak için standart Android platformu API'lerini kullanır.
Konum verilerini almak için aşağıdaki Android SDK sınıflarını kullanacaksınız:
LocationManager
:LocationProvider
ile iletişimi sağlayan Android konum sistemi hizmetine erişim sağlar.LocationProvider
– Bazı ölçütleri temel alarak konum verilerini sağlar. Glass, MyGlass tamamlayıcı uygulamasının yüklü olduğu eşlenen bir cihazdan konum verilerini almanıza olanak tanıyan özel "uzaktan" sağlayıcılar sağlar.Criteria
– Belirlediğiniz ölçütlere göre en iyiLocationProvider
grubunu seçecek bir dizi ölçüt oluşturmanızı sağlar.
Genel bakış
Konum verilerini almak için bir veya daha fazla konum sağlayıcıdan veri almak üzere LocationManager
sınıfını kullanmanız gerekir.
Bir Android telefon veya tabletteki uygulamalar, cihazdaki yerel GPS ve ağ konumu sağlayıcılarından konum verilerini alır. Ancak Glass'ta kullanılabilen konum sağlayıcıları grubu dinamiktir ve MyGlass tamamlayıcı uygulamasının yüklü olduğu Bluetooth üzerinden eşlenen bir cihaz gibi başka bir kaynaktan konum verileri sağlayan uzaktan konum sağlayıcıları içerebilir. Bu ek sağlayıcıları yönetmek için tek bir sağlayıcı yerine birden fazla sağlayıcının konum güncellemelerini dinleyin.
Tüm mevcut konum sağlayıcılardan veri istemek için:
- Konum gereksinimlerinizle bir
Criteria
nesnesi oluşturun. - Ölçütlerinizi karşılayan etkin sağlayıcıların listesini almak için
getProviders()
yöntemini çağırın. - Sağlayıcı listesi üzerinde yineleyin ve tüm sağlayıcılardan güncelleme isteyin. Böylece, uzak sağlayıcılardan güncellemeler varsa bunları, aynı zamanda Glass'taki yerel sağlayıcılardan (kablosuz ağ sağlayıcı gibi) alabilirsiniz.
Güncellemenin yeterince iyi olup olmadığını veya başka bir güncellemeyi beklemeniz gerekip gerekmediğini belirlemek için her güncellemede sağlanan doğruluk ve zamanlama bilgilerini kullanın.
LocationManager locationManager; // initialized elsewhere // This example requests fine accuracy and requires altitude, but // these criteria could be whatever you want. Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(true); List<String> providers = locationManager.getProviders( criteria, true /* enabledOnly */); for (String provider : providers) { locationManager.requestLocationUpdates(provider, minTime, minDistance, listener); }
Sensörler
Bardak
Glass, cihazın kullanıcıların kafasında olup olmadığını algılamak için özel bir sensöre sahiptir. Bu ayar etkinleştirildiğinde, cihaz kullanımda değilken pil tasarrufu sağlar. Arka plan hizmetlerini devre dışı bırakmak veya kısıtlamak için bu özelliği Glassware'inizde kullanabilirsiniz. ACTION_ON_HEAD_STATE_CHANGE
etkinliklerini algılamak için BroadcastReceiver
uygulayarak başlayın.
Aşağıdaki örnek, kullanıcının Glass'ı kafasından kaldırıp kaldırmadığına bağlı olarak oyun skoru güncellemelerini geciktirir ve devre dışı bırakır:
- Durum değişikliğini işlemek için bir
BroadcastReceiver
uygulayın. - Hizmetinizde
onCreate()
yöntemini uygulayın veACTION_ON_HEAD_STATE_CHANGE
amacını işleyen bir alıcı kaydedin. onDestroy()
yönteminde alıcının kaydını iptal edin.import com.google.android.glass.content.Intents; ... public class LiveCardService extends Service { ... private boolean mIsStopped = false; private final BroadcastReceiver broadCastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intents.ACTION_ON_HEAD_STATE_CHANGED.equals(intent.getAction())) { boolean onHead = intent.getBooleanExtra(Intents.EXTRA_IS_ON_HEAD, false); if (onHead) { mDelay = LiveCardService.DELAY_MILLIS; if (isStopped()) { // Resume updating scores setStop(false); // Restart immediately to get a refreshed score mHandler.postDelayed(mUpdateLiveCardRunnable, 0); } } else { // Increase the delay when the device is off head mDelay = LiveCardService.DELAY_MILLIS_EXT; } } } }; private final Runnable mUpdateLiveCardRunnable = new Runnable() { @Override public void run() { if (mDelay == DELAY_MILLIS_EXT) { // Count the increased delay as a retry attempt mRetryCount++; } else if (mDelay == DELAY_MILLIS) { mRetryCount = 0; } if (mRetryCount > MAX_RETRIES) { // Stop updating scores mIsStopped = true; } if (!isStopped()) { // Generate fake points. homeScore += mPointsGenerator.nextInt(3); awayScore += mPointsGenerator.nextInt(3); // Update the remote view with the new scores. mLiveCardView = getRemoteViews(homeScore, awayScore); // Always call setViews() to update the live card's RemoteViews. mLiveCard.setViews(mLiveCardView); // Queue another score update in 30 seconds. mHandler.postDelayed(mUpdateLiveCardRunnable, mDelay); } } }; @Override public void onCreate() { super.onCreate(); mPointsGenerator = new Random(); mDelay = DELAY_MILLIS; registerReceiver(broadCastReceiver, new IntentFilter( Intents.ACTION_ON_HEAD_STATE_CHANGED)); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (mLiveCard == null) { // Get an instance of a live card mLiveCard = new LiveCard(this, LIVE_CARD_TAG); // Inflate a layout into a remote view mLiveCardView = new RemoteViews(getPackageName(), R.layout.live_card); // Set up initial RemoteViews values homeScore = 0; awayScore = 0; mLiveCardView = getRemoteViews(homeScore, awayScore); // Set up the live card's action with a pending intent // to show a menu when tapped Intent menuIntent = new Intent(this, LiveCardMenuActivity.class); menuIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); mLiveCard.setAction(PendingIntent.getActivity( this, 0, menuIntent, 0)); // Publish the live card mLiveCard.publish(PublishMode.REVEAL); // Queue the update text runnable mHandler.post(mUpdateLiveCardRunnable); } return START_STICKY; } @Override public void onDestroy() { if (mLiveCard != null && mLiveCard.isPublished()) { //Stop the handler from queuing more Runnable jobs setStop(true); mLiveCard.unpublish(); mLiveCard = null; } unregisterReceiver(broadCastReceiver); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } private RemoteViews getRemoteViews(int homeScore, int awayScore) { RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.live_card); remoteViews.setTextViewText(R.id.home_team_name_text_view, getString(R.string.home_team)); remoteViews.setTextViewText(R.id.away_team_name_text_view, getString(R.string.away_team)); remoteViews.setTextViewText(R.id.footer_text, getString(R.string.game_quarter)); remoteViews.setTextViewText(R.id.home_score_text_view, String.valueOf(homeScore)); remoteViews.setTextViewText(R.id.away_score_text_view, String.valueOf(awayScore)); return remoteViews; } public boolean isStopped() { return mIsStopped; } public void setStop(boolean isStopped) { mIsStopped = isStopped; } }
Android
Aşağıdaki Android sensörleri Glass'ta desteklenmektedir:
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 desteklenmiyor:
Aşağıda, sensörleri Glass'ta kullanırken yararlanabileceğiniz bazı ipuçları verilmiştir:
- Glass sensörünün koordinat sistemi, cam ekranına göre aşağıda gösterilir. Daha fazla bilgi için sensör koordinat sistemini inceleyin.
İvme ölçer, jiroskop ve manyetometre, kullanıcıların cihazı cihazıyla hizalamak için döndürdüğü optik kapsülde yer alır. 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 ihtiyaç duyduğunuzda dinleyin. Örneğin, Glassware bir
Service
kullanarakLiveCard
kullanıyorsa ve sensörlere yalnızca canlı kartın göründüğü durumlarda ihtiyaç duyuyorsanız sensörleri dinlemeye başlamak ve durdurmak içinLiveCard
yüzey geri çağırma yöntemlerini kullanın.Sensör etkinliği geri çağırmaları kullanıcı arayüzü iş parçacığında çalıştığından etkinlikleri en kısa sürede işleyip geri dönün. Sensör etkinliklerini sıraya koymayı ve işlenmesiniz çok uzun sürerse bunları işlemek için bir arka plan iş parçacığı kullanmayı değerlendirin.
50 Hz genellikle kafa hareketinin izlenmesi için yeterli bir örnekleme hızıdır.
Sensörleri kullanma hakkında daha fazla bilgi için Android geliştirici kılavuzuna bakın.