位置情報とセンサーデータには、標準の Android プラットフォーム API を提供します。
場所
Glass で位置情報を使用するには、標準の Android デバイスを使用する必要があります。 位置情報を利用可能な API から 位置情報プロバイダ
位置情報データを取得するには、次の Android SDK クラスを使用します。
LocationManager
~ Android 位置情報システム サービスへのアクセスを提供します やり取りを処理するLocationProvider
。LocationProvider
~ 特定の条件に基づいて位置情報を提供します。Glass には特別な「リモコン」がプロバイダ MyGlass とペア設定したデバイスから位置情報を取得できる機能 コンパニオン アプリがインストールされています。Criteria
~ 条件セットを作成して 設定された基準に基づいて最適なLocationProvider
が選択されます。
概要
位置情報を取得するには、
LocationManager
クラスを使って 1 つ以上の位置情報プロバイダからデータを取得してください。
Android スマートフォンまたはタブレット上のアプリは、位置情報をローカルから取得します。 デバイス上の GPS とネットワーク位置情報プロバイダ。ただし、Glass では 利用可能な一連の位置情報プロバイダは動的であり、remote が含まれる場合もあります。 位置情報プロバイダ MyGlass コンパニオン アプリがインストールされている Bluetooth でペア設定されたデバイスです。次のように 複数のプロバイダから位置情報の更新をリッスンし、 プロバイダを使用することです。
利用可能なすべての位置情報プロバイダにデータをリクエストするには:
Criteria
を作成する オブジェクトを宣言します。getProviders()
を呼び出す を使用して、条件を満たす有効なプロバイダのリストを取得します。- プロバイダのリストを反復処理し、すべてのプロバイダの更新をリクエストします。 これにより、リモート プロバイダがユーザーから提供されたときに、そのプロバイダから 近くのプロバイダからでも購入できます(ワイヤレス 接続します
各モジュールの精度とタイミングに関する情報を使用してください。 をアップデートして、アップデートが十分かどうかを判断し、 もう 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 を外した場合:
- 実装
BroadcastReceiver
処理する必要があります - サービスで、
onCreate()
メソッドを呼び出し、このイベントをリッスンするACTION_ON_HEAD_STATE_CHANGE
インテント。 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 センサーに対応しています。
TYPE_ACCELEROMETER
TYPE_GRAVITY
TYPE_GYROSCOPE
TYPE_LIGHT
TYPE_LINEAR_ACCELERATION
TYPE_MAGNETIC_FIELD
TYPE_ORIENTATION
(非推奨)TYPE_ROTATION_VECTOR
以下の Android センサーはサポートされていません。
で確認できます。Glass のセンサーを使用する際のヒントをご紹介します。
- 以下は、Glass のディスプレイを基準とした Glass センサーの座標系です。 詳細については、次をご覧ください: センサー座標系。
加速度計、ジャイロスコープ、磁力計は、Glass デバイスの光学ポッド上にあります。 ユーザーが視線に合わせてデバイスを回転させる機能です。次の目標は 直接光学ポッドの角度調整はできません。 これらのセンサーからの角度をコンパス方位などの用途に使用します。
バッテリーを長持ちさせるため、必要なときだけセンサーの音声を聞き取ります。たとえば、お使いの Glassware が
Service
を使用して、LiveCard
ライブカードが表示されているときにのみセンサーが必要な場合は、LiveCard
は、センサーのリッスンを開始および停止するコールバック メソッドを表示します。センサー イベントのコールバックは UI スレッドで実行されるため、イベントを処理して、 迅速に進めることができます。センサー イベントをキューにプッシュし、バックグラウンド スレッドを使用することを検討する 時間をかける必要はないでしょう
多くの場合、頭の動きを追跡するには 50 Hz で十分なサンプリング レートです。
センサーの使用方法の詳細については、 Android デベロッパー ガイド