Konumlar ve Sensörler

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 iyi LocationProvider 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:

  1. Konum gereksinimlerinizle bir Criteria nesnesi oluşturun.
  2. Ölçütlerinizi karşılayan etkin sağlayıcıların listesini almak için getProviders() yöntemini çağırın.
  3. 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.
  4. 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:

  1. Durum değişikliğini işlemek için bir BroadcastReceiver uygulayın.
  2. Hizmetinizde onCreate() yöntemini uygulayın ve ACTION_ON_HEAD_STATE_CHANGE amacını işleyen bir alıcı kaydedin.
  3. 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:

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 kullanarak LiveCard 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çin LiveCard 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.