Vous accédez aux données de localisation et aux données des capteurs de plate-forme de développement.
Lieu
La localisation sur Glass implique l'utilisation de l'application Android standard API de plate-forme pour obtenir les données de localisation fournisseurs de services de localisation.
Vous utiliserez les classes SDK Android suivantes pour obtenir les données de localisation:
LocationManager
– Fournit l'accès au service du système de localisation Android. qui gère la communication avecLocationProvider
LocationProvider
– Fournit des données de localisation en fonction de certains critères. Les Google Glass offrent une "télécommande" spéciale fournisseurs qui vous permettent d'obtenir des données de localisation à partir d'un appareil associé doté de l'appareil application associée installée.Criteria
– vous permet de créer un ensemble de critères sélectionne le meilleurLocationProvider
en fonction des critères que vous définissez.
Présentation
Pour obtenir les données de localisation, vous devez utiliser le
LocationManager
pour obtenir les données d'un ou de plusieurs fournisseurs de localisation.
Les applications d'un téléphone ou d'une tablette Android récupèrent les données de localisation de l'appareil GPS et fournisseurs de localisation réseau sur l'appareil. Sur les Google Glass, l'ensemble de fournisseurs de géolocalisation disponible est dynamique et peut inclure des adresses distantes fournisseurs de services de localisation qui fournissent des données de localisation à partir d'une autre source, comme un Appareil associé par Bluetooth à l'application associée MyGlass installée À gérer ces fournisseurs supplémentaires, écoutez les mises à jour de plusieurs fournisseurs plutôt qu'un fournisseur unique.
Pour demander des données à tous les fournisseurs de localisation disponibles:
- Créer un
Criteria
avec vos exigences de localisation. - Appeler
getProviders()
pour récupérer la liste des fournisseurs activés qui répondent à vos critères. - Itérer la liste des fournisseurs et demander des mises à jour à chacun d'eux Cela vous permet de recevoir les mises à jour de la part des fournisseurs distants mais aussi auprès des fournisseurs locaux sur les lunettes Glass (comme via votre opérateur de téléphonie mobile).
Utilisez les informations de précision et de synchronisation fournies avec chaque pour déterminer si elle est suffisante ou si vous devez attendez-en une autre.
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); }
Capteurs
Verre
Les lunettes Glass sont équipées d'un capteur spécialisé qui détecte si l'appareil est placé sur la
des utilisateurs sur la tête. Lorsqu'il est activé, ce paramètre permet d'économiser la batterie lorsque l'appareil
n'est pas utilisée. Vous pouvez utiliser cette fonctionnalité dans votre Glassware pour désactiver ou
limitent les services d'arrière-plan. Commencez par implémenter
BroadcastReceiver
pour détecter
ACTION_ON_HEAD_STATE_CHANGE
événements.
L'exemple suivant retarde et désactive les mises à jour des scores de match selon que l'utilisateur a retiré les lunettes Glass de sa tête:
- Implémentez un
BroadcastReceiver
pour gérer le changement d'état. - Dans votre service, implémentez la méthode
onCreate()
et enregistrer un récepteur qui écoute IntentACTION_ON_HEAD_STATE_CHANGE
Dans
onDestroy()
, annulez l'enregistrement du récepteur.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
Les capteurs Android suivants sont compatibles avec les lunettes Glass:
TYPE_ACCELEROMETER
TYPE_GRAVITY
TYPE_GYROSCOPE
TYPE_LIGHT
TYPE_LINEAR_ACCELERATION
TYPE_MAGNETIC_FIELD
TYPE_ORIENTATION
(obsolète)TYPE_ROTATION_VECTOR
Les capteurs Android suivants ne sont pas compatibles:
Voici quelques conseils concernant l'utilisation des capteurs sur les Google Glass:
- Le système de coordonnées du capteur Glass est illustré ci-dessous par rapport à l'écran Glass. Pour en savoir plus, consultez système de coordonnées des capteurs.
L'accéléromètre, le gyroscope et le magnétomètre sont situés sur le pod optique des lunettes Glass, que les utilisateurs font pivoter pour aligner l’appareil avec leur vision. Vous ne pouvez pas mesurer du module d'optique. Tenez-en compte lorsque vous utilisant les angles de ces capteurs pour des applications telles que la direction d'une boussole.
Pour préserver l'autonomie de la batterie, n'écoutez les capteurs que lorsque vous en avez besoin. Par exemple, si votre appareil Glassware utilise un
Service
pour afficherLiveCard
et que vous n'avez besoin des capteurs que lorsque la carte en direct est visible, utilisezLiveCard
des méthodes de rappel de surface pour démarrer et arrêter l'écoute des capteursLes rappels d'événements de capteurs s'exécutent sur le thread UI. Par conséquent, traitez les événements et les renvoyez en tant que le plus rapidement possible. Envisagez de placer les événements de capteurs dans une file d'attente et d'utiliser un thread en arrière-plan. pour les gérer si le traitement prend trop de temps.
Un taux d'échantillonnage de 50 Hz est souvent suffisant pour suivre le mouvement de la tête.
Pour en savoir plus sur l'utilisation des capteurs, consultez les Guide du développeur Android