Konumlar ve Sensörler

Konum ve sensör verilerine standart Android kullanarak erişebilirsiniz. platform API'leri için de geçerlidir.

Konum

Glass'ta konum, standart Android Mevcut konum verilerini almak için kullanılan platform API'leri konum sağlayıcıları.

Konum verilerini almak için aşağıdaki Android SDK sınıflarını kullanacaksınız:

  • LocationManager - Android konum sistemi hizmetine erişim sağlar büyük ölçekli LocationProvider.

  • LocationProvider - Bazı ölçütlere dayalı olarak konum verileri sağlar. Glass, özel "uzaktan" özelliği sağlar sağlayıcılar MyGlass özellikli eşlenmiş bir cihazdan konum verileri almanıza olanak tanır tamamlayıcı uygulama yüklendi.

  • Criteria - Hedeflerinizi ve teslimatlarınızı, belirlediğiniz ölçütlere göre en iyiyi LocationProvider seçer.

Genel Bakış

Konum verilerini almak için, LocationManager sınıfını kullanarak bir veya daha fazla konum sağlayıcıdan veri alın.

Android telefon veya tabletteki uygulamalar, konum verilerini yerel cihazlardan alır Cihazdaki GPS ve ağ konumu sağlayıcıları. Ancak Glass'ta kullanılabilir konum sağlayıcıları grubu dinamiktir ve uzaktan içerebilir başka bir kaynaktan konum verileri sağlayan konum sağlayıcılar (örneğin, MyGlass tamamlayıcı uygulamasının yüklü olduğu, Bluetooth üzerinden eşlenmiş cihaz. İşlenecek Bu ek sağlayıcılar, birden fazla sağlayıcının konum güncellemelerini dinleyin sağlayıcı yerine sağlayıcılarını kullanıyor.

Mevcut tüm konum sağlayıcılardan veri istemek için:

  1. Bir Criteria oluşturun oluşturmanız gerekir.
  2. getProviders() numaralı telefonu arayın seçeneğini tıklayarak ölçütlerinizi karşılayan etkin sağlayıcıların listesini alabilirsiniz.
  3. Sağlayıcı listesini yineleyin ve sağlayıcıların tümünden güncelleme isteyin. Bu sayede, uzaktaki sağlayıcılardan Bard'daki yerel sağlayıcılardan da (örneğin, kablosuz bağlantı ağ sağlayıcısı) ekleyebilirsiniz.
  4. Her videoda sağlanan doğruluk ve zamanlama bilgilerini kullanın iyi bir güncelleme olup olmadığını belirlemek için bir tane daha bekleyin.

    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

Cam

Glass, cihazın burada olup olmadığını algılamak için özel bir sensöre sahiptir kullanıcıların kafa. Bu ayar etkinleştirildiğinde, cihaz kullanılmıyor. Google Glassware'inizdeki bu özelliği, devre dışı bırakmak veya arka plan hizmetlerini kısıtlayabilir. Bir BroadcastReceiver algılamak ACTION_ON_HEAD_STATE_CHANGE etkinlikler.

Aşağıdaki örnekte, kullanıcı Glass'ı kafasından kaldırmıştır:

  1. Uygulama BroadcastReceiver gereken adımları uygulayın.
  2. Hizmetinizde onCreate() yöntemini dinleyen bir alıcıyı kaydedin ve ACTION_ON_HEAD_STATE_CHANGE amacı.
  3. onDestroy() 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 desteklenir:

Aşağıdaki Android sensörleri desteklenmez:

ziyaret edin.

Glass'ta sensörleri kullanmayla ilgili bazı ipuçlarını aşağıda bulabilirsiniz:

  • Glass sensör koordinat sistemi, Glass ekrana göre aşağıda gösterilmektedir. Daha fazla bilgi için bkz. sensör koordinat sistemi.

  • İvme ölçer, jiroskop ve manyetometre, Glass cihazın optik kapsülünde yer alır. Ekran görüntüsünde, kullanıcılar cihazı döndürebilir. açısını doğru ayarlamanız gerekir. Bu nedenle, ve pusula yönü gibi uygulamalar için bu sensörlerden gelen açıları kullanarak.

  • Pil ömrünü korumak için sensörleri yalnızca ihtiyaç duyduğunuzda dinleyin. Örneğin, Bardak oluşturmak için Service kullanır. LiveCard Sensörlere yalnızca canlı kart göründüğünde ihtiyaç duyuyorsanız, LiveCard, sensörleri dinlemeyi başlatmak ve durdurmak için geri çağırma yöntemlerini gösterir.

  • Sensör etkinliği geri çağırmaları, UI iş parçacığı üzerinde çalışır. Bu nedenle etkinlikleri işleyip hızlı teslim etmek üzerine. Sensör etkinliklerini sıraya aktarabilir ve arka plan iş parçacığı kullanabilirsiniz. çok uzun sürerse bunları ele almanız gerekir.

  • 50 Hz genellikle baş hareketini izlemek 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ılavuzu.