شما با استفاده از API های استاندارد پلتفرم Android به داده های مکان و حسگر دسترسی دارید.
محل
مکان روی شیشه شامل استفاده از APIهای پلتفرم Android استاندارد برای دریافت اطلاعات مکان از ارائه دهندگان موقعیت مکانی موجود است.
برای دریافت اطلاعات مکان از کلاسهای Android SDK زیر استفاده خواهید کرد:
LocationManager
– دسترسی به سرویس سیستم مکان Android را فراهم می کند که ارتباط باLocationProvider
را مدیریت می کند.LocationProvider
- داده های مکان را بر اساس برخی معیارها ارائه می دهد. Glass ارائهدهندگان «راهدور» ویژهای را ارائه میکند که به شما امکان میدهند دادههای مکان را از یک دستگاه جفت شده که برنامه همراه MyGlass را نصب کرده است، دریافت کنید.Criteria
- به شما امکان می دهد مجموعه ای از معیارها را ایجاد کنید که بهترینLocationProvider
بر اساس معیارهایی که تعیین می کنید انتخاب می کند.
بررسی اجمالی
برای به دست آوردن داده های موقعیت مکانی، باید از کلاس LocationManager
برای دریافت داده از یک یا چند ارائه دهنده موقعیت مکانی استفاده کنید.
برنامههای کاربردی در تلفن یا رایانه لوحی Android دادههای موقعیت مکانی را از GPS محلی و ارائهدهندگان موقعیت مکانی شبکه روی دستگاه بازیابی میکنند. با این حال، در Glass، مجموعه ارائهدهندگان موقعیت مکانی موجود پویا است و ممکن است شامل ارائهدهندگان موقعیت مکانی راه دور باشد که دادههای مکان را از منبع دیگری، مانند دستگاه جفت شده با بلوتوث با نصب برنامه همراه 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); }
حسگرها
شیشه
گلس دارای یک سنسور تخصصی برای تشخیص قرار گرفتن یا نبودن دستگاه روی سر کاربران است. در صورت فعال بودن، این تنظیم به صرفه جویی در مصرف باتری در زمانی که دستگاه در حال استفاده نیست کمک می کند. می توانید از این ویژگی در 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; } }
اندروید
سنسورهای اندروید زیر در Glass پشتیبانی میشوند:
-
TYPE_ACCELEROMETER
-
TYPE_GRAVITY
-
TYPE_GYROSCOPE
-
TYPE_LIGHT
-
TYPE_LINEAR_ACCELERATION
-
TYPE_MAGNETIC_FIELD
-
TYPE_ORIENTATION
(منسوخ شده) -
TYPE_ROTATION_VECTOR
سنسورهای اندروید زیر پشتیبانی نمیشوند:
در اینجا نکاتی در مورد استفاده از حسگرها در Glass وجود دارد:
- سیستم مختصات حسگر شیشه ای در زیر نسبت به صفحه نمایش شیشه ای نشان داده شده است. برای اطلاعات بیشتر، به سیستم مختصات حسگر مراجعه کنید.
شتاب سنج، ژیروسکوپ و مغناطیس سنج بر روی غلاف اپتیک دستگاه Glass قرار دارند که کاربران با چرخاندن آن دستگاه را با دید خود هماهنگ می کنند. شما نمی توانید زاویه غلاف نوری را مستقیماً اندازه گیری کنید، بنابراین هنگام استفاده از زوایای این سنسورها برای برنامه هایی مانند عنوان قطب نما، از این موضوع آگاه باشید.
برای حفظ عمر باتری، فقط در صورت نیاز به سنسورها گوش دهید. برای مثال، اگر Glassware شما از یک
Service
برای ارائهLiveCard
استفاده میکند و تنها زمانی که کارت زنده قابل مشاهده است به حسگرها نیاز دارید، از روشهای تماس سطحیLiveCard
برای شروع و توقف گوش دادن به حسگرها استفاده کنید.تماسهای رویداد حسگر روی رشته رابط کاربری اجرا میشوند، بنابراین رویدادها را پردازش کرده و در سریعترین زمان ممکن بازگردید. در نظر بگیرید که رویدادهای حسگر را در یک صف قرار دهید و اگر پردازش شما بیش از حد طول کشید، از یک رشته پس زمینه برای مدیریت آنها استفاده کنید.
50 هرتز اغلب یک نرخ نمونه برداری کافی برای ردیابی حرکت هد است.
برای اطلاعات بیشتر در مورد نحوه استفاده از حسگرها، به راهنمای برنامهنویس Android مراجعه کنید.