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

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

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

  • মোশন সেন্সর

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

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

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

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

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

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

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

এই বিষয়টি Android প্ল্যাটফর্মে উপলব্ধ সেন্সরগুলির একটি ওভারভিউ প্রদান করে৷ এটি সেন্সর কাঠামোর একটি ভূমিকাও প্রদান করে।

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

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

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

সারণী 1. সেন্সর প্রকারগুলি অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা সমর্থিত৷

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

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

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

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

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

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

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

  • সেন্সর ইভেন্ট মনিটর

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

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

যদিও সেন্সর প্রাপ্যতা ডিভাইস থেকে ডিভাইসে পরিবর্তিত হয়, এটি Android সংস্করণগুলির মধ্যেও পরিবর্তিত হতে পারে। কারণ বেশ কয়েকটি প্ল্যাটফর্ম রিলিজের সময় অ্যান্ড্রয়েড সেন্সর চালু করা হয়েছে। উদাহরণস্বরূপ, অনেকগুলি সেন্সর Android 1.5 (API স্তর 3) এ চালু করা হয়েছিল, কিন্তু কিছু প্রয়োগ করা হয়নি এবং Android 2.3 (API স্তর 9) পর্যন্ত ব্যবহারের জন্য উপলব্ধ ছিল না। একইভাবে, অ্যান্ড্রয়েড 2.3 (এপিআই লেভেল 9) এবং অ্যান্ড্রয়েড 4.0 (এপিআই লেভেল 14) এ বেশ কয়েকটি সেন্সর চালু করা হয়েছিল। দুটি সেন্সর অবমূল্যায়ন করা হয়েছে এবং নতুন, ভালো সেন্সর দ্বারা প্রতিস্থাপিত হয়েছে৷

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

টেবিল 2. প্ল্যাটফর্ম দ্বারা সেন্সর প্রাপ্যতা.

সেন্সর অ্যান্ড্রয়েড 4.0
(API লেভেল 14)
অ্যান্ড্রয়েড 2.3
(API লেভেল 9)
অ্যান্ড্রয়েড 2.2
(API লেভেল 8)
অ্যান্ড্রয়েড 1.5
(API লেভেল 3)
TYPE_ACCELEROMETER হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_AMBIENT_TEMPERATURE হ্যাঁ n/a n/a n/a
TYPE_GRAVITY হ্যাঁ হ্যাঁ n/a n/a
TYPE_GYROSCOPE হ্যাঁ হ্যাঁ n/a 1 n/a 1
TYPE_LIGHT হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_LINEAR_ACCELERATION হ্যাঁ হ্যাঁ n/a n/a
TYPE_MAGNETIC_FIELD হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_ORIENTATION হ্যাঁ 2 হ্যাঁ 2 হ্যাঁ 2 হ্যাঁ
TYPE_PRESSURE হ্যাঁ হ্যাঁ n/a 1 n/a 1
TYPE_PROXIMITY হ্যাঁ হ্যাঁ হ্যাঁ হ্যাঁ
TYPE_RELATIVE_HUMIDITY হ্যাঁ n/a n/a n/a
TYPE_ROTATION_VECTOR হ্যাঁ হ্যাঁ n/a n/a
TYPE_TEMPERATURE হ্যাঁ 2 হ্যাঁ হ্যাঁ হ্যাঁ

1 এই সেন্সর প্রকারটি অ্যান্ড্রয়েড 1.5 (এপিআই লেভেল 3) এ যুক্ত করা হয়েছিল, কিন্তু এটি অ্যান্ড্রয়েড 2.3 (এপিআই লেভেল 9) পর্যন্ত ব্যবহারের জন্য উপলব্ধ ছিল না।

2 এই সেন্সর উপলব্ধ, কিন্তু এটি অবমূল্যায়ন করা হয়েছে.

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

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

একটি ডিভাইসে থাকা সেন্সরগুলি সনাক্ত করতে আপনাকে প্রথমে সেন্সর পরিষেবার একটি রেফারেন্স পেতে হবে৷ এটি করার জন্য, আপনি 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() পদ্ধতি ব্যবহার করে এবং একটি নির্দিষ্ট সেন্সরের জন্য টাইপ ধ্রুবক পাস করে একটি ডিভাইসে একটি নির্দিষ্ট ধরনের সেন্সর বিদ্যমান কিনা তা নির্ধারণ করতে পারেন। যদি একটি ডিভাইসে একটি প্রদত্ত ধরণের একাধিক সেন্সর থাকে, সেন্সরগুলির মধ্যে একটিকে অবশ্যই ডিফল্ট সেন্সর হিসাবে মনোনীত করতে হবে। যদি প্রদত্ত ধরনের সেন্সরের জন্য একটি ডিফল্ট সেন্সর বিদ্যমান না থাকে, তাহলে পদ্ধতি কলটি নাল রিটার্ন করে, যার মানে ডিভাইসটিতে সেই ধরনের সেন্সর নেই। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি একটি ডিভাইসে ম্যাগনেটোমিটার আছে কিনা তা পরীক্ষা করে:

কোটলিন

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

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

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

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

কোটলিন

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() পদ্ধতির জন্য একটি অ-শূন্য মান প্রদান করে এমন যেকোনো সেন্সর হল একটি স্ট্রিমিং সেন্সর। স্ট্রিমিং সেন্সর নিয়মিত বিরতিতে ডেটা সেন্স করে এবং অ্যান্ড্রয়েড 2.3 (এপিআই লেভেল 9) এ চালু করা হয়েছিল। আপনি getMinDelay() পদ্ধতিতে কল করার সময় যদি একটি সেন্সর শূন্য রিটার্ন করে, তাহলে এর অর্থ হল সেন্সরটি একটি স্ট্রিমিং সেন্সর নয় কারণ এটি শুধুমাত্র তখনই ডেটা রিপোর্ট করে যখন এটি সেন্সিং করা প্যারামিটারে পরিবর্তন হয়।

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

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

মনিটরিং সেন্সর ইভেন্ট

কাঁচা সেন্সর ডেটা নিরীক্ষণ করার জন্য আপনাকে দুটি কলব্যাক পদ্ধতি প্রয়োগ করতে হবে যা SensorEventListener ইন্টারফেসের মাধ্যমে প্রকাশিত হয়: onAccuracyChanged() এবং onSensorChanged() । যখনই নিম্নলিখিতগুলি ঘটে তখনই Android সিস্টেম এই পদ্ধতিগুলিকে কল করে:

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

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

  • একটি সেন্সর একটি নতুন মান রিপোর্ট করে।

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

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

কোটলিন

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() কলব্যাক পদ্ধতির মাধ্যমে আপনার অ্যাপ্লিকেশনে সেন্সর ইভেন্টগুলি যে ব্যবধানে পাঠানো হয় তা ডেটা বিলম্ব (বা স্যাম্পলিং রেট) নিয়ন্ত্রণ করে। ডিফল্ট ডেটা বিলম্বটি সাধারণ স্ক্রীন অভিযোজন পরিবর্তনগুলি পর্যবেক্ষণের জন্য উপযুক্ত এবং 200,000 মাইক্রোসেকেন্ডের বিলম্ব ব্যবহার করে। আপনি অন্যান্য ডেটা বিলম্ব নির্দিষ্ট করতে পারেন, যেমন SENSOR_DELAY_GAME (20,000 মাইক্রোসেকেন্ড বিলম্ব), SENSOR_DELAY_UI (60,000 মাইক্রোসেকেন্ড বিলম্ব), বা SENSOR_DELAY_FASTEST (0 মাইক্রোসেকেন্ড বিলম্ব)। অ্যান্ড্রয়েড 3.0 (এপিআই লেভেল 11) হিসাবে আপনি বিলম্বকে একটি পরম মান (মাইক্রোসেকেন্ডে) হিসাবে নির্দিষ্ট করতে পারেন।

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

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

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

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

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

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

  • রানটাইমে সেন্সরগুলি সনাক্ত করুন এবং উপযুক্ত হিসাবে অ্যাপ্লিকেশন বৈশিষ্ট্যগুলি সক্ষম বা অক্ষম করুন৷
  • নির্দিষ্ট সেন্সর কনফিগারেশন সহ ডিভাইসগুলিকে লক্ষ্য করতে Google Play ফিল্টার ব্যবহার করুন৷

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

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

যদি আপনার অ্যাপ্লিকেশন একটি নির্দিষ্ট ধরনের সেন্সর ব্যবহার করে, কিন্তু এটির উপর নির্ভর না করে, আপনি রানটাইমে সেন্সর সনাক্ত করতে সেন্সর ফ্রেমওয়ার্ক ব্যবহার করতে পারেন এবং তারপর উপযুক্ত হিসাবে অ্যাপ্লিকেশন বৈশিষ্ট্যগুলি নিষ্ক্রিয় বা সক্ষম করতে পারেন৷ উদাহরণস্বরূপ, একটি নেভিগেশন অ্যাপ্লিকেশন তাপমাত্রা, ব্যারোমেট্রিক চাপ, অবস্থান এবং কম্পাস বিয়ারিং প্রদর্শন করতে তাপমাত্রা সেন্সর, চাপ সেন্সর, GPS সেন্সর এবং ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর ব্যবহার করতে পারে। যদি কোনো ডিভাইসে প্রেসার সেন্সর না থাকে, তাহলে আপনি রানটাইমে প্রেসার সেন্সরের অনুপস্থিতি শনাক্ত করতে সেন্সর ফ্রেমওয়ার্ক ব্যবহার করতে পারেন এবং তারপরে আপনার অ্যাপ্লিকেশনের 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.
}

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

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

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

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

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

সেন্সর সমন্বয় সিস্টেম

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

চিত্র 1. সমন্বয় সিস্টেম (একটি ডিভাইসের সাথে সম্পর্কিত) যা সেন্সর API দ্বারা ব্যবহৃত হয়।

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

আরেকটি বিষয় বুঝতে হবে যে আপনার অ্যাপ্লিকেশনটি অনুমান করা উচিত নয় যে একটি ডিভাইসের প্রাকৃতিক (ডিফল্ট) অভিযোজন প্রতিকৃতি। অনেক ট্যাবলেট ডিভাইসের প্রাকৃতিক অভিযোজন হল আড়াআড়ি। এবং সেন্সর সমন্বয় সিস্টেম সবসময় একটি ডিভাইসের প্রাকৃতিক অভিযোজন উপর ভিত্তি করে.

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

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

সেন্সর হার-সীমাবদ্ধকরণ

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

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

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

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

AndroidManifest.xml

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

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

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

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

Android 9 (API স্তর 28) বা উচ্চতর চলমান ডিভাইসগুলিতে, ব্যাকগ্রাউন্ডে চলমান অ্যাপগুলির নিম্নলিখিত বিধিনিষেধ রয়েছে:

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

এই বিধিনিষেধের প্রেক্ষিতে, যখন আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে বা একটি ফোরগ্রাউন্ড পরিষেবার অংশ হিসাবে সেন্সর ইভেন্টগুলি সনাক্ত করা ভাল৷

সেন্সর শ্রোতাদের নিবন্ধনমুক্ত করুন

আপনার সেন্সর ব্যবহার করা হয়ে গেলে বা সেন্সর কার্যকলাপ থামলে সেন্সরের শ্রোতাকে নিবন্ধনমুক্ত করতে ভুলবেন না। যদি একটি সেন্সর শ্রোতা নিবন্ধিত হয় এবং তার কার্যকলাপ বিরতি দেওয়া হয়, সেন্সর ডেটা অর্জন করতে এবং ব্যাটারি সংস্থান ব্যবহার করতে থাকবে যদি না আপনি সেন্সরটি নিবন্ধনমুক্ত না করেন৷ নিচের কোডটি দেখায় কিভাবে 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) দেখুন।

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

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

এমুলেটরটি একটি Android ডিভাইসের সাথে একটি সংযোগ ব্যবহার করে যা SdkControllerSensor অ্যাপটি চালাচ্ছে। মনে রাখবেন যে এই অ্যাপটি শুধুমাত্র Android 4.0 (API লেভেল 14) বা তার উপরে চলমান ডিভাইসগুলিতে উপলব্ধ। (যদি ডিভাইসটি অ্যান্ড্রয়েড 4.0 চালিত হয় তবে এটিতে অবশ্যই রিভিশন 2 ইনস্টল থাকতে হবে।) SdkControllerSensor অ্যাপটি ডিভাইসের সেন্সরগুলির পরিবর্তনগুলি পর্যবেক্ষণ করে এবং এমুলেটরে প্রেরণ করে। আপনার ডিভাইসের সেন্সর থেকে পাওয়া নতুন মানগুলির উপর ভিত্তি করে এমুলেটরটি তখন রূপান্তরিত হয়।

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

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

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

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

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

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

আরও তথ্যের জন্য, Android এমুলেটর গাইড দেখুন।

onSensorChanged() পদ্ধতি ব্লক করবেন না

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

অপ্রচলিত পদ্ধতি বা সেন্সর ধরনের ব্যবহার এড়িয়ে চলুন

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

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

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

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

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