সেন্সর ওভারভিউ

বেশিরভাগ অ্যান্ড্রয়েড-চালিত ডিভাইসে বিল্ট-ইন সেন্সর থাকে যা গতি, দিকবিন্যাস এবং বিভিন্ন পারিপার্শ্বিক অবস্থা পরিমাপ করে। এই সেন্সরগুলো উচ্চ নির্ভুলতা ও সূক্ষ্মতার সাথে র ডেটা সরবরাহ করতে সক্ষম এবং ডিভাইসের ত্রিমাত্রিক নড়াচড়া বা অবস্থান পর্যবেক্ষণ করতে, অথবা ডিভাইসের কাছাকাছি পারিপার্শ্বিক পরিবেশের পরিবর্তন পর্যবেক্ষণ করতে এগুলো বেশ কার্যকর। উদাহরণস্বরূপ, একটি গেম ব্যবহারকারীর জটিল অঙ্গভঙ্গি এবং গতিবিধি, যেমন—হেলান দেওয়া, ঝাঁকানো, ঘোরানো বা দোলানোর মতো বিষয়গুলো অনুমান করার জন্য ডিভাইসের গ্র্যাভিটি সেন্সরের রিডিং ট্র্যাক করতে পারে। একইভাবে, একটি আবহাওয়া অ্যাপ্লিকেশন শিশিরবিন্দু গণনা ও রিপোর্ট করার জন্য ডিভাইসের তাপমাত্রা সেন্সর এবং আর্দ্রতা সেন্সর ব্যবহার করতে পারে, অথবা একটি ভ্রমণ অ্যাপ্লিকেশন কম্পাসের দিক নির্ণয়ের জন্য জিওম্যাগনেটিক ফিল্ড সেন্সর এবং অ্যাক্সেলেরোমিটার ব্যবহার করতে পারে।

অ্যান্ড্রয়েড প্ল্যাটফর্ম প্রধানত তিন ধরনের সেন্সর সমর্থন করে:

  • গতি সেন্সর

    এই সেন্সরগুলো তিনটি অক্ষ বরাবর ত্বরণ বল এবং ঘূর্ণন বল পরিমাপ করে। এই শ্রেণিতে অ্যাক্সেলেরোমিটার, গ্র্যাভিটি সেন্সর, জাইরোস্কোপ এবং রোটেশনাল ভেক্টর সেন্সর অন্তর্ভুক্ত।

  • পরিবেশগত সেন্সর

    এই সেন্সরগুলো পারিপার্শ্বিক বায়ুর তাপমাত্রা ও চাপ, আলোকসজ্জা এবং আর্দ্রতার মতো বিভিন্ন পরিবেশগত পরামিতি পরিমাপ করে। এই শ্রেণিতে ব্যারোমিটার, ফটোমিটার এবং থার্মোমিটার অন্তর্ভুক্ত।

  • অবস্থান সেন্সর

    এই সেন্সরগুলো কোনো ডিভাইসের ভৌত অবস্থান পরিমাপ করে। এই শ্রেণিতে ওরিয়েন্টেশন সেন্সর এবং ম্যাগনেটোমিটার অন্তর্ভুক্ত।

আপনি অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে ডিভাইসে থাকা সেন্সরগুলো অ্যাক্সেস করতে এবং র সেন্সর ডেটা সংগ্রহ করতে পারেন। সেন্সর ফ্রেমওয়ার্কটি বিভিন্ন ক্লাস এবং ইন্টারফেস সরবরাহ করে, যা আপনাকে সেন্সর-সম্পর্কিত নানা ধরনের কাজ করতে সাহায্য করে। উদাহরণস্বরূপ, আপনি সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে নিম্নলিখিত কাজগুলো করতে পারেন:

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

এই বিষয়টিতে অ্যান্ড্রয়েড প্ল্যাটফর্মে উপলব্ধ সেন্সরগুলোর একটি সংক্ষিপ্ত বিবরণ দেওয়া হয়েছে। এতে সেন্সর ফ্রেমওয়ার্কের একটি পরিচিতিও প্রদান করা হয়েছে।

সেন্সর পরিচিতি

অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক আপনাকে অনেক ধরনের সেন্সর ব্যবহার করার সুযোগ দেয়। এই সেন্সরগুলোর মধ্যে কিছু হার্ডওয়্যার-ভিত্তিক এবং কিছু সফটওয়্যার-ভিত্তিক। হার্ডওয়্যার-ভিত্তিক সেন্সর হলো হ্যান্ডসেট বা ট্যাবলেট ডিভাইসে তৈরি করা ভৌত উপাদান। এগুলো ত্বরণ, ভূ-চৌম্বক ক্ষেত্রের শক্তি বা কৌণিক পরিবর্তনের মতো নির্দিষ্ট পরিবেশগত বৈশিষ্ট্য সরাসরি পরিমাপ করে তাদের ডেটা সংগ্রহ করে। সফটওয়্যার-ভিত্তিক সেন্সর কোনো ভৌত ডিভাইস নয়, যদিও এগুলো হার্ডওয়্যার-ভিত্তিক সেন্সরের অনুকরণ করে। সফটওয়্যার-ভিত্তিক সেন্সরগুলো এক বা একাধিক হার্ডওয়্যার-ভিত্তিক সেন্সর থেকে তাদের ডেটা সংগ্রহ করে এবং এদেরকে কখনও কখনও ভার্চুয়াল সেন্সর বা সিন্থেটিক সেন্সর বলা হয়। লিনিয়ার অ্যাক্সিলারেশন সেন্সর এবং গ্র্যাভিটি সেন্সর হলো সফটওয়্যার-ভিত্তিক সেন্সরের উদাহরণ। সারণি ১-এ অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা সমর্থিত সেন্সরগুলোর একটি সংক্ষিপ্ত বিবরণ দেওয়া হলো।

খুব কম অ্যান্ড্রয়েড-চালিত ডিভাইসেই সব ধরনের সেন্সর থাকে। উদাহরণস্বরূপ, বেশিরভাগ হ্যান্ডসেট ডিভাইস এবং ট্যাবলেটে অ্যাক্সেলেরোমিটার ও ম্যাগনেটোমিটার থাকে, কিন্তু তুলনামূলকভাবে কম ডিভাইসে ব্যারোমিটার বা থার্মোমিটার থাকে। এছাড়াও, একটি ডিভাইসে একই ধরনের একাধিক সেন্সর থাকতে পারে। যেমন, একটি ডিভাইসে দুটি গ্র্যাভিটি সেন্সর থাকতে পারে, যার প্রতিটির পরিসীমা ভিন্ন।

সারণি ১. অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা সমর্থিত সেন্সরের প্রকারভেদ।

সেন্সর প্রকার বর্ণনা সাধারণ ব্যবহার
TYPE_ACCELEROMETER হার্ডওয়্যার কোনো যন্ত্রের উপর অভিকর্ষ বল সহ তিনটি ভৌত ​​অক্ষ (x, y, এবং z) বরাবর প্রযুক্ত ত্বরণ বলকে (মিটার/ সেকেন্ড² এককে) পরিমাপ করে। গতি শনাক্তকরণ (ঝাঁকুনি, কাত হওয়া, ইত্যাদি)।
TYPE_AMBIENT_TEMPERATURE হার্ডওয়্যার ঘরের পারিপার্শ্বিক তাপমাত্রা সেলসিয়াস ডিগ্রিতে (°C) পরিমাপ করে। নিচের দ্রষ্টব্য দেখুন। বায়ুর তাপমাত্রা পর্যবেক্ষণ করা হচ্ছে।
TYPE_GRAVITY সফটওয়্যার বা হার্ডওয়্যার কোনো যন্ত্রের তিনটি ভৌত ​​অক্ষ (x, y, z) বরাবর প্রযুক্ত অভিকর্ষ বলকে মিটার/ সেকেন্ড² এককে পরিমাপ করে। গতি শনাক্তকরণ (ঝাঁকুনি, কাত হওয়া, ইত্যাদি)।
TYPE_GYROSCOPE হার্ডওয়্যার তিনটি ভৌত ​​অক্ষের (x, y, এবং z) প্রতিটির সাপেক্ষে একটি ডিভাইসের ঘূর্ণনের হার রেডিয়ান/সেকেন্ড (rad/s) এককে পরিমাপ করে। ঘূর্ণন শনাক্তকরণ (ঘূর্ণন, মোড়, ইত্যাদি)।
TYPE_LIGHT হার্ডওয়্যার পারিপার্শ্বিক আলোর মাত্রা (আলোকায়ন) lx এককে পরিমাপ করে। স্ক্রিনের উজ্জ্বলতা নিয়ন্ত্রণ করা।
TYPE_LINEAR_ACCELERATION সফটওয়্যার বা হার্ডওয়্যার অভিকর্ষ বল ব্যতীত, কোনো যন্ত্রের উপর তিনটি ভৌত ​​অক্ষ (x, y, এবং z) বরাবর প্রযুক্ত ত্বরণ বলকে (মিটার/সেকেন্ড² এককে ) পরিমাপ করে। একটিমাত্র অক্ষ বরাবর ত্বরণ পর্যবেক্ষণ।
TYPE_MAGNETIC_FIELD হার্ডওয়্যার তিনটি ভৌত ​​অক্ষ (x, y, z) বরাবর পারিপার্শ্বিক ভূ-চৌম্বক ক্ষেত্রকে μT এককে পরিমাপ করে। একটি কম্পাস তৈরি করা।
TYPE_ORIENTATION সফটওয়্যার একটি ডিভাইস তার তিনটি ভৌত ​​অক্ষ (x, y, z) বরাবর যে ঘূর্ণন করে, তার মাত্রা পরিমাপ করে। API লেভেল 3 থেকে, আপনি গ্র্যাভিটি সেন্সর এবং জিওম্যাগনেটিক ফিল্ড সেন্সর একসাথে getRotationMatrix() মেথডের মাধ্যমে ব্যবহার করে একটি ডিভাইসের ইনক্লিনেশন ম্যাট্রিক্স এবং রোটেশন ম্যাট্রিক্স পেতে পারেন। ডিভাইসের অবস্থান নির্ধারণ করা।
TYPE_PRESSURE হার্ডওয়্যার পারিপার্শ্বিক বায়ুর চাপ হেক্টোপ্যাসকেল (hPa) বা মিলিবার (mbar) এককে পরিমাপ করে। বায়ুচাপের পরিবর্তন পর্যবেক্ষণ করা।
TYPE_PROXIMITY হার্ডওয়্যার ডিভাইসের ভিউ স্ক্রিনের সাপেক্ষে কোনো বস্তুর নৈকট্য সেন্টিমিটারে পরিমাপ করে। এই সেন্সরটি সাধারণত হ্যান্ডসেটটি কোনো ব্যক্তির কানের কাছে ধরা আছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। কল চলাকালীন ফোনের অবস্থান।
TYPE_RELATIVE_HUMIDITY হার্ডওয়্যার পারিপার্শ্বিক আপেক্ষিক আর্দ্রতা শতাংশ (%) এককে পরিমাপ করে। শিশিরবিন্দু, পরম ও আপেক্ষিক আর্দ্রতা পর্যবেক্ষণ।
TYPE_ROTATION_VECTOR সফটওয়্যার বা হার্ডওয়্যার কোনো ডিভাইসের ঘূর্ণন ভেক্টরের তিনটি উপাদান প্রদানের মাধ্যমে ডিভাইসটির অভিমুখ পরিমাপ করে। গতি শনাক্তকরণ এবং ঘূর্ণন শনাক্তকরণ।
TYPE_TEMPERATURE হার্ডওয়্যার ডিভাইসের তাপমাত্রা সেলসিয়াস ডিগ্রিতে (°C) পরিমাপ করে। এই সেন্সরের বাস্তবায়ন ডিভাইসভেদে ভিন্ন হয় এবং API লেভেল 14-এ এই সেন্সরটিকে TYPE_AMBIENT_TEMPERATURE সেন্সর দ্বারা প্রতিস্থাপন করা হয়েছে। তাপমাত্রা পর্যবেক্ষণ করা হচ্ছে।

সেন্সর ফ্রেমওয়ার্ক

আপনি অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে এই সেন্সরগুলো অ্যাক্সেস করতে এবং র সেন্সর ডেটা সংগ্রহ করতে পারেন। সেন্সর ফ্রেমওয়ার্কটি android.hardware প্যাকেজের একটি অংশ এবং এতে নিম্নলিখিত ক্লাস ও ইন্টারফেসগুলো অন্তর্ভুক্ত রয়েছে:

SensorManager
আপনি সেন্সর সার্ভিসের একটি ইনস্ট্যান্স তৈরি করতে এই ক্লাসটি ব্যবহার করতে পারেন। এই ক্লাসটি সেন্সর অ্যাক্সেস ও তালিকাভুক্ত করা, সেন্সর ইভেন্ট লিসেনার রেজিস্টার ও আনরেজিস্টার করা এবং ওরিয়েন্টেশন তথ্য সংগ্রহের জন্য বিভিন্ন মেথড প্রদান করে। এই ক্লাসটি বেশ কিছু সেন্সর কনস্ট্যান্টও প্রদান করে, যা সেন্সরের নির্ভুলতা রিপোর্ট করতে, ডেটা সংগ্রহের হার নির্ধারণ করতে এবং সেন্সর ক্যালিব্রেট করতে ব্যবহৃত হয়।
Sensor
আপনি এই ক্লাসটি ব্যবহার করে একটি নির্দিষ্ট সেন্সরের ইনস্ট্যান্স তৈরি করতে পারেন। এই ক্লাসে বিভিন্ন মেথড রয়েছে যা আপনাকে একটি সেন্সরের সক্ষমতা নির্ধারণ করতে সাহায্য করে।
SensorEvent
সিস্টেমটি একটি সেন্সর ইভেন্ট অবজেক্ট তৈরি করতে এই ক্লাসটি ব্যবহার করে, যা একটি সেন্সর ইভেন্ট সম্পর্কে তথ্য প্রদান করে। একটি সেন্সর ইভেন্ট অবজেক্টে নিম্নলিখিত তথ্যগুলো অন্তর্ভুক্ত থাকে: মূল সেন্সর ডেটা, যে ধরনের সেন্সর থেকে ইভেন্টটি তৈরি হয়েছে, ডেটার নির্ভুলতা এবং ইভেন্টটির টাইমস্ট্যাম্প।
SensorEventListener
এই ইন্টারফেসটি ব্যবহার করে আপনি দুটি কলব্যাক মেথড তৈরি করতে পারেন, যেগুলো সেন্সরের মান বা নির্ভুলতা পরিবর্তিত হলে নোটিফিকেশন (সেন্সর ইভেন্ট) গ্রহণ করবে।

একটি সাধারণ অ্যাপ্লিকেশনে আপনি এই সেন্সর-সম্পর্কিত API-গুলো দুটি মৌলিক কাজ সম্পাদন করতে ব্যবহার করেন:

  • সেন্সর এবং সেন্সরের সক্ষমতা শনাক্তকরণ

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

  • সেন্সর ইভেন্টগুলি নিরীক্ষণ করুন

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

সেন্সরের প্রাপ্যতা

ডিভাইস ভেদে সেন্সরের প্রাপ্যতা যেমন ভিন্ন হয়, তেমনি অ্যান্ড্রয়েডের বিভিন্ন ভার্সনের মধ্যেও এর ভিন্নতা থাকতে পারে। এর কারণ হলো, অ্যান্ড্রয়েড সেন্সরগুলো বিভিন্ন প্ল্যাটফর্ম রিলিজের মাধ্যমে ধাপে ধাপে চালু করা হয়েছে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড ১.৫ (এপিআই লেভেল ৩)-এ অনেক সেন্সর চালু করা হলেও, কিছু সেন্সর তখনো বাস্তবায়িত হয়নি এবং অ্যান্ড্রয়েড ২.৩ (এপিআই লেভেল ৯)-এর আগে ব্যবহারের জন্য উপলব্ধ ছিল না। একইভাবে, অ্যান্ড্রয়েড ২.৩ (এপিআই লেভেল ৯) এবং অ্যান্ড্রয়েড ৪.০ (এপিআই লেভেল ১৪)-এও বেশ কিছু সেন্সর চালু করা হয়েছিল। দুটি সেন্সরকে বাতিল করে নতুন ও উন্নততর সেন্সর দ্বারা প্রতিস্থাপন করা হয়েছে।

সারণি ২-এ প্ল্যাটফর্ম অনুযায়ী প্রতিটি সেন্সরের প্রাপ্যতার সারসংক্ষেপ দেওয়া হয়েছে। এখানে মাত্র চারটি প্ল্যাটফর্ম তালিকাভুক্ত করা হয়েছে, কারণ এই প্ল্যাটফর্মগুলোতেই সেন্সরের পরিবর্তন আনা হয়েছে। যে সেন্সরগুলোকে অপ্রচলিত (deprecated) হিসেবে তালিকাভুক্ত করা হয়েছে, সেগুলো পরবর্তী প্ল্যাটফর্মগুলোতেও পাওয়া যায় (যদি সেন্সরটি কোনো ডিভাইসে উপস্থিত থাকে), যা অ্যান্ড্রয়েডের ফরোয়ার্ড কম্প্যাটিবিলিটি নীতির সাথে সামঞ্জস্যপূর্ণ।

সারণি ২. প্ল্যাটফর্ম অনুযায়ী সেন্সরের প্রাপ্যতা।

সেন্সর অ্যান্ড্রয়েড ৪.০
(এপিআই লেভেল ১৪)
অ্যান্ড্রয়েড ২.৩
(এপিআই লেভেল ৯)
অ্যান্ড্রয়েড ২.২
(এপিআই লেভেল ৮)
অ্যান্ড্রয়েড ১.৫
(এপিআই লেভেল ৩)
TYPE_ACCELEROMETER হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_AMBIENT_TEMPERATURE হ্যাঁ প্রযোজ্য নয় প্রযোজ্য নয় প্রযোজ্য নয়
TYPE_GRAVITY হ্যাঁ হ্যাঁ প্রযোজ্য নয় প্রযোজ্য নয়
TYPE_GYROSCOPE হ্যাঁ হ্যাঁ প্রযোজ্য নয় প্রযোজ্য নয়
TYPE_LIGHT হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_LINEAR_ACCELERATION হ্যাঁ হ্যাঁ প্রযোজ্য নয় প্রযোজ্য নয়
TYPE_MAGNETIC_FIELD হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_ORIENTATION হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_PRESSURE হ্যাঁ হ্যাঁ প্রযোজ্য নয় প্রযোজ্য নয়
TYPE_PROXIMITY হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_RELATIVE_HUMIDITY হ্যাঁ প্রযোজ্য নয় প্রযোজ্য নয় প্রযোজ্য নয়
TYPE_ROTATION_VECTOR হ্যাঁ হ্যাঁ প্রযোজ্য নয় প্রযোজ্য নয়
TYPE_TEMPERATURE হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ

এই সেন্সর টাইপটি অ্যান্ড্রয়েড ১.৫ (এপিআই লেভেল ৩)-এ যোগ করা হয়েছিল, কিন্তু অ্যান্ড্রয়েড ২.৩ (এপিআই লেভেল ৯)-এর আগে এটি ব্যবহারের জন্য উপলব্ধ ছিল না।

এই সেন্সরটি পাওয়া যায়, কিন্তু এটি অপ্রচলিত হয়ে গেছে।

সেন্সর এবং সেন্সরের সক্ষমতা শনাক্তকরণ

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

কোনো ডিভাইসে থাকা সেন্সরগুলো শনাক্ত করতে হলে, প্রথমে আপনাকে সেন্সর সার্ভিসের একটি রেফারেন্স নিতে হবে। এটি করার জন্য, getSystemService() মেথডটি কল করে এবং SENSOR_SERVICE আর্গুমেন্টটি পাস করে SensorManager ক্লাসের একটি ইনস্ট্যান্স তৈরি করতে হয়। উদাহরণস্বরূপ:

কোটলিন

private lateinit var sensorManager: SensorManager
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

জাভা

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

এরপরে, আপনি getSensorList() মেথডটি কল করে এবং TYPE_ALL কনস্ট্যান্টটি ব্যবহার করে একটি ডিভাইসের প্রতিটি সেন্সরের তালিকা পেতে পারেন। উদাহরণস্বরূপ:

কোটলিন

val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)

জাভা

List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

যদি আপনি কোনো নির্দিষ্ট ধরনের সমস্ত সেন্সরের তালিকা করতে চান, তাহলে TYPE_ALL এর পরিবর্তে TYPE_GYROSCOPE , TYPE_LINEAR_ACCELERATION বা TYPE_GRAVITY এর মতো অন্য কোনো কনস্ট্যান্ট ব্যবহার করতে পারেন।

আপনি getDefaultSensor() মেথড ব্যবহার করে এবং একটি নির্দিষ্ট সেন্সরের জন্য টাইপ কনস্ট্যান্ট পাস করে কোনো ডিভাইসে একটি নির্দিষ্ট ধরণের সেন্সর আছে কিনা তাও নির্ধারণ করতে পারেন। যদি একটি ডিভাইসে একটি নির্দিষ্ট ধরণের একাধিক সেন্সর থাকে, তবে সেন্সরগুলির মধ্যে একটিকে অবশ্যই ডিফল্ট সেন্সর হিসাবে মনোনীত করতে হবে। যদি একটি নির্দিষ্ট ধরণের সেন্সরের জন্য কোনো ডিফল্ট সেন্সর না থাকে, তাহলে মেথড কলটি null রিটার্ন করে, যার অর্থ ডিভাইসটিতে সেই ধরণের সেন্সর নেই। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি পরীক্ষা করে যে একটি ডিভাইসে ম্যাগনেটোমিটার আছে কিনা:

কোটলিন

private lateinit var sensorManager: SensorManager
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null) {
    // Success! There's a magnetometer.
} else {
    // Failure! No magnetometer.
}

জাভা

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){
    // Success! There's a magnetometer.
} else {
    // Failure! No magnetometer.
}

দ্রষ্টব্য: অ্যান্ড্রয়েড ডিভাইস প্রস্তুতকারকদের তাদের অ্যান্ড্রয়েড-চালিত ডিভাইসগুলিতে কোনো নির্দিষ্ট ধরণের সেন্সর যুক্ত করার জন্য বাধ্য করে না, তাই ডিভাইসগুলিতে বিভিন্ন ধরণের সেন্সর কনফিগারেশন থাকতে পারে।

একটি ডিভাইসে থাকা সেন্সরগুলোর তালিকা করার পাশাপাশি, আপনি Sensor ক্লাসের পাবলিক মেথডগুলো ব্যবহার করে প্রতিটি সেন্সরের সক্ষমতা এবং অ্যাট্রিবিউট নির্ধারণ করতে পারেন। এটি তখন কাজে আসে যখন আপনি চান যে ডিভাইসে কোন সেন্সর বা সেন্সরের সক্ষমতা উপলব্ধ আছে তার উপর ভিত্তি করে আপনার অ্যাপ্লিকেশনটি ভিন্নভাবে কাজ করুক। উদাহরণস্বরূপ, আপনি একটি সেন্সরের রেজোলিউশন এবং পরিমাপের সর্বোচ্চ পরিসীমা জানতে getResolution() এবং getMaximumRange() মেথডগুলো ব্যবহার করতে পারেন। এছাড়াও, একটি সেন্সরের পাওয়ারের প্রয়োজনীয়তা জানতে আপনি getPower() মেথডটি ব্যবহার করতে পারেন।

দুটি পাবলিক মেথড বিশেষভাবে উপযোগী যদি আপনি আপনার অ্যাপ্লিকেশনটিকে বিভিন্ন প্রস্তুতকারকের সেন্সর বা কোনো সেন্সরের বিভিন্ন সংস্করণের জন্য অপ্টিমাইজ করতে চান। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনকে ব্যবহারকারীর অঙ্গভঙ্গি যেমন টিল্ট এবং শেক নিরীক্ষণ করার প্রয়োজন হয়, তাহলে আপনি একটি নির্দিষ্ট বিক্রেতার গ্র্যাভিটি সেন্সরযুক্ত নতুন ডিভাইসগুলির জন্য এক সেট ডেটা ফিল্টারিং নিয়ম এবং অপ্টিমাইজেশন তৈরি করতে পারেন, এবং অন্য সেট ডেটা ফিল্টারিং নিয়ম এবং অপ্টিমাইজেশন তৈরি করতে পারেন সেইসব ডিভাইসের জন্য যেগুলিতে গ্র্যাভিটি সেন্সর নেই এবং শুধুমাত্র অ্যাক্সেলেরোমিটার রয়েছে। নিম্নলিখিত কোড নমুনাটি দেখায় যে আপনি কীভাবে এটি করার জন্য getVendor() এবং getVersion() মেথডগুলি ব্যবহার করতে পারেন। এই নমুনায়, আমরা এমন একটি গ্র্যাভিটি সেন্সর খুঁজছি যার বিক্রেতা হিসাবে Google LLC তালিকাভুক্ত আছে এবং যার সংস্করণ নম্বর ৩। যদি সেই নির্দিষ্ট সেন্সরটি ডিভাইসে উপস্থিত না থাকে, আমরা অ্যাক্সেলেরোমিটার ব্যবহার করার চেষ্টা করি।

কোটলিন

private lateinit var sensorManager: SensorManager
private var mSensor: Sensor? = null

...

sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) {
    val gravSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_GRAVITY)
    // Use the version 3 gravity sensor.
    mSensor = gravSensors.firstOrNull { it.vendor.contains("Google LLC") && it.version == 3 }
}
if (mSensor == null) {
    // Use the accelerometer.
    mSensor = if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
    } else {
        // Sorry, there are no accelerometers on your device.
        // You can't play this game.
        null
    }
}

জাভা

private SensorManager sensorManager;
private Sensor mSensor;

...

sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = null;

if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){
    List<Sensor> gravSensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY);
    for(int i=0; i<gravSensors.size(); i++) {
        if ((gravSensors.get(i).getVendor().contains("Google LLC")) &&
           (gravSensors.get(i).getVersion() == 3)){
            // Use the version 3 gravity sensor.
            mSensor = gravSensors.get(i);
        }
    }
}
if (mSensor == null){
    // Use the accelerometer.
    if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
        mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    } else{
        // Sorry, there are no accelerometers on your device.
        // You can't play this game.
    }
}

আরেকটি দরকারি পদ্ধতি হলো getMinDelay() মেথড, যা একটি সেন্সরের ডেটা সেন্স করার জন্য ব্যবহৃত সর্বনিম্ন সময় ব্যবধান (মাইক্রোসেকেন্ডে) রিটার্ন করে। যে কোনো সেন্সর যা getMinDelay() মেথডের জন্য একটি অশূন্য মান রিটার্ন করে, সেটি একটি স্ট্রিমিং সেন্সর। স্ট্রিমিং সেন্সরগুলো নিয়মিত বিরতিতে ডেটা সেন্স করে এবং এগুলো অ্যান্ড্রয়েড ২.৩ (এপিআই লেভেল ৯)-এ চালু করা হয়েছিল। যদি কোনো সেন্সর getMinDelay() মেথড কল করার পর শূন্য রিটার্ন করে, তার মানে হলো সেন্সরটি একটি স্ট্রিমিং সেন্সর নয়, কারণ এটি শুধুমাত্র তখনই ডেটা রিপোর্ট করে যখন এর সেন্স করা প্যারামিটারগুলোতে কোনো পরিবর্তন আসে।

getMinDelay() মেথডটি বেশ দরকারি, কারণ এর মাধ্যমে একটি সেন্সর সর্বোচ্চ কী হারে ডেটা সংগ্রহ করতে পারবে তা নির্ধারণ করা যায়। আপনার অ্যাপ্লিকেশনের নির্দিষ্ট কিছু ফিচারের জন্য যদি উচ্চ হারে ডেটা সংগ্রহ বা স্ট্রিমিং সেন্সরের প্রয়োজন হয়, তবে সেন্সরটি সেই চাহিদা পূরণ করে কি না তা জানতে আপনি এই মেথডটি ব্যবহার করতে পারেন এবং সেই অনুযায়ী আপনার অ্যাপ্লিকেশনের প্রাসঙ্গিক ফিচারগুলো চালু বা বন্ধ করতে পারেন।

সতর্কতা: একটি সেন্সরের সর্বোচ্চ ডেটা সংগ্রহের হার অগত্যা সেই হার নয়, যে হারে সেন্সর ফ্রেমওয়ার্ক আপনার অ্যাপ্লিকেশনে সেন্সর ডেটা সরবরাহ করে। সেন্সর ফ্রেমওয়ার্ক সেন্সর ইভেন্টের মাধ্যমে ডেটা রিপোর্ট করে, এবং বেশ কিছু বিষয় আপনার অ্যাপ্লিকেশন যে হারে সেন্সর ইভেন্ট গ্রহণ করবে, তাকে প্রভাবিত করে। আরও তথ্যের জন্য, ‘সেন্সর ইভেন্ট পর্যবেক্ষণ’ দেখুন।

সেন্সর ইভেন্ট পর্যবেক্ষণ

র সেন্সর ডেটা মনিটর করার জন্য আপনাকে দুটি কলব্যাক মেথড ইমপ্লিমেন্ট করতে হবে, যা SensorEventListener ইন্টারফেসের মাধ্যমে উপলব্ধ: onAccuracyChanged() এবং onSensorChanged() । যখনই নিম্নলিখিত ঘটনাটি ঘটে, অ্যান্ড্রয়েড সিস্টেম এই মেথডগুলোকে কল করে:

  • একটি সেন্সরের নির্ভুলতা পরিবর্তিত হয়।

    এই ক্ষেত্রে সিস্টেমটি onAccuracyChanged() মেথডটি কল করে, যা আপনাকে পরিবর্তিত Sensor অবজেক্টটির একটি রেফারেন্স এবং সেন্সরটির নতুন অ্যাকুরেসি প্রদান করে। অ্যাকুরেসি চারটি স্ট্যাটাস কনস্ট্যান্টের একটি দ্বারা প্রকাশ করা হয়: SENSOR_STATUS_ACCURACY_LOW , SENSOR_STATUS_ACCURACY_MEDIUM , SENSOR_STATUS_ACCURACY_HIGH , অথবা SENSOR_STATUS_UNRELIABLE

  • একটি সেন্সর নতুন মান জানায়।

    এই ক্ষেত্রে সিস্টেমটি onSensorChanged() মেথডটি কল করে এবং আপনাকে একটি SensorEvent অবজেক্ট প্রদান করে। একটি SensorEvent অবজেক্টে নতুন সেন্সর ডেটা সম্পর্কিত তথ্য থাকে, যার মধ্যে অন্তর্ভুক্ত রয়েছে: ডেটার নির্ভুলতা, যে সেন্সরটি ডেটা তৈরি করেছে, ডেটা তৈরির টাইমস্ট্যাম্প এবং সেন্সর দ্বারা রেকর্ড করা নতুন ডেটা।

নিম্নলিখিত কোডটি দেখায় কিভাবে লাইট সেন্সর থেকে ডেটা মনিটর করার জন্য onSensorChanged() মেথডটি ব্যবহার করতে হয়। এই উদাহরণটি main.xml ফাইলে sensor_data হিসেবে সংজ্ঞায়িত একটি TextView তে সেন্সরের মূল ডেটা প্রদর্শন করে।

কোটলিন

class SensorActivity : Activity(), SensorEventListener {
    private lateinit var sensorManager: SensorManager
    private var mLight: Sensor? = null

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)

        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
    }

    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
        // Do something here if sensor accuracy changes.
    }

    override fun onSensorChanged(event: SensorEvent) {
        // The light sensor returns a single value.
        // Many sensors return 3 values, one for each axis.
        val lux = event.values[0]
        // Do something with this sensor value.
    }

    override fun onResume() {
        super.onResume()
        mLight?.also { light ->
            sensorManager.registerListener(this, light, SensorManager.SENSOR_DELAY_NORMAL)
        }
    }

    override fun onPause() {
        super.onPause()
        sensorManager.unregisterListener(this)
    }
}

জাভা

public class SensorActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor mLight;

    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

    @Override
    public final void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
    }

    @Override
    public final void onSensorChanged(SensorEvent event) {
        // The light sensor returns a single value.
        // Many sensors return 3 values, one for each axis.
        float lux = event.values[0];
        // Do something with this sensor value.
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }
}

এই উদাহরণে, registerListener() মেথডটি কল করার সময় ডিফল্ট ডেটা ডিলে ( SENSOR_DELAY_NORMAL ) নির্দিষ্ট করা হয়েছে। ডেটা ডিলে (বা স্যাম্পলিং রেট) onSensorChanged() কলব্যাক মেথডের মাধ্যমে আপনার অ্যাপ্লিকেশনে সেন্সর ইভেন্ট পাঠানোর ব্যবধান নিয়ন্ত্রণ করে। ডিফল্ট ডেটা ডিলে সাধারণ স্ক্রিন ওরিয়েন্টেশন পরিবর্তন নিরীক্ষণের জন্য উপযুক্ত এবং এটি ২০০,০০০ মাইক্রোসেকেন্ডের একটি ডিলে ব্যবহার করে। আপনি অন্যান্য ডেটা ডিলে নির্দিষ্ট করতে পারেন, যেমন SENSOR_DELAY_GAME (২০,০০০ মাইক্রোসেকেন্ড ডিলে), SENSOR_DELAY_UI (৬০,০০০ মাইক্রোসেকেন্ড ডিলে), বা SENSOR_DELAY_FASTEST (০ মাইক্রোসেকেন্ড ডিলে)। অ্যান্ড্রয়েড ৩.০ (এপিআই লেভেল ১১) থেকে আপনি ডিলে-কে একটি পরম মান (মাইক্রোসেকেন্ডে) হিসাবেও নির্দিষ্ট করতে পারেন।

আপনি যে ডিলে নির্দিষ্ট করেন তা শুধুমাত্র একটি প্রস্তাবিত ডিলে। অ্যান্ড্রয়েড সিস্টেম এবং অন্যান্য অ্যাপ্লিকেশন এই ডিলে পরিবর্তন করতে পারে। সর্বোত্তম অনুশীলন হিসেবে, আপনার পক্ষে সম্ভব সবচেয়ে বড় ডিলে নির্দিষ্ট করা উচিত, কারণ সিস্টেম সাধারণত আপনার নির্দিষ্ট করা ডিলের চেয়ে কম ডিলে ব্যবহার করে (অর্থাৎ, আপনার এমন ধীরতম স্যাম্পলিং রেট বেছে নেওয়া উচিত যা আপনার অ্যাপ্লিকেশনের চাহিদা পূরণ করে)। বেশি ডিলে ব্যবহার করলে প্রসেসরের উপর চাপ কম পড়ে এবং ফলস্বরূপ শক্তিও কম খরচ হয়।

সেন্সর ফ্রেমওয়ার্ক আপনার অ্যাপ্লিকেশনে কী হারে সেন্সর ইভেন্ট পাঠাচ্ছে তা নির্ধারণ করার জন্য কোনো পাবলিক মেথড নেই; তবে, আপনি প্রতিটি সেন্সর ইভেন্টের সাথে যুক্ত টাইমস্ট্যাম্প ব্যবহার করে একাধিক ইভেন্টের স্যাম্পলিং রেট গণনা করতে পারেন। একবার স্যাম্পলিং রেট (ডিলে) সেট করে দিলে তা আর পরিবর্তন করার প্রয়োজন হবে না। যদি কোনো কারণে আপনার ডিলে পরিবর্তন করার প্রয়োজন হয়, তবে আপনাকে সেন্সর লিসেনারটি আনরেজিস্টার এবং পুনরায় রেজিস্টার করতে হবে।

এটিও মনে রাখা গুরুত্বপূর্ণ যে, এই উদাহরণটিতে সেন্সর ইভেন্ট লিসেনার রেজিস্টার এবং আনরেজিস্টার করার জন্য onResume() এবং onPause() কলব্যাক মেথড ব্যবহার করা হয়েছে। একটি উত্তম অভ্যাস হিসেবে, আপনার সবসময় অপ্রয়োজনীয় সেন্সরগুলো নিষ্ক্রিয় করে রাখা উচিত, বিশেষ করে যখন আপনার অ্যাক্টিভিটি পজ করা থাকে। এটি করতে ব্যর্থ হলে মাত্র কয়েক ঘণ্টার মধ্যেই ব্যাটারি শেষ হয়ে যেতে পারে, কারণ কিছু সেন্সরের প্রচুর শক্তির প্রয়োজন হয় এবং সেগুলো দ্রুত ব্যাটারি শক্তি খরচ করে ফেলে। স্ক্রিন বন্ধ হয়ে গেলে সিস্টেম স্বয়ংক্রিয়ভাবে সেন্সরগুলো নিষ্ক্রিয় করবে না।

বিভিন্ন সেন্সর কনফিগারেশন পরিচালনা করা

অ্যান্ড্রয়েড ডিভাইসগুলির জন্য কোনো নির্দিষ্ট স্ট্যান্ডার্ড সেন্সর কনফিগারেশন উল্লেখ করে না, যার মানে হলো ডিভাইস নির্মাতারা তাদের অ্যান্ড্রয়েড-চালিত ডিভাইসগুলিতে নিজেদের ইচ্ছামতো যেকোনো সেন্সর কনফিগারেশন অন্তর্ভুক্ত করতে পারেন। ফলে, ডিভাইসগুলিতে বিভিন্ন ধরনের কনফিগারেশনে নানা রকম সেন্সর থাকতে পারে। যদি আপনার অ্যাপ্লিকেশনটি কোনো নির্দিষ্ট ধরনের সেন্সরের উপর নির্ভর করে, তবে আপনাকে নিশ্চিত করতে হবে যে ডিভাইসটিতে সেই সেন্সরটি উপস্থিত আছে, যাতে আপনার অ্যাপটি সফলভাবে চলতে পারে।

কোনো ডিভাইসে একটি নির্দিষ্ট সেন্সর উপস্থিত আছে কিনা তা নিশ্চিত করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে:

  • রানটাইমে সেন্সরগুলি সনাক্ত করুন এবং প্রয়োজন অনুযায়ী অ্যাপ্লিকেশনের বৈশিষ্ট্যগুলি সক্ষম বা অক্ষম করুন।
  • নির্দিষ্ট সেন্সর কনফিগারেশনযুক্ত ডিভাইসগুলোকে টার্গেট করতে গুগল প্লে ফিল্টার ব্যবহার করুন।

নিম্নলিখিত বিভাগগুলিতে প্রতিটি বিকল্প নিয়ে আলোচনা করা হয়েছে।

রানটাইমে সেন্সর সনাক্তকরণ

যদি আপনার অ্যাপ্লিকেশন কোনো নির্দিষ্ট ধরনের সেন্সর ব্যবহার করে, কিন্তু সেটির উপর নির্ভরশীল না হয়, তাহলে আপনি রানটাইমে সেন্সরটি শনাক্ত করতে এবং প্রয়োজন অনুযায়ী অ্যাপ্লিকেশনের ফিচারগুলো নিষ্ক্রিয় বা সক্রিয় করতে সেন্সর ফ্রেমওয়ার্ক ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি নেভিগেশন অ্যাপ্লিকেশন তাপমাত্রা, বায়ুমণ্ডলীয় চাপ, অবস্থান এবং কম্পাস বেয়ারিং প্রদর্শন করার জন্য তাপমাত্রা সেন্সর, চাপ সেন্সর, জিপিএস সেন্সর এবং ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর ব্যবহার করতে পারে। যদি কোনো ডিভাইসে চাপ সেন্সর না থাকে, তাহলে আপনি রানটাইমে চাপ সেন্সরের অনুপস্থিতি শনাক্ত করতে এবং আপনার অ্যাপ্লিকেশনের UI-এর যে অংশটি চাপ প্রদর্শন করে, তা নিষ্ক্রিয় করতে সেন্সর ফ্রেমওয়ার্ক ব্যবহার করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি একটি ডিভাইসে চাপ সেন্সর আছে কিনা তা পরীক্ষা করে:

কোটলিন

private lateinit var sensorManager: SensorManager
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null) {
    // Success! There's a pressure sensor.
} else {
    // Failure! No pressure sensor.
}

জাভা

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){
    // Success! There's a pressure sensor.
} else {
    // Failure! No pressure sensor.
}

নির্দিষ্ট সেন্সর কনফিগারেশন লক্ষ্য করতে গুগল প্লে ফিল্টার ব্যবহার করা

আপনি যদি গুগল প্লে-তে আপনার অ্যাপ্লিকেশনটি প্রকাশ করেন, তাহলে আপনার অ্যাপ্লিকেশনের জন্য উপযুক্ত সেন্সর কনফিগারেশন নেই এমন ডিভাইসগুলো থেকে অ্যাপ্লিকেশনটি ফিল্টার করার জন্য আপনি আপনার ম্যানিফেস্ট ফাইলে <uses-feature> এলিমেন্টটি ব্যবহার করতে পারেন। <uses-feature> এলিমেন্টটিতে বেশ কিছু হার্ডওয়্যার ডেসক্রিপ্টর রয়েছে, যা আপনাকে নির্দিষ্ট সেন্সরের উপস্থিতির উপর ভিত্তি করে অ্যাপ্লিকেশন ফিল্টার করতে দেয়। আপনি যে সেন্সরগুলো তালিকাভুক্ত করতে পারেন তার মধ্যে রয়েছে: অ্যাক্সেলেরোমিটার, ব্যারোমিটার, কম্পাস (ভূ-চৌম্বক ক্ষেত্র), জাইরোস্কোপ, লাইট এবং প্রক্সিমিটি। নিচে একটি উদাহরণ ম্যানিফেস্ট এন্ট্রি দেওয়া হলো যা অ্যাক্সেলেরোমিটার নেই এমন অ্যাপগুলোকে ফিল্টার করে:

<uses-feature android:name="android.hardware.sensor.accelerometer"
              android:required="true" />

আপনি যদি আপনার অ্যাপ্লিকেশনের ম্যানিফেস্টে এই এলিমেন্ট এবং ডেসক্রিপ্টরটি যোগ করেন, তাহলে ব্যবহারকারীরা গুগল প্লে-তে আপনার অ্যাপ্লিকেশনটি কেবল তখনই দেখতে পাবেন, যদি তাদের ডিভাইসে অ্যাক্সেলেরোমিটার থাকে।

আপনার অ্যাপ্লিকেশনটি যদি কোনো নির্দিষ্ট সেন্সরের উপর সম্পূর্ণরূপে নির্ভরশীল হয়, তবেই কেবল ডেসক্রিপ্টরটি android:required="true" সেট করা উচিত। যদি আপনার অ্যাপ্লিকেশনটি কোনো কার্যকারিতার জন্য একটি সেন্সর ব্যবহার করে, কিন্তু সেন্সরটি ছাড়াও চলতে পারে, তবে আপনার <uses-feature> এলিমেন্টে সেন্সরটির নাম উল্লেখ করা উচিত, কিন্তু ডেসক্রিপ্টরটি android:required="false" সেট করতে হবে। এটি নিশ্চিত করতে সাহায্য করে যে, ডিভাইসগুলোতে সেই নির্দিষ্ট সেন্সরটি না থাকলেও তারা আপনার অ্যাপটি ইনস্টল করতে পারবে। এটি প্রজেক্ট ম্যানেজমেন্টের একটি সেরা অনুশীলনও বটে, যা আপনার অ্যাপ্লিকেশন কোন কোন ফিচার ব্যবহার করছে তার হিসাব রাখতে সাহায্য করে। মনে রাখবেন, যদি আপনার অ্যাপ্লিকেশনটি কোনো নির্দিষ্ট সেন্সর ব্যবহার করে, কিন্তু সেন্সরটি ছাড়াও চলতে থাকে, তবে আপনার রানটাইমে সেন্সরটি শনাক্ত করা উচিত এবং প্রয়োজন অনুযায়ী অ্যাপ্লিকেশনের ফিচারগুলো নিষ্ক্রিয় বা সক্রিয় করা উচিত।

সেন্সর স্থানাঙ্ক ব্যবস্থা

সাধারণত, সেন্সর ফ্রেমওয়ার্ক ডেটা মান প্রকাশ করার জন্য একটি আদর্শ ৩-অক্ষীয় স্থানাঙ্ক ব্যবস্থা ব্যবহার করে। বেশিরভাগ সেন্সরের ক্ষেত্রে, ডিভাইসটিকে তার ডিফল্ট অবস্থানে ধরে রাখলে স্থানাঙ্ক ব্যবস্থাটি ডিভাইসের স্ক্রিনের সাপেক্ষে সংজ্ঞায়িত করা হয় (চিত্র ১ দেখুন)। যখন একটি ডিভাইসকে তার ডিফল্ট অবস্থানে ধরা হয়, তখন X অক্ষটি অনুভূমিক থাকে এবং ডানদিকে নির্দেশ করে, Y অক্ষটি উল্লম্ব থাকে এবং উপরের দিকে নির্দেশ করে, এবং Z অক্ষটি স্ক্রিনের বাইরের দিকে নির্দেশ করে। এই ব্যবস্থায়, স্ক্রিনের পেছনের স্থানাঙ্কগুলোর Z-এর মান ঋণাত্মক হয়। নিম্নলিখিত সেন্সরগুলো এই স্থানাঙ্ক ব্যবস্থাটি ব্যবহার করে:

চিত্র ১. সেন্সর এপিআই দ্বারা ব্যবহৃত স্থানাঙ্ক ব্যবস্থা (একটি ডিভাইসের সাপেক্ষে)।

এই স্থানাঙ্ক ব্যবস্থা সম্পর্কে বোঝার সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হলো, ডিভাইসের স্ক্রিনের অভিমুখ পরিবর্তিত হলেও অক্ষগুলো অদলবদল হয় না—অর্থাৎ, ডিভাইসটি নড়াচড়া করলেও সেন্সরের স্থানাঙ্ক ব্যবস্থা কখনও পরিবর্তিত হয় না। এই আচরণটি OpenGL স্থানাঙ্ক ব্যবস্থার আচরণের মতোই।

আরেকটি বিষয় বুঝতে হবে যে, আপনার অ্যাপ্লিকেশনটি যেন কোনো ডিভাইসের স্বাভাবিক (ডিফল্ট) ওরিয়েন্টেশনকে পোর্ট্রেট বলে ধরে না নেয়। অনেক ট্যাবলেট ডিভাইসের স্বাভাবিক ওরিয়েন্টেশন হলো ল্যান্ডস্কেপ। এবং সেন্সরের স্থানাঙ্ক ব্যবস্থা সর্বদা ডিভাইসের স্বাভাবিক ওরিয়েন্টেশনের উপর ভিত্তি করে তৈরি হয়।

অবশেষে, যদি আপনার অ্যাপ্লিকেশনটি সেন্সর ডেটার সাথে অন-স্ক্রিন ডিসপ্লে মেলায়, তাহলে স্ক্রিন রোটেশন নির্ধারণ করার জন্য আপনাকে getRotation() মেথডটি ব্যবহার করতে হবে এবং তারপর সেন্সর কোঅর্ডিনেটকে স্ক্রিন কোঅর্ডিনেটে ম্যাপ করার জন্য remapCoordinateSystem() মেথডটি ব্যবহার করতে হবে। আপনার ম্যানিফেস্টে শুধুমাত্র পোর্ট্রেট ডিসপ্লে নির্দিষ্ট করা থাকলেও আপনাকে এটি করতে হবে।

দ্রষ্টব্য: কিছু সেন্সর এবং মেথড এমন একটি স্থানাঙ্ক ব্যবস্থা ব্যবহার করে যা বিশ্বের প্রসঙ্গ কাঠামোর সাপেক্ষে (ডিভাইসের প্রসঙ্গ কাঠামোর বিপরীতে)। এই সেন্সর এবং মেথডগুলো এমন ডেটা ফেরত দেয় যা পৃথিবীর সাপেক্ষে ডিভাইসের গতি বা ডিভাইসের অবস্থানকে উপস্থাপন করে। আরও তথ্যের জন্য, getOrientation() মেথড, getRotationMatrix() মেথড, Orientation Sensor এবং Rotation Vector Sensor দেখুন।

সেন্সর রেট-লিমিটিং

ব্যবহারকারীদের সম্ভাব্য সংবেদনশীল তথ্য সুরক্ষিত রাখতে, আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে সিস্টেম নির্দিষ্ট কিছু মোশন সেন্সর এবং পজিশন সেন্সর থেকে প্রাপ্ত ডেটার রিফ্রেশ রেটে একটি সীমা আরোপ করে। এই ডেটার মধ্যে ডিভাইসের অ্যাক্সেলেরোমিটার , জাইরোস্কোপ এবং ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর দ্বারা রেকর্ড করা মানগুলো অন্তর্ভুক্ত থাকে।

রিফ্রেশ রেটের সীমা নির্ভর করে আপনি কীভাবে সেন্সর ডেটা অ্যাক্সেস করেন তার উপর:

  • আপনি যদি সেন্সর ইভেন্ট নিরীক্ষণ করার জন্য registerListener() মেথডটি কল করেন, তাহলে সেন্সরের স্যাম্পলিং রেট 200 Hz-এ সীমিত থাকে। registerListener() মেথডের সমস্ত ওভারলোডেড সংস্করণের ক্ষেত্রেই এটি প্রযোজ্য।
  • আপনি যদি SensorDirectChannel ক্লাসটি ব্যবহার করেন, তাহলে সেন্সরের স্যাম্পলিং রেট RATE_NORMAL এ সীমাবদ্ধ থাকে, যা সাধারণত প্রায় ৫০ Hz হয়ে থাকে।

যদি আপনার অ্যাপকে উচ্চ হারে মোশন সেন্সর ডেটা সংগ্রহ করার প্রয়োজন হয়, তাহলে আপনাকে অবশ্যই HIGH_SAMPLING_RATE_SENSORS পারমিশনটি ডিক্লেয়ার করতে হবে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে। অন্যথায়, যদি আপনার অ্যাপ এই পারমিশনটি ডিক্লেয়ার না করে উচ্চ হারে মোশন সেন্সর ডেটা সংগ্রহ করার চেষ্টা করে, তাহলে একটি SecurityException ঘটবে।

AndroidManifest.xml

<manifest ...>
    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/>
    <application ...>
        ...
    </application>
</manifest>

সেন্সর অ্যাক্সেস এবং ব্যবহারের সর্বোত্তম অনুশীলন

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

শুধুমাত্র সম্মুখভাগে সেন্সর ডেটা সংগ্রহ করুন

অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) বা তার চেয়ে উন্নত সংস্করণে চালিত ডিভাইসগুলোতে, ব্যাকগ্রাউন্ডে চলমান অ্যাপগুলোর ক্ষেত্রে নিম্নলিখিত সীমাবদ্ধতাগুলো রয়েছে:

  • অ্যাক্সেলেরোমিটার এবং জাইরোস্কোপের মতো যেসব সেন্সর অবিচ্ছিন্ন রিপোর্টিং মোড ব্যবহার করে, সেগুলো কোনো ইভেন্ট গ্রহণ করে না।
  • যেসব সেন্সর অন-চেঞ্জ বা ওয়ান-শট রিপোর্টিং মোড ব্যবহার করে, সেগুলো ইভেন্ট গ্রহণ করে না।

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

সেন্সর লিসেনার নিবন্ধন বাতিল করুন

সেন্সর ব্যবহার করা শেষ হলে বা সেন্সরের কার্যকলাপ বিরতি নিলে, সেন্সরের লিসেনারটি অবশ্যই অনিবন্ধিত করুন। যদি একটি সেন্সর লিসেনার নিবন্ধিত থাকে এবং এর কার্যকলাপ বিরতি দেওয়া হয়, তবে আপনি সেন্সরটি অনিবন্ধিত না করা পর্যন্ত এটি ডেটা সংগ্রহ করতে এবং ব্যাটারির শক্তি ব্যবহার করতে থাকবে। নিচের কোডটিতে দেখানো হয়েছে কিভাবে onPause() মেথড ব্যবহার করে একটি লিসেনার অনিবন্ধিত করা যায়:

কোটলিন

private lateinit var sensorManager: SensorManager
...
override fun onPause() {
    super.onPause()
    sensorManager.unregisterListener(this)
}

জাভা

private SensorManager sensorManager;
...
@Override
protected void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
}

আরও তথ্যের জন্য, unregisterListener(SensorEventListener) দেখুন।

অ্যান্ড্রয়েড এমুলেটর দিয়ে পরীক্ষা করুন

অ্যান্ড্রয়েড এমুলেটরটিতে এক সেট ভার্চুয়াল সেন্সর কন্ট্রোল রয়েছে, যা আপনাকে অ্যাক্সেলেরোমিটার, পারিপার্শ্বিক তাপমাত্রা, ম্যাগনেটোমিটার, প্রক্সিমিটি, আলো এবং আরও অনেক সেন্সর পরীক্ষা করার সুযোগ দেয়।

এমুলেটরটি এমন একটি অ্যান্ড্রয়েড ডিভাইসের সাথে সংযোগ স্থাপন করে, যেটিতে SdkControllerSensor অ্যাপটি চলছে। উল্লেখ্য যে, এই অ্যাপটি শুধুমাত্র অ্যান্ড্রয়েড ৪.০ (এপিআই লেভেল ১৪) বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতেই পাওয়া যায়। (যদি ডিভাইসটিতে অ্যান্ড্রয়েড ৪.০ চলে, তবে এতে অবশ্যই রিভিশন ২ ইনস্টল করা থাকতে হবে।) SdkControllerSensor অ্যাপটি ডিভাইসের সেন্সরগুলির পরিবর্তন পর্যবেক্ষণ করে এবং সেগুলিকে এমুলেটরে প্রেরণ করে। এরপর আপনার ডিভাইসের সেন্সরগুলি থেকে প্রাপ্ত নতুন মানগুলির উপর ভিত্তি করে এমুলেটরটি রূপান্তরিত হয়।

আপনি SdkControllerSensor অ্যাপটির সোর্স কোড নিম্নলিখিত স্থানে দেখতে পারেন:

$ your-android-sdk-directory/tools/apps/SdkController

আপনার ডিভাইস এবং এমুলেটরের মধ্যে ডেটা স্থানান্তর করতে, এই ধাপগুলো অনুসরণ করুন:

  1. আপনার ডিভাইসে ইউএসবি ডিবাগিং চালু আছে কিনা তা যাচাই করুন।
  2. একটি ইউএসবি ক্যাবল ব্যবহার করে আপনার ডিভাইসটিকে ডেভেলপমেন্ট মেশিনের সাথে সংযুক্ত করুন।
  3. আপনার ডিভাইসে SdkControllerSensor অ্যাপটি চালু করুন।
  4. অ্যাপটিতে, আপনি যে সেন্সরগুলো অনুকরণ করতে চান, সেগুলো নির্বাচন করুন।
  5. নিম্নলিখিত adb কমান্ডটি চালান:

  6. $ adb forward tcp:1968 tcp:1968
    
  7. এমুলেটরটি চালু করুন। এখন আপনি আপনার ডিভাইসটি নাড়াচাড়া করে এমুলেটরটিতে পরিবর্তন প্রয়োগ করতে পারবেন।

দ্রষ্টব্য: আপনার ফিজিক্যাল ডিভাইসে করা পরিবর্তনগুলো যদি এমুলেটরটিকে রূপান্তরিত না করে, তবে ধাপ ৫ থেকে adb কমান্ডটি আবার চালানোর চেষ্টা করুন।

আরও তথ্যের জন্য অ্যান্ড্রয়েড এমুলেটর নির্দেশিকা দেখুন।

onSensorChanged() মেথডটি ব্লক করবেন না।

সেন্সর ডেটা খুব দ্রুত পরিবর্তিত হতে পারে, যার মানে হলো সিস্টেমটি প্রায়শই onSensorChanged(SensorEvent) মেথডটি কল করতে পারে। একটি উত্তম অভ্যাস হিসেবে, আপনার onSensorChanged(SensorEvent) মেথডের মধ্যে যতটা সম্ভব কম কাজ করা উচিত, যাতে এটি ব্লক না হয়ে যায়। যদি আপনার অ্যাপ্লিকেশনে সেন্সর ডেটা ফিল্টারিং বা হ্রাস করার প্রয়োজন হয়, তবে সেই কাজটি onSensorChanged(SensorEvent) মেথডের বাইরে করা উচিত।

অপ্রচলিত পদ্ধতি বা সেন্সর প্রকার ব্যবহার করা থেকে বিরত থাকুন।

বেশ কিছু মেথড এবং কনস্ট্যান্ট বাতিল করা হয়েছে। বিশেষ করে, TYPE_ORIENTATION সেন্সর টাইপটি বাতিল করা হয়েছে। ওরিয়েন্টেশন ডেটা পেতে এর পরিবর্তে getOrientation() মেথডটি ব্যবহার করা উচিত। একইভাবে, TYPE_TEMPERATURE সেন্সর টাইপটিও বাতিল করা হয়েছে। Android 4.0 চালিত ডিভাইসগুলিতে এর পরিবর্তে TYPE_AMBIENT_TEMPERATURE সেন্সর টাইপটি ব্যবহার করা উচিত।

সেন্সরগুলো ব্যবহার করার আগে যাচাই করে নিন।

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

সেন্সর বিলম্ব সাবধানে নির্বাচন করুন

যখন আপনি registerListener() মেথড ব্যবহার করে একটি সেন্সর রেজিস্টার করেন, তখন নিশ্চিত হয়ে নিন যে আপনি এমন একটি ডেলিভারি রেট বেছে নিয়েছেন যা আপনার অ্যাপ্লিকেশন বা ব্যবহারের ক্ষেত্রের জন্য উপযুক্ত। সেন্সরগুলো খুব উচ্চ হারে ডেটা সরবরাহ করতে পারে। সিস্টেমকে আপনার অপ্রয়োজনীয় অতিরিক্ত ডেটা পাঠানোর অনুমতি দিলে তা সিস্টেমের রিসোর্স নষ্ট করে এবং ব্যাটারির শক্তি খরচ করে।