位置情報とセンサー

位置情報とセンサーデータには、標準の Android プラットフォーム API を提供します。

場所

Glass で位置情報を使用するには、標準の Android デバイスを使用する必要があります。 位置情報を利用可能な API から 位置情報プロバイダ

位置情報データを取得するには、次の Android SDK クラスを使用します。

  • LocationManager~ Android 位置情報システム サービスへのアクセスを提供します やり取りを処理する LocationProvider

  • LocationProvider~ 特定の条件に基づいて位置情報を提供します。Glass には特別な「リモコン」がプロバイダ MyGlass とペア設定したデバイスから位置情報を取得できる機能 コンパニオン アプリがインストールされています。

  • Criteria~ 条件セットを作成して 設定された基準に基づいて最適な LocationProvider が選択されます。

概要

位置情報を取得するには、 LocationManager クラスを使って 1 つ以上の位置情報プロバイダからデータを取得してください。

Android スマートフォンまたはタブレット上のアプリは、位置情報をローカルから取得します。 デバイス上の GPS とネットワーク位置情報プロバイダ。ただし Glass では、 利用可能な一連の位置情報プロバイダは動的であり、remote が含まれる場合もあります。 位置情報プロバイダ MyGlass コンパニオン アプリがインストールされている Bluetooth でペア設定されたデバイスです。次のように 複数のプロバイダから位置情報の更新をリッスンし、 プロバイダを使用することです。

利用可能なすべての位置情報プロバイダにデータをリクエストするには:

  1. Criteria を作成する オブジェクトを宣言します。
  2. getProviders() を呼び出す を使用して、条件を満たす有効なプロバイダのリストを取得します。
  3. プロバイダのリストを反復処理し、すべてのプロバイダの更新をリクエストします。 これにより、リモート プロバイダがユーザーから提供されたときに、そのプロバイダから 近くのプロバイダからでも購入できます(ワイヤレス 接続します
  4. 各モジュールの精度とタイミングに関する情報を使用してください。 をアップデートして、アップデートが十分かどうかを判断し、 もう 1 つ待ちましょう

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

センサー

Glass

Glass には、デバイスが壁に設置されているかどうかを検出する専用のセンサーが備わっています。 ユーザーあります。この設定を有効にすると、デバイスでのバッテリーの節約に役立ちます 使用されていません。Glassware では、この機能を使用して、 スロットリングするようにします。まず、 BroadcastReceiver 検出する ACTION_ON_HEAD_STATE_CHANGE できます。

次の例では、変更の有無に応じてゲームスコアの更新を遅延させ、無効にします ユーザーが頭から Glass を外した場合:

  1. 実装 BroadcastReceiver 処理する必要があります
  2. サービスで、 onCreate() メソッドを呼び出し、このイベントをリッスンする ACTION_ON_HEAD_STATE_CHANGE インテント。
  3. onDestroy() メソッドを呼び出し、レシーバの登録を解除します。

    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

Glass は次の Android センサーに対応しています。

以下の Android センサーはサポートされていません。

で確認できます。

Glass のセンサーを使用する際のヒントをご紹介します。

  • 以下は、Glass のディスプレイを基準とした Glass センサーの座標系です。 詳細については、次をご覧ください: センサー座標系

  • 加速度計、ジャイロスコープ、磁力計は、Glass デバイスの光学ポッド上にあります。 ユーザーが視線に合わせてデバイスを回転させる機能です。次の目標は 直接光学ポッドの角度調整はできません。 これらのセンサーからの角度をコンパス方位などの用途に使用します。

  • バッテリーを長持ちさせるため、必要なときだけセンサーの音を聞き取ります。たとえば、お使いの Glassware が Service を使用して、 LiveCard ライブカードが表示されているときにのみセンサーが必要な場合は、 LiveCard は、センサーのリッスンを開始および停止するコールバック メソッドを表示します。

  • センサー イベントのコールバックは UI スレッドで実行されるため、イベントを処理して、 迅速に進めることができます。センサー イベントをキューにプッシュし、バックグラウンド スレッドを使用することを検討する 時間をかける必要はないでしょう

  • 多くの場合、頭の動きを追跡するには 50 Hz で十分なサンプリング レートです。

センサーの使用方法の詳細については、 Android デベロッパー ガイド