Localisation et capteurs

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 avec LocationProvider

  • 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 meilleur LocationProvider 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:

  1. Créer un Criteria avec vos exigences de localisation.
  2. Appeler getProviders() pour récupérer la liste des fournisseurs activés qui répondent à vos critères.
  3. 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).
  4. 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:

  1. Implémentez un BroadcastReceiver pour gérer le changement d'état.
  2. Dans votre service, implémentez la méthode onCreate() et enregistrer un récepteur qui écoute Intent ACTION_ON_HEAD_STATE_CHANGE
  3. 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:

Les capteurs Android suivants ne sont pas compatibles:

Voici quelques conseils concernant l'utilisation des capteurs sur les Google Glass:

  • 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 afficher LiveCard et que vous n'avez besoin des capteurs que lorsque la carte en direct est visible, utilisez LiveCard des méthodes de rappel de surface pour démarrer et arrêter l'écoute des capteurs

  • Les 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