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 einerLocationProvider
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 besteLocationProvider
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:
Criteria
erstellen -Objekt mit Ihren Standortanforderungen.getProviders()
anrufen um die Liste der aktivierten Anbieter abzurufen, die Ihren Kriterien entsprechen.- 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.
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:
- Implementieren Sie ein
BroadcastReceiver
um die Zustandsänderung zu verarbeiten. - Implementieren Sie das Tag
onCreate()
und registrieren Sie einen Empfänger, derACTION_ON_HEAD_STATE_CHANGE
Intent. 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:
TYPE_ACCELEROMETER
TYPE_GRAVITY
TYPE_GYROSCOPE
TYPE_LIGHT
TYPE_LINEAR_ACCELERATION
TYPE_MAGNETIC_FIELD
TYPE_ORIENTATION
(eingestellt)TYPE_ROTATION_VECTOR
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 einLiveCard
und Sie die Sensoren nur benötigen, wenn die Live-Karte sichtbar ist, verwenden Sie dieLiveCard
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