Standorte und Sensoren

Sie greifen über die Standard-Android-App auf Standort- und Sensordaten zu. Plattform-APIs.

Standort

Die Standortermittlung in Glass erfordert die Verwendung der standardmäßigen Android- Plattform-APIs verwenden, um Standortdaten von verfügbaren Standortanbieter.

Zum Abrufen von Standortdaten verwenden Sie die folgenden Android SDK-Klassen:

  • LocationManager – Bietet Zugriff auf den Android-Dienst für das Standortsystem das die Kommunikation mit einer LocationProvider

  • LocationProvider – Stellt Standortdaten basierend auf bestimmten Kriterien bereit. Glass bietet eine spezielle "Fernbedienung", Anbieter mit denen Sie Standortdaten von einem gekoppelten Gerät mit MyGlass abrufen können Companion-App installiert ist.

  • Criteria – Sie können eine Reihe von Kriterien erstellen, wählt anhand der von Ihnen festgelegten Kriterien die beste LocationProvider aus.

Übersicht

Um Standortdaten zu erhalten, müssen Sie die Methode LocationManager , um Daten von einem oder mehreren Standortanbietern abzurufen.

Apps auf einem Android-Telefon oder -Tablet rufen Standortdaten von lokalen GPS- und Netzwerkstandortanbieter auf dem Gerät. Bei Glass hingegen zeigt der Die Auswahl der verfügbaren Standortanbieter ist dynamisch, z. B. remote Standortanbieter, die Standortdaten aus einer anderen Quelle bereitstellen, z. B. Ein mit Bluetooth gekoppeltes Gerät, auf dem die MyGlass-Companion-App installiert ist Verarbeitung diese zusätzlichen Anbieter nutzen, warten Sie auf Standortaktualisierungen von mehreren Anbietern anstatt auf einen einzigen Anbieter.

So fordern Sie Daten von allen verfügbaren Standortanbietern an:

  1. Criteria erstellen -Objekt mit Ihren Standortanforderungen.
  2. getProviders() anrufen um die Liste der aktivierten Anbieter abzurufen, die Ihren Kriterien entsprechen.
  3. Durchlaufen Sie die Liste der Anbieter und fordern Sie Aktualisierungen von allen an. So erhalten Sie Updates von den Remote-Anbietern, falls diese sondern auch bei den lokalen Glass-Anbietern (z. B. Netzanbieter.
  4. Verwenden Sie die Genauigkeit und Zeitinformationen, die in jedem um zu ermitteln, ob das Update gut genug ist oder noch einen warten.

    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);
    }
    

Sensoren

Glas

Glass ist mit einem speziellen Sensor ausgestattet, der erkennt, ob sich das Gerät auf dem des Nutzers head. Wenn diese Einstellung aktiviert ist, wird der Akku geschont, wenn das Gerät wird nicht verwendet. Mit dieser Funktion in Ihrer Glassware können Sie Hintergrunddienste drosseln. Beginnen Sie mit der Implementierung eines BroadcastReceiver zum Erkennen von ACTION_ON_HEAD_STATE_CHANGE Ereignisse.

Im folgenden Beispiel werden Aktualisierungen von Spielständen verzögert und deaktiviert, je nachdem, Der Nutzer hat Glass vom Kopf entfernt:

  1. Implementieren Sie ein BroadcastReceiver um die Zustandsänderung zu verarbeiten.
  2. Implementieren Sie das Tag onCreate() und registrieren Sie einen Empfänger, der ACTION_ON_HEAD_STATE_CHANGE Intent.
  3. Im onDestroy() , um die Registrierung des Empfängers aufzuheben.

    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

Die folgenden Android-Sensoren werden von Glass unterstützt:

Die folgenden Android-Sensoren werden nicht unterstützt:

Hier einige Tipps zur Verwendung von Glass-Sensoren:

  • Unten sehen Sie das Koordinatensystem des Glass-Sensors relativ zum Glass-Display. Weitere Informationen finden Sie unter Sensorkoordinatensystem verwenden.

  • Beschleunigungsmesser, Gyroskop und Magnetometer befinden sich auf dem optischen Pod des Glass-Geräts. bei dem die Nutzenden das Gerät drehen. Sie können die direkter Winkel des Optikgehäuses. Das sollten Sie beachten, und die Winkel dieser Sensoren für Anwendungen wie die Kompassausrichtung nutzen.

  • Zur Schonung des Akkus solltest du auf Sensoren achten, die du wirklich brauchst. Wenn Ihre Glassware zum Beispiel verwendet Service, um ein LiveCard und Sie die Sensoren nur benötigen, wenn die Live-Karte sichtbar ist, verwenden Sie die LiveCard blendet Callback-Methoden ein, mit denen die Überwachung der Sensoren gestartet und beendet werden kann.

  • Sensorereignis-Callbacks werden im UI-Thread ausgeführt. Daher werden Ereignisse verarbeitet und als schnell wie möglich. Sensorereignisse in eine Warteschlange verschieben und einen Hintergrundthread verwenden wenn die Verarbeitung zu lange dauert.

  • 50 Hz ist häufig eine ausreichende Abtastrate, um Kopfbewegungen zu erfassen.

Weitere Informationen zur Verwendung von Sensoren findest du in den Android-Entwicklerleitfaden