使用標準 Android 裝置存取位置和感應器資料 平台 API
位置
Glass 上的位置是指使用標準 Android 裝置 平台 API 會從 或稱為「定位服務供應商」。
您將使用下列 Android SDK 類別取得位置資料:
LocationManager
- 提供 Android 定位系統服務的存取權 容器會處理與LocationProvider
。LocationProvider
- 根據某些條件提供位置資料。Glass 提供特殊的「遙控器」提供者 :從搭載 MyGlass 的配對裝置取得位置資料。 已安裝隨附應用程式。Criteria
- 可讓你設定一組條件 會根據您設定的條件選取最合適的LocationProvider
。
總覽
如要取得位置資料,您必須使用
LocationManager
敬上
類別,從一個或多個位置提供商取得資料。
Android 手機或平板電腦上的應用程式會從本機 裝置上的 GPS 和網路位置供應商。不過在 Glass 上, 可用的定位提供者是動態的,且可能包括 remote 提供其他來源位置資料的供應商,例如 已安裝 MyGlass 隨附應用程式的藍牙配對裝置。處理 這些額外供應商,監聽多個供應商的位置更新 而非單一供應商。
如要向所有可用的定位服務供應商要求資料,請按照下列步驟操作:
- 建立
Criteria
將物件連結至位置需求 - 呼叫
getProviders()
來擷取符合條件的已啟用供應商清單。 - 反覆查看供應商清單,並要求所有供應商更新。 這樣可確保您收到來自遠端供應商的更新 也有 Google Glass 的當地供應商 (例如無線通訊) 網路供應商)。
使用 更新以判斷更新內容是否足夠,或者 等待其他開始。
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 具有特殊的感應器,可偵測裝置是否處於
使用者。啟用時,這項設定可節省裝置電力
未使用任何資源。您可以使用 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 裝置的光學 Pod 上 讓裝置隨著視角旋轉您無法測量 所以請留意 利用這些感應器所提供的角度,例如指南針方向。
為延長電池續航力,請只在你需要時監聽感應器的聲音。舉例來說,如果您的 Glassware 會使用
Service
LiveCard
您只需要在顯示即時資訊卡的情況下使用感應器LiveCard
可呈現用來開始和停止監聽感應器的回呼方法。感應器事件回呼會在 UI 執行緒上執行,因此處理事件並傳回 請考慮將感應器事件推送至佇列並使用背景執行緒 來處理延遲。
50 Hz 通常是足以追蹤頭部動作的取樣率。
如要進一步瞭解如何使用感應器,請參閱 Android 開發人員指南。