표준 Android를 사용하여 위치 및 센서 데이터에 액세스합니다. 사용할 수 있습니다
위치
Glass에서의 위치는 표준 Android 사용과 관련됩니다. 플랫폼 API를 사용하여 사용 가능한 위치 정보 제공자
다음 Android SDK 클래스를 사용하여 위치 데이터를 가져옵니다.
LocationManager
~ Android 위치 시스템 서비스에 대한 액세스를 제공합니다. kube-apiserver와 통신하는 것을LocationProvider
LocationProvider
~ 일부 기준에 따라 위치 데이터를 제공합니다. Glass는 특수한 '리모컨'을 제공함 제공업체 MyGlass가 있고 페어링된 기기에서 위치 데이터를 얻을 수 있는 호환 앱이 설치되었습니다.Criteria
~ 이 기능을 이용하면 설정한 기준에 따라 최적의LocationProvider
를 선택합니다.
개요
위치 데이터를 얻으려면
LocationManager
드림
클래스를 사용하여 하나 이상의 위치 제공자에서 데이터를 가져옵니다.
Android 휴대전화나 태블릿의 애플리케이션이 로컬의 위치 데이터를 가져옵니다. 기기의 GPS 및 네트워크 위치 정보 제공자 하지만 Glass에서는 사용 가능한 위치 정보 제공자는 동적이며 remote를 포함할 수 있음 다른 소스의 위치 데이터를 제공하는 위치 제공자(예: MyGlass 호환 앱이 설치된 블루투스 페어링 기기 처리 방법 여러 제공업체에서 위치 업데이트를 수신 대기하려면 여러 제공업체가 있습니다.
사용 가능한 모든 위치 정보 제공자에 데이터를 요청하려면 다음 단계를 따르세요.
Criteria
만들기 객체를 위치 요구사항과 함께 조정하세요.getProviders()
를 호출합니다. 클릭하여 기준을 충족하는 사용 설정된 제공업체 목록을 검색합니다.- 제공업체 목록을 반복하고 모든 제공업체로부터 업데이트를 요청합니다. 이렇게 하면 원격 제공업체가 다음에 해당하는 경우 업데이트를 받을 수 있습니다. 또한 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에는 기기가 켜져 있는지 감지하는 특수 센서가 있습니다.
사용자 머리. 이 설정을 사용 설정하면 기기가 사용 설정될 때 배터리를 절약하는 데 도움이 됩니다.
사용 중이 아닙니다. Glass 소프트웨어에서 이 기능을 사용하여
백그라운드 서비스를 제한할 수 있습니다 먼저
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 기기의 광학 포드에 있습니다. 사용자가 기기를 시야에 맞게 회전할 수 있습니다. 측정 불가 광학 포드의 각도를 직접 조정할 수 있으므로 주의가 필요합니다. 나침반 방향과 같은 애플리케이션을 위해 이러한 센서의 각도를 사용합니다.
배터리 수명을 보존하려면 필요할 때만 센서의 소리를 들어보세요. 예를 들어 Glass 소프트웨어에서
Service
를 사용하여LiveCard
라이브 카드가 표시될 때만 센서가 필요하면LiveCard
는 센서 리슨을 시작하고 중지하는 콜백 메서드를 표시합니다.센서 이벤트 콜백은 UI 스레드에서 실행되므로 이벤트를 처리하고 최대한 빠르게 이루어진다는 뜻입니다 센서 이벤트를 큐로 푸시하고 백그라운드 스레드를 사용해 보세요. 처리하는 데 시간이 너무 오래 걸리는 경우 이를 처리할 수 있습니다
50Hz는 머리 움직임을 추적하기에 충분한 샘플링 레이트인 경우가 많습니다.
센서 사용 방법에 관한 자세한 내용은 Android 개발자 가이드