অবস্থান এবং সেন্সর

আপনি স্ট্যান্ডার্ড অ্যান্ড্রয়েড প্ল্যাটফর্ম API ব্যবহার করে অবস্থান এবং সেন্সর ডেটা অ্যাক্সেস করেন।

অবস্থান

Glass-এ অবস্থান উপলব্ধ অবস্থান প্রদানকারীদের থেকে অবস্থানের ডেটা পেতে আদর্শ Android প্ল্যাটফর্ম API ব্যবহার করে।

অবস্থান ডেটা পেতে আপনি নিম্নলিখিত Android SDK ক্লাসগুলি ব্যবহার করবেন:

  • LocationManager - Android লোকেশন সিস্টেম পরিষেবাতে অ্যাক্সেস প্রদান করে যা একটি LocationProvider এর সাথে যোগাযোগ পরিচালনা করে।

  • LocationProvider - কিছু মানদণ্ডের উপর ভিত্তি করে অবস্থানের ডেটা প্রদান করে। Glass বিশেষ "রিমোট" প্রদানকারী প্রদান করে যা আপনাকে MyGlass সহচর অ্যাপ ইনস্টল করা একটি জোড়া ডিভাইস থেকে অবস্থানের ডেটা পেতে দেয়।

  • Criteria - আপনাকে মানদণ্ডের একটি সেট তৈরি করতে দেয় যা আপনার সেট করা মানদণ্ডের উপর ভিত্তি করে সেরা LocationProvider নির্বাচন করে।

ওভারভিউ

অবস্থানের ডেটা পেতে, আপনাকে এক বা একাধিক অবস্থান প্রদানকারীর থেকে ডেটা পেতে LocationManager ক্লাস ব্যবহার করতে হবে।

একটি Android ফোন বা ট্যাবলেটের অ্যাপ্লিকেশনগুলি ডিভাইসে স্থানীয় GPS এবং নেটওয়ার্ক অবস্থান প্রদানকারীদের থেকে অবস্থান ডেটা পুনরুদ্ধার করে৷ Glass-এ, যাইহোক, উপলব্ধ অবস্থান প্রদানকারীর সেটটি গতিশীল এবং এতে দূরবর্তী অবস্থান প্রদানকারী অন্তর্ভুক্ত থাকতে পারে যা অন্য উৎস থেকে অবস্থানের ডেটা সরবরাহ করে, যেমন MyGlass সহচর অ্যাপ ইনস্টল করা ব্লুটুথ-পেয়ার করা ডিভাইস। এই অতিরিক্ত প্রদানকারীদের পরিচালনা করতে, একটি একক প্রদানকারীর পরিবর্তে একাধিক প্রদানকারীর থেকে অবস্থানের আপডেটগুলি শুনুন৷

সমস্ত উপলব্ধ অবস্থান প্রদানকারীদের থেকে ডেটা অনুরোধ করতে:

  1. আপনার অবস্থানের প্রয়োজনীয়তা সহ একটি Criteria বস্তু তৈরি করুন।
  2. আপনার মানদণ্ড পূরণকারী সক্ষম প্রদানকারীদের তালিকা পুনরুদ্ধার করতে getProviders() কল করুন।
  3. প্রদানকারীদের তালিকার উপর পুনরাবৃত্তি করুন এবং তাদের সকলের কাছ থেকে আপডেটের অনুরোধ করুন। এটি নিশ্চিত করে যে আপনি দূরবর্তী প্রদানকারীর কাছ থেকে আপডেট পাবেন যদি তারা উপলব্ধ থাকে তবে গ্লাসে স্থানীয় প্রদানকারীদের থেকেও (যেমন একটি ওয়্যারলেস নেটওয়ার্ক প্রদানকারী)।
  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);
    }
    

সেন্সর

গ্লাস

ডিভাইসটি ব্যবহারকারীদের মাথায় আছে কি না তা শনাক্ত করার জন্য গ্লাসে একটি বিশেষ সেন্সর রয়েছে। সক্রিয় থাকা অবস্থায়, ডিভাইসটি ব্যবহার না হলে এই সেটিং ব্যাটারি সংরক্ষণে সহায়তা করে৷ আপনি আপনার গ্লাসওয়্যারে এই বৈশিষ্ট্যটি ব্যাকগ্রাউন্ড পরিষেবাগুলি অক্ষম বা থ্রোটল করতে ব্যবহার করতে পারেন৷ ACTION_ON_HEAD_STATE_CHANGE ইভেন্ট সনাক্ত করতে একটি BroadcastReceiver প্রয়োগ করে শুরু করুন।

ব্যবহারকারী তাদের মাথা থেকে গ্লাস সরিয়েছেন কিনা তার উপর ভিত্তি করে নিম্নলিখিত উদাহরণটি গেম স্কোর আপডেটগুলি বিলম্বিত এবং অক্ষম করে:

  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;
        }
    }
    

অ্যান্ড্রয়েড

নিম্নলিখিত অ্যান্ড্রয়েড সেন্সরগুলি গ্লাসে সমর্থিত:

নিম্নলিখিত Android সেন্সর সমর্থিত নয়:

গ্লাসে সেন্সর ব্যবহার করার সময় এখানে কিছু টিপস রয়েছে:

  • গ্লাস সেন্সর স্থানাঙ্ক সিস্টেমটি গ্লাস ডিসপ্লের সাপেক্ষে নীচে দেখানো হয়েছে। আরও তথ্যের জন্য, সেন্সর সমন্বয় সিস্টেম দেখুন।

  • অ্যাক্সিলোমিটার, জাইরোস্কোপ এবং ম্যাগনেটোমিটার গ্লাস ডিভাইসের অপটিক্স পডে অবস্থিত, যা ব্যবহারকারীরা তাদের দৃষ্টিশক্তির সাথে ডিভাইসটিকে সারিবদ্ধ করতে ঘোরান। আপনি সরাসরি অপটিক্স পডের কোণ পরিমাপ করতে পারবেন না, তাই কম্পাস শিরোনামের মতো অ্যাপ্লিকেশনগুলির জন্য এই সেন্সরগুলি থেকে কোণ ব্যবহার করার সময় এটি সম্পর্কে সচেতন হন।

  • ব্যাটারির আয়ু রক্ষা করতে, আপনার যখন প্রয়োজন তখনই সেন্সর শুনুন। উদাহরণস্বরূপ, যদি আপনার গ্লাসওয়্যার একটি LiveCard রেন্ডার করার জন্য একটি Service ব্যবহার করে এবং লাইভ কার্ডটি দৃশ্যমান হলেই আপনার সেন্সরগুলির প্রয়োজন হয়, সেন্সরগুলি শোনা শুরু এবং বন্ধ করতে LiveCard পৃষ্ঠ কলব্যাক পদ্ধতিগুলি ব্যবহার করুন৷

  • সেন্সর ইভেন্ট কলব্যাকগুলি UI থ্রেডে চলে, তাই ইভেন্টগুলি প্রক্রিয়া করুন এবং যত তাড়াতাড়ি সম্ভব ফিরে আসুন। সেন্সর ইভেন্টগুলিকে একটি সারিতে ঠেলে দেওয়ার কথা বিবেচনা করুন এবং আপনার প্রক্রিয়াকরণে খুব বেশি সময় লাগলে সেগুলি পরিচালনা করতে একটি পটভূমি থ্রেড ব্যবহার করুন৷

  • মাথার গতি ট্র্যাক করার জন্য 50 Hz প্রায়ই যথেষ্ট নমুনা হার।

সেন্সরগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য, Android বিকাশকারী নির্দেশিকা দেখুন।