مکان ها و حسگرها

شما با استفاده از API های استاندارد پلتفرم Android به داده های مکان و حسگر دسترسی دارید.

محل

مکان روی شیشه شامل استفاده از APIهای پلتفرم Android استاندارد برای دریافت اطلاعات مکان از ارائه دهندگان موقعیت مکانی موجود است.

برای دریافت اطلاعات مکان از کلاس‌های Android SDK زیر استفاده خواهید کرد:

  • LocationManager – دسترسی به سرویس سیستم مکان Android را فراهم می کند که ارتباط با LocationProvider را مدیریت می کند.

  • LocationProvider - داده های مکان را بر اساس برخی معیارها ارائه می دهد. Glass ارائه‌دهندگان «راه‌دور» ویژه‌ای را ارائه می‌کند که به شما امکان می‌دهند داده‌های مکان را از یک دستگاه جفت شده که برنامه همراه MyGlass را نصب کرده است، دریافت کنید.

  • Criteria - به شما امکان می دهد مجموعه ای از معیارها را ایجاد کنید که بهترین LocationProvider بر اساس معیارهایی که تعیین می کنید انتخاب می کند.

بررسی اجمالی

برای به دست آوردن داده های موقعیت مکانی، باید از کلاس LocationManager برای دریافت داده از یک یا چند ارائه دهنده موقعیت مکانی استفاده کنید.

برنامه‌های کاربردی در تلفن یا رایانه لوحی Android داده‌های موقعیت مکانی را از GPS محلی و ارائه‌دهندگان موقعیت مکانی شبکه روی دستگاه بازیابی می‌کنند. با این حال، در Glass، مجموعه ارائه‌دهندگان موقعیت مکانی موجود پویا است و ممکن است شامل ارائه‌دهندگان موقعیت مکانی راه دور باشد که داده‌های مکان را از منبع دیگری، مانند دستگاه جفت شده با بلوتوث با نصب برنامه همراه MyGlass، ارائه می‌کنند. برای مدیریت این ارائه دهندگان اضافی، به جای یک ارائه دهنده واحد، به به روز رسانی های مکان از چندین ارائه دهنده گوش دهید.

برای درخواست داده از همه ارائه دهندگان موقعیت مکانی موجود:

  1. یک شی Criteria با شرایط موقعیت مکانی خود ایجاد کنید.
  2. برای بازیابی لیست ارائه دهندگان فعال که معیارهای شما را برآورده می کنند getProviders() را فراخوانی کنید.
  3. لیست ارائه دهندگان را تکرار کنید و از همه آنها به روز رسانی درخواست کنید. این تضمین می‌کند که به‌روزرسانی‌ها را از ارائه‌دهندگان راه دور در صورت موجود بودن، اما همچنین از ارائه‌دهندگان محلی در Glass (مانند ارائه‌دهنده شبکه بی‌سیم) دریافت می‌کنید.
  4. از اطلاعات دقت و زمان ارائه شده با هر به‌روزرسانی برای تعیین اینکه آیا به‌روزرسانی به اندازه کافی خوب است یا باید منتظر بروزرسانی دیگری باشید، استفاده کنید.

    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 را از سر خود حذف کرده است، به تاخیر انداخته و غیرفعال می‌کند:

  1. یک BroadcastReceiver برای مدیریت تغییر حالت پیاده سازی کنید.
  2. در سرویس خود، متد onCreate() را پیاده سازی کنید و گیرنده ای را ثبت کنید که به هدف ACTION_ON_HEAD_STATE_CHANGE گوش می دهد.
  3. در متد 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 پشتیبانی می‌شوند:

سنسورهای اندروید زیر پشتیبانی نمی‌شوند:

در اینجا نکاتی در مورد استفاده از حسگرها در Glass وجود دارد:

  • سیستم مختصات حسگر شیشه ای در زیر نسبت به صفحه نمایش شیشه ای نشان داده شده است. برای اطلاعات بیشتر، به سیستم مختصات حسگر مراجعه کنید.

  • شتاب سنج، ژیروسکوپ و مغناطیس سنج بر روی غلاف اپتیک دستگاه Glass قرار دارند که کاربران با چرخاندن آن دستگاه را با دید خود هماهنگ می کنند. شما نمی توانید زاویه غلاف نوری را مستقیماً اندازه گیری کنید، بنابراین هنگام استفاده از زوایای این سنسورها برای برنامه هایی مانند عنوان قطب نما، از این موضوع آگاه باشید.

  • برای حفظ عمر باتری، فقط در صورت نیاز به سنسورها گوش دهید. برای مثال، اگر Glassware شما از یک Service برای ارائه LiveCard استفاده می‌کند و تنها زمانی که کارت زنده قابل مشاهده است به حسگرها نیاز دارید، از روش‌های تماس سطحی LiveCard برای شروع و توقف گوش دادن به حسگرها استفاده کنید.

  • تماس‌های رویداد حسگر روی رشته رابط کاربری اجرا می‌شوند، بنابراین رویدادها را پردازش کرده و در سریع‌ترین زمان ممکن بازگردید. در نظر بگیرید که رویدادهای حسگر را در یک صف قرار دهید و اگر پردازش شما بیش از حد طول کشید، از یک رشته پس زمینه برای مدیریت آنها استفاده کنید.

  • 50 هرتز اغلب یک نرخ نمونه برداری کافی برای ردیابی حرکت هد است.

برای اطلاعات بیشتر در مورد نحوه استفاده از حسگرها، به راهنمای برنامه‌نویس Android مراجعه کنید.