คุณเข้าถึงข้อมูลตําแหน่งและข้อมูลเซ็นเซอร์โดยใช้ API ของแพลตฟอร์ม Android มาตรฐาน
ตำแหน่ง
ตําแหน่งใน Glass ต้องใช้ API ของแพลตฟอร์ม Android มาตรฐานเพื่อรับข้อมูลตําแหน่งจากผู้ให้บริการตําแหน่งที่มีอยู่
คุณจะใช้คลาส Android SDK ต่อไปนี้เพื่อรับข้อมูลตําแหน่ง
LocationManager
– ให้สิทธิ์เข้าถึงบริการตําแหน่งของระบบ Android ที่จัดการการสื่อสารด้วยLocationProvider
LocationProvider
– ให้ข้อมูลตําแหน่งตามเกณฑ์บางอย่าง Glass เป็นผู้ให้บริการ "ระยะไกล" พิเศษ ที่ช่วยให้คุณรับข้อมูลตําแหน่งจากอุปกรณ์ที่จับคู่ซึ่งติดตั้งแอปที่ใช้ร่วมกันกับ MyGlass ได้Criteria
– ให้คุณสร้างชุดเกณฑ์ที่เลือกLocationProvider
ดีที่สุดตามเกณฑ์ที่ตั้งไว้
ภาพรวม
หากต้องการรับข้อมูลสถานที่ตั้ง คุณจะต้องใช้คลาส LocationManager
เพื่อรับข้อมูลจากผู้ให้บริการตําแหน่งอย่างน้อย 1 ราย
แอปพลิเคชันในโทรศัพท์หรือแท็บเล็ต Android จะดึงข้อมูลตําแหน่งจากผู้ให้บริการ GPS และผู้ให้บริการเครือข่ายในพื้นที่ในอุปกรณ์ อย่างไรก็ตาม ชุดของผู้ให้บริการตําแหน่งที่ใช้ได้จะเป็นแบบไดนามิก และอาจรวมถึงผู้ให้บริการตําแหน่งระยะไกลที่ให้ข้อมูลตําแหน่งจากแหล่งที่มาอื่น เช่น อุปกรณ์ที่จับคู่ด้วยบลูทูธซึ่งติดตั้งแอปที่ใช้ร่วมกันกับ 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 มีเซ็นเซอร์เฉพาะที่ตรวจหาว่าอุปกรณ์อยู่บนศีรษะของผู้ใช้หรือไม่ เมื่อเปิดใช้ การตั้งค่านี้จะช่วยประหยัดแบตเตอรี่เมื่อไม่ได้ใช้งานอุปกรณ์ คุณสามารถใช้ฟีเจอร์นี้ใน Glassware เพื่อปิดใช้หรือควบคุมบริการเบื้องหลังได้ เริ่มต้นด้วยการใช้เหตุการณ์ BroadcastReceiver
เพื่อตรวจหาเหตุการณ์ ACTION_ON_HEAD_STATE_CHANGE
ตัวอย่างต่อไปนี้ล่าช้าและปิดการอัปเดตคะแนนเกม โดยดูว่าผู้ใช้นํา Glass ออกจากส่วนหัวหรือไม่
- ใช้
BroadcastReceiver
เพื่อจัดการการเปลี่ยนแปลงสถานะ - ในบริการของคุณ ให้ใช้เมธอด
onCreate()
และลงทะเบียนผู้รับที่ฟัง Intent ของ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 ซึ่งผู้ใช้หมุนเพื่อปรับอุปกรณ์ให้สอดคล้องกับการมองเห็น คุณไม่สามารถวัดมุมของพ็อดออปติกได้โดยตรง ดังนั้นโปรดคํานึงถึงเรื่องนี้เมื่อใช้มุมจากเซ็นเซอร์เหล่านี้สําหรับแอปพลิเคชัน เช่น ส่วนหัวของเข็มทิศ
หากต้องการฟังอายุการใช้งานแบตเตอรี่ ให้ฟังเฉพาะเซ็นเซอร์เมื่อคุณต้องการเท่านั้น ตัวอย่างเช่น หาก Glassware ใช้
Service
ในการแสดงผลLiveCard
และคุณต้องการเฉพาะเซ็นเซอร์เมื่อมองเห็นการ์ดสด ให้ใช้LiveCard
LiveCard
วิธีการเรียกกลับเพื่อเริ่มและหยุดฟังเซ็นเซอร์โค้ดเรียกกลับของเหตุการณ์เซ็นเซอร์จะทํางานในชุดข้อความ UI ดังนั้นโปรดประมวลผลเหตุการณ์และแสดงผลโดยเร็วที่สุด ลองพุชเหตุการณ์เซ็นเซอร์ไปยังคิวและใช้ชุดข้อความในเบื้องหลังเพื่อจัดการหากการประมวลผลใช้เวลานานเกินไป
50 Hz มักเป็นอัตราการให้เนื้อหาตัวอย่างที่เพียงพอสําหรับการติดตามการเคลื่อนไหวของศีรษะ
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้เซ็นเซอร์ได้ที่คู่มือนักพัฒนาซอฟต์แวร์ Android