বেশিরভাগ অ্যান্ড্রয়েড-চালিত ডিভাইসে অন্তর্নির্মিত সেন্সর রয়েছে যা গতি, অভিযোজন এবং বিভিন্ন পরিবেশগত অবস্থার পরিমাপ করে। এই সেন্সরগুলি উচ্চ নির্ভুলতা এবং নির্ভুলতার সাথে কাঁচা ডেটা সরবরাহ করতে সক্ষম, এবং আপনি যদি ত্রিমাত্রিক ডিভাইসের গতিবিধি বা অবস্থান নিরীক্ষণ করতে চান বা আপনি কোনও ডিভাইসের কাছাকাছি পরিবেষ্টিত পরিবেশে পরিবর্তনগুলি নিরীক্ষণ করতে চান তবে এটি কার্যকর। উদাহরণস্বরূপ, একটি গেমটি একটি ডিভাইসের মাধ্যাকর্ষণ সেন্সর থেকে রিডিংগুলি ট্র্যাক করতে পারে যাতে ব্যবহারকারীর জটিল অঙ্গভঙ্গি এবং গতিগুলি অনুমান করা যায়, যেমন টিল্ট, শেক, ঘূর্ণন বা সুইং৷ একইভাবে, একটি আবহাওয়া অ্যাপ্লিকেশন শিশির বিন্দু গণনা এবং রিপোর্ট করতে একটি ডিভাইসের তাপমাত্রা সেন্সর এবং আর্দ্রতা সেন্সর ব্যবহার করতে পারে, অথবা একটি ভ্রমণ অ্যাপ্লিকেশন একটি কম্পাস বিয়ারিং রিপোর্ট করতে জিওম্যাগনেটিক ফিল্ড সেন্সর এবং অ্যাক্সিলোমিটার ব্যবহার করতে পারে।
নিম্নলিখিত সম্পর্কিত সংস্থান পড়ুন:
অ্যান্ড্রয়েড প্ল্যাটফর্ম তিনটি বিস্তৃত বিভাগের সেন্সর সমর্থন করে:
- মোশন সেন্সর
এই সেন্সরগুলি তিনটি অক্ষ বরাবর ত্বরণ বল এবং ঘূর্ণন বল পরিমাপ করে। এই বিভাগে অ্যাক্সিলোমিটার, মাধ্যাকর্ষণ সেন্সর, জাইরোস্কোপ এবং ঘূর্ণনশীল ভেক্টর সেন্সর অন্তর্ভুক্ত রয়েছে।
- পরিবেশগত সেন্সর
এই সেন্সরগুলি বিভিন্ন পরিবেশগত পরামিতি পরিমাপ করে, যেমন পরিবেষ্টিত বায়ুর তাপমাত্রা এবং চাপ, আলোকসজ্জা এবং আর্দ্রতা। এই বিভাগে ব্যারোমিটার, ফটোমিটার এবং থার্মোমিটার রয়েছে।
- অবস্থান সেন্সর
এই সেন্সরগুলি একটি ডিভাইসের শারীরিক অবস্থান পরিমাপ করে। এই বিভাগে ওরিয়েন্টেশন সেন্সর এবং ম্যাগনেটোমিটার রয়েছে।
আপনি ডিভাইসে উপলব্ধ সেন্সর অ্যাক্সেস করতে পারেন এবং অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে কাঁচা সেন্সর ডেটা অর্জন করতে পারেন। সেন্সর ফ্রেমওয়ার্ক বিভিন্ন ক্লাস এবং ইন্টারফেস প্রদান করে যা আপনাকে সেন্সর-সম্পর্কিত বিভিন্ন ধরনের কাজ করতে সাহায্য করে। উদাহরণস্বরূপ, আপনি নিম্নলিখিত কাজ করতে সেন্সর ফ্রেমওয়ার্ক ব্যবহার করতে পারেন:
- কোন ডিভাইসে কোন সেন্সর পাওয়া যায় তা নির্ধারণ করুন।
- একটি পৃথক সেন্সরের ক্ষমতা নির্ধারণ করুন, যেমন এর সর্বোচ্চ পরিসীমা, প্রস্তুতকারক, পাওয়ার প্রয়োজনীয়তা এবং রেজোলিউশন।
- কাঁচা সেন্সর ডেটা অর্জন করুন এবং আপনি সেন্সর ডেটা অর্জনের সর্বনিম্ন হার নির্ধারণ করুন৷
- সেন্সর ইভেন্ট শ্রোতাদের নিবন্ধন এবং নিবন্ধনমুক্ত করুন যারা সেন্সর পরিবর্তনগুলি নিরীক্ষণ করে।
এই বিষয়টি Android প্ল্যাটফর্মে উপলব্ধ সেন্সরগুলির একটি ওভারভিউ প্রদান করে৷ এটি সেন্সর কাঠামোর একটি ভূমিকাও প্রদান করে।
সেন্সর পরিচিতি
অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক আপনাকে অনেক ধরনের সেন্সর অ্যাক্সেস করতে দেয়। এর মধ্যে কিছু সেন্সর হার্ডওয়্যার-ভিত্তিক এবং কিছু সফ্টওয়্যার-ভিত্তিক। হার্ডওয়্যার-ভিত্তিক সেন্সর হল একটি হ্যান্ডসেট বা ট্যাবলেট ডিভাইসে নির্মিত শারীরিক উপাদান। তারা সরাসরি নির্দিষ্ট পরিবেশগত বৈশিষ্ট্য যেমন ত্বরণ, ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি, বা কৌণিক পরিবর্তন পরিমাপ করে তাদের ডেটা সংগ্রহ করে। সফ্টওয়্যার-ভিত্তিক সেন্সরগুলি শারীরিক ডিভাইস নয়, যদিও তারা হার্ডওয়্যার-ভিত্তিক সেন্সর অনুকরণ করে। সফ্টওয়্যার-ভিত্তিক সেন্সরগুলি এক বা একাধিক হার্ডওয়্যার-ভিত্তিক সেন্সর থেকে তাদের ডেটা সংগ্রহ করে এবং কখনও কখনও ভার্চুয়াল সেন্সর বা সিন্থেটিক সেন্সর বলা হয়। রৈখিক ত্বরণ সেন্সর এবং মহাকর্ষ সেন্সর হল সফ্টওয়্যার-ভিত্তিক সেন্সরগুলির উদাহরণ। সারণী 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 এর ফরওয়ার্ড সামঞ্জস্য নীতির সাথে সঙ্গতিপূর্ণ।
সেন্সর | অ্যান্ড্রয়েড 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 মান রয়েছে। এই সমন্বয় ব্যবস্থা নিম্নলিখিত সেন্সর দ্বারা ব্যবহৃত হয়:
এই স্থানাঙ্ক ব্যবস্থা সম্পর্কে বোঝার জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয় হল যে ডিভাইসের স্ক্রীনের অভিযোজন পরিবর্তিত হলে অক্ষগুলি অদলবদল করা হয় না—অর্থাৎ, ডিভাইসটি নড়াচড়া করার সাথে সাথে সেন্সরের স্থানাঙ্ক সিস্টেম কখনই পরিবর্তিত হয় না। এই আচরণটি OpenGL স্থানাঙ্ক সিস্টেমের আচরণের মতোই।
আরেকটি বিষয় বুঝতে হবে যে আপনার অ্যাপ্লিকেশনটি অনুমান করা উচিত নয় যে একটি ডিভাইসের প্রাকৃতিক (ডিফল্ট) অভিযোজন প্রতিকৃতি। অনেক ট্যাবলেট ডিভাইসের প্রাকৃতিক অভিযোজন হল আড়াআড়ি। এবং সেন্সর সমন্বয় সিস্টেম সবসময় একটি ডিভাইসের প্রাকৃতিক অভিযোজন উপর ভিত্তি করে.
অবশেষে, যদি আপনার অ্যাপ্লিকেশনটি অন-স্ক্রীন প্রদর্শনের সাথে সেন্সর ডেটার সাথে মিলে যায়, তাহলে স্ক্রীনের ঘূর্ণন নির্ধারণের জন্য আপনাকে getRotation()
পদ্ধতি ব্যবহার করতে হবে এবং তারপরে স্ক্রীন স্থানাঙ্কে সেন্সর স্থানাঙ্ক ম্যাপ করতে remapCoordinateSystem()
পদ্ধতি ব্যবহার করতে হবে। আপনার ম্যানিফেস্ট শুধুমাত্র পোর্ট্রেট-ডিসপ্লে নির্দিষ্ট করলেও আপনাকে এটি করতে হবে।
দ্রষ্টব্য: কিছু সেন্সর এবং পদ্ধতি একটি সমন্বয় ব্যবস্থা ব্যবহার করে যা বিশ্বের রেফারেন্সের ফ্রেমের সাথে আপেক্ষিক (ডিভাইসের রেফারেন্সের ফ্রেমের বিপরীতে)। এই সেন্সর এবং পদ্ধতিগুলি ডেটা ফেরত দেয় যা পৃথিবীর সাথে সম্পর্কিত ডিভাইসের গতি বা ডিভাইসের অবস্থানকে প্রতিনিধিত্ব করে। আরও তথ্যের জন্য, getOrientation()
পদ্ধতি, getRotationMatrix()
পদ্ধতি, ওরিয়েন্টেশন সেন্সর এবং রোটেশন ভেক্টর সেন্সর দেখুন।
সেন্সর হার-সীমাবদ্ধকরণ
ব্যবহারকারীদের সম্পর্কে সম্ভাব্য সংবেদনশীল তথ্য রক্ষা করার জন্য, আপনার অ্যাপ যদি Android 12 (API লেভেল 31) বা উচ্চতরকে টার্গেট করে, তবে সিস্টেম নির্দিষ্ট মোশন সেন্সর এবং অবস্থান সেন্সর থেকে ডেটা রিফ্রেশ হারের উপর একটি সীমা রাখে। এই ডেটাতে ডিভাইসের অ্যাক্সিলোমিটার , জাইরোস্কোপ এবং জিওম্যাগনেটিক ফিল্ড সেন্সর দ্বারা রেকর্ড করা মানগুলি অন্তর্ভুক্ত রয়েছে৷
রিফ্রেশ হারের সীমা নির্ভর করে আপনি কীভাবে সেন্সর ডেটা অ্যাক্সেস করেন তার উপর:
- আপনি সেন্সর ইভেন্টগুলি নিরীক্ষণ করতে
registerListener()
পদ্ধতিতে কল করলে, সেন্সর স্যাম্পলিং রেট 200 Hz-এ সীমাবদ্ধ। এটিregisterListener()
পদ্ধতির সমস্ত ওভারলোড ভেরিয়েন্টের জন্য সত্য। - আপনি যদি
SensorDirectChannel
ক্লাস ব্যবহার করেন, তাহলে সেন্সর স্যাম্পলিং রেটRATE_NORMAL
এর মধ্যে সীমাবদ্ধ থাকে, যা সাধারণত প্রায় 50 Hz হয়৷
আপনার অ্যাপের যদি উচ্চ হারে মোশন সেন্সর ডেটা সংগ্রহ করতে হয়, তাহলে আপনাকে অবশ্যই HIGH_SAMPLING_RATE_SENSORS
অনুমতি ঘোষণা করতে হবে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে। অন্যথায়, যদি আপনার অ্যাপ এই অনুমতি ঘোষণা না করে উচ্চ হারে মোশন সেন্সর ডেটা সংগ্রহ করার চেষ্টা করে, তাহলে একটি SecurityException
ঘটে।
<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
আপনার ডিভাইস এবং এমুলেটরের মধ্যে ডেটা স্থানান্তর করতে, এই পদক্ষেপগুলি অনুসরণ করুন:
- আপনার ডিভাইসে USB ডিবাগিং সক্ষম আছে কিনা তা পরীক্ষা করুন৷
- একটি USB কেবল ব্যবহার করে আপনার ডিভাইসটিকে আপনার ডেভেলপমেন্ট মেশিনের সাথে সংযুক্ত করুন।
- আপনার ডিভাইসে SdkControllerSensor অ্যাপটি শুরু করুন।
- অ্যাপে, আপনি যে সেন্সরগুলি অনুকরণ করতে চান তা নির্বাচন করুন৷
নিম্নলিখিত
adb
কমান্ড চালান:- এমুলেটর শুরু করুন। আপনি এখন আপনার ডিভাইস সরানোর মাধ্যমে এমুলেটরে রূপান্তর প্রয়োগ করতে সক্ষম হবেন।
$ adb forward tcp:1968 tcp:1968
দ্রষ্টব্য: আপনার শারীরিক ডিভাইসে আপনি যে আন্দোলনগুলি করেন তা যদি এমুলেটরকে রূপান্তরিত না করে, তাহলে ধাপ 5 থেকে আবার adb
কমান্ড চালানোর চেষ্টা করুন।
আরও তথ্যের জন্য, Android এমুলেটর গাইড দেখুন।
onSensorChanged() পদ্ধতি ব্লক করবেন না
সেন্সর ডেটা উচ্চ হারে পরিবর্তিত হতে পারে, যার মানে সিস্টেমটি প্রায়শই onSensorChanged(SensorEvent)
পদ্ধতিতে কল করতে পারে। একটি সর্বোত্তম অনুশীলন হিসাবে, আপনার onSensorChanged(SensorEvent)
পদ্ধতির মধ্যে যতটা সম্ভব কম করা উচিত যাতে আপনি এটি ব্লক না করেন। যদি আপনার অ্যাপ্লিকেশনের জন্য আপনাকে কোনো ডেটা ফিল্টারিং বা সেন্সর ডেটা হ্রাস করার প্রয়োজন হয়, তাহলে আপনার সেই কাজটি onSensorChanged(SensorEvent)
পদ্ধতির বাইরে করা উচিত।
অপ্রচলিত পদ্ধতি বা সেন্সর ধরনের ব্যবহার এড়িয়ে চলুন
বেশ কিছু পদ্ধতি এবং ধ্রুবক অবমূল্যায়ন করা হয়েছে। বিশেষ করে, TYPE_ORIENTATION
সেন্সরের ধরন অবনমন করা হয়েছে। ওরিয়েন্টেশন ডেটা পেতে আপনার পরিবর্তে getOrientation()
পদ্ধতি ব্যবহার করা উচিত। একইভাবে, TYPE_TEMPERATURE
সেন্সরের ধরন অবনমন করা হয়েছে। Android 4.0 চালিত ডিভাইসগুলিতে আপনার পরিবর্তে TYPE_AMBIENT_TEMPERATURE
সেন্সর প্রকার ব্যবহার করা উচিত৷
আপনি সেন্সর ব্যবহার করার আগে যাচাই করুন
আপনি একটি ডিভাইস থেকে ডেটা অর্জন করার চেষ্টা করার আগে সর্বদা যাচাই করুন যে একটি ডিভাইসে একটি সেন্সর বিদ্যমান আছে। অনুমান করবেন না যে একটি সেন্সর বিদ্যমান কারণ এটি একটি ঘন ঘন ব্যবহৃত সেন্সর। ডিভাইস নির্মাতাদের তাদের ডিভাইসে কোনো নির্দিষ্ট সেন্সর প্রদান করার প্রয়োজন নেই।
সাবধানে সেন্সর বিলম্ব চয়ন করুন
আপনি যখন registerListener()
পদ্ধতিতে একটি সেন্সর নিবন্ধন করেন, তখন নিশ্চিত হন যে আপনি একটি ডেলিভারি রেট বেছে নিয়েছেন যা আপনার অ্যাপ্লিকেশন বা ব্যবহারের ক্ষেত্রে উপযুক্ত। সেন্সরগুলি খুব উচ্চ হারে ডেটা সরবরাহ করতে পারে। সিস্টেমকে অতিরিক্ত ডেটা পাঠানোর অনুমতি দেওয়া যা আপনার সিস্টেম সংস্থান নষ্ট করার প্রয়োজন নেই এবং ব্যাটারি শক্তি ব্যবহার করে।
বেশিরভাগ অ্যান্ড্রয়েড-চালিত ডিভাইসে অন্তর্নির্মিত সেন্সর রয়েছে যা গতি, অভিযোজন এবং বিভিন্ন পরিবেশগত অবস্থার পরিমাপ করে। এই সেন্সরগুলি উচ্চ নির্ভুলতা এবং নির্ভুলতার সাথে কাঁচা ডেটা সরবরাহ করতে সক্ষম, এবং আপনি যদি ত্রিমাত্রিক ডিভাইসের গতিবিধি বা অবস্থান নিরীক্ষণ করতে চান বা আপনি কোনও ডিভাইসের কাছাকাছি পরিবেষ্টিত পরিবেশে পরিবর্তনগুলি নিরীক্ষণ করতে চান তবে এটি কার্যকর। উদাহরণস্বরূপ, একটি গেমটি একটি ডিভাইসের মাধ্যাকর্ষণ সেন্সর থেকে রিডিংগুলি ট্র্যাক করতে পারে যাতে ব্যবহারকারীর জটিল অঙ্গভঙ্গি এবং গতিগুলি অনুমান করা যায়, যেমন টিল্ট, শেক, ঘূর্ণন বা সুইং৷ একইভাবে, একটি আবহাওয়া অ্যাপ্লিকেশন শিশির বিন্দু গণনা এবং রিপোর্ট করতে একটি ডিভাইসের তাপমাত্রা সেন্সর এবং আর্দ্রতা সেন্সর ব্যবহার করতে পারে, অথবা একটি ভ্রমণ অ্যাপ্লিকেশন একটি কম্পাস বিয়ারিং রিপোর্ট করতে জিওম্যাগনেটিক ফিল্ড সেন্সর এবং অ্যাক্সিলোমিটার ব্যবহার করতে পারে।
নিম্নলিখিত সম্পর্কিত সংস্থান পড়ুন:
অ্যান্ড্রয়েড প্ল্যাটফর্ম তিনটি বিস্তৃত বিভাগের সেন্সর সমর্থন করে:
- মোশন সেন্সর
এই সেন্সরগুলি তিনটি অক্ষ বরাবর ত্বরণ বল এবং ঘূর্ণন বল পরিমাপ করে। এই বিভাগে অ্যাক্সিলোমিটার, মাধ্যাকর্ষণ সেন্সর, জাইরোস্কোপ এবং ঘূর্ণনশীল ভেক্টর সেন্সর অন্তর্ভুক্ত রয়েছে।
- পরিবেশগত সেন্সর
এই সেন্সরগুলি বিভিন্ন পরিবেশগত পরামিতি পরিমাপ করে, যেমন পরিবেষ্টিত বায়ুর তাপমাত্রা এবং চাপ, আলোকসজ্জা এবং আর্দ্রতা। এই বিভাগে ব্যারোমিটার, ফটোমিটার এবং থার্মোমিটার রয়েছে।
- অবস্থান সেন্সর
এই সেন্সরগুলি একটি ডিভাইসের শারীরিক অবস্থান পরিমাপ করে। এই বিভাগে ওরিয়েন্টেশন সেন্সর এবং ম্যাগনেটোমিটার রয়েছে।
আপনি ডিভাইসে উপলব্ধ সেন্সর অ্যাক্সেস করতে পারেন এবং অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে কাঁচা সেন্সর ডেটা অর্জন করতে পারেন। সেন্সর ফ্রেমওয়ার্ক বিভিন্ন ক্লাস এবং ইন্টারফেস প্রদান করে যা আপনাকে সেন্সর-সম্পর্কিত বিভিন্ন ধরনের কাজ করতে সাহায্য করে। উদাহরণস্বরূপ, আপনি নিম্নলিখিত কাজ করতে সেন্সর ফ্রেমওয়ার্ক ব্যবহার করতে পারেন:
- কোন ডিভাইসে কোন সেন্সর পাওয়া যায় তা নির্ধারণ করুন।
- একটি পৃথক সেন্সরের ক্ষমতা নির্ধারণ করুন, যেমন এর সর্বোচ্চ পরিসীমা, প্রস্তুতকারক, পাওয়ার প্রয়োজনীয়তা এবং রেজোলিউশন।
- কাঁচা সেন্সর ডেটা অর্জন করুন এবং আপনি সেন্সর ডেটা অর্জনের সর্বনিম্ন হার নির্ধারণ করুন৷
- সেন্সর ইভেন্ট শ্রোতাদের নিবন্ধন এবং নিবন্ধনমুক্ত করুন যারা সেন্সর পরিবর্তনগুলি নিরীক্ষণ করে।
এই বিষয়টি Android প্ল্যাটফর্মে উপলব্ধ সেন্সরগুলির একটি ওভারভিউ প্রদান করে৷ এটি সেন্সর কাঠামোর একটি ভূমিকাও প্রদান করে।
সেন্সর পরিচিতি
অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক আপনাকে অনেক ধরনের সেন্সর অ্যাক্সেস করতে দেয়। এর মধ্যে কিছু সেন্সর হার্ডওয়্যার-ভিত্তিক এবং কিছু সফ্টওয়্যার-ভিত্তিক। হার্ডওয়্যার-ভিত্তিক সেন্সর হল একটি হ্যান্ডসেট বা ট্যাবলেট ডিভাইসে নির্মিত শারীরিক উপাদান। তারা সরাসরি নির্দিষ্ট পরিবেশগত বৈশিষ্ট্য যেমন ত্বরণ, ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি, বা কৌণিক পরিবর্তন পরিমাপ করে তাদের ডেটা সংগ্রহ করে। সফ্টওয়্যার-ভিত্তিক সেন্সরগুলি শারীরিক ডিভাইস নয়, যদিও তারা হার্ডওয়্যার-ভিত্তিক সেন্সর অনুকরণ করে। সফ্টওয়্যার-ভিত্তিক সেন্সরগুলি এক বা একাধিক হার্ডওয়্যার-ভিত্তিক সেন্সর থেকে তাদের ডেটা সংগ্রহ করে এবং কখনও কখনও ভার্চুয়াল সেন্সর বা সিন্থেটিক সেন্সর বলা হয়। রৈখিক ত্বরণ সেন্সর এবং মহাকর্ষ সেন্সর হল সফ্টওয়্যার-ভিত্তিক সেন্সরগুলির উদাহরণ। সারণী 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) চারপাশে ঘূর্ণনের মাত্রা পরিমাপ করে। এপিআই স্তর 3 হিসাবে আপনি getRotationMatrix() পদ্ধতির সাথে একত্রে মাধ্যাকর্ষণ সেন্সর এবং জিওম্যাগনেটিক ফিল্ড সেন্সর ব্যবহার করে কোনও ডিভাইসের জন্য প্রবণতা ম্যাট্রিক্স এবং রোটেশন ম্যাট্রিক্স পেতে পারেন। | ডিভাইস অবস্থান নির্ধারণ। |
TYPE_PRESSURE | হার্ডওয়্যার | এইচপিএ বা এমবিএআর -তে পরিবেষ্টিত বায়ুচাপ পরিমাপ করে। | বায়ুচাপের পরিবর্তন পর্যবেক্ষণ করা। |
TYPE_PROXIMITY | হার্ডওয়্যার | কোনও ডিভাইসের ভিউ স্ক্রিনের তুলনায় মুখ্যমন্ত্রী কোনও বস্তুর সান্নিধ্য পরিমাপ করে। এই সেন্সরটি সাধারণত কোনও ব্যক্তির কানে রাখা হচ্ছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। | একটি কল চলাকালীন ফোন অবস্থান। |
TYPE_RELATIVE_HUMIDITY | হার্ডওয়্যার | শতাংশ (%) এ আপেক্ষিক পরিবেষ্টিত আর্দ্রতা পরিমাপ করে। | শিশির পয়েন্ট, পরম এবং আপেক্ষিক আর্দ্রতা পর্যবেক্ষণ। |
TYPE_ROTATION_VECTOR | সফ্টওয়্যার বা হার্ডওয়্যার | ডিভাইসের ঘূর্ণন ভেক্টরের তিনটি উপাদান সরবরাহ করে কোনও ডিভাইসের ওরিয়েন্টেশন পরিমাপ করে। | গতি সনাক্তকরণ এবং ঘূর্ণন সনাক্তকরণ। |
TYPE_TEMPERATURE | হার্ডওয়্যার | ডিগ্রি সেলসিয়াস (ডিগ্রি সেন্টিগ্রেড) এ ডিভাইসের তাপমাত্রা পরিমাপ করে। এই সেন্সর বাস্তবায়ন ডিভাইসগুলিতে পরিবর্তিত হয় এবং এই সেন্সরটি এপিআই স্তরের 14 এ TYPE_AMBIENT_TEMPERATURE সেন্সর দিয়ে প্রতিস্থাপন করা হয়েছিল | তাপমাত্রা পর্যবেক্ষণ। |
সেন্সর ফ্রেমওয়ার্ক
আপনি এই সেন্সরগুলিতে অ্যাক্সেস করতে পারেন এবং অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে কাঁচা সেন্সর ডেটা অর্জন করতে পারেন। সেন্সর ফ্রেমওয়ার্কটি android.hardware
প্যাকেজের অংশ এবং নিম্নলিখিত ক্লাস এবং ইন্টারফেসগুলি অন্তর্ভুক্ত করে:
-
SensorManager
- সেন্সর পরিষেবার উদাহরণ তৈরি করতে আপনি এই শ্রেণিটি ব্যবহার করতে পারেন। এই শ্রেণিটি সেন্সরগুলিতে অ্যাক্সেস এবং তালিকাভুক্ত করার জন্য, সেন্সর ইভেন্ট শ্রোতাদের নিবন্ধকরণ এবং নিবন্ধভুক্ত করার জন্য এবং ওরিয়েন্টেশন সম্পর্কিত তথ্য অর্জনের জন্য বিভিন্ন পদ্ধতি সরবরাহ করে। এই শ্রেণিটি বেশ কয়েকটি সেন্সর ধ্রুবকও সরবরাহ করে যা সেন্সর নির্ভুলতা রিপোর্ট করতে, ডেটা অধিগ্রহণের হার নির্ধারণ করতে এবং সেন্সরগুলি ক্যালিব্রেট করতে ব্যবহৃত হয়।
-
Sensor
- আপনি এই ক্লাসটি একটি নির্দিষ্ট সেন্সরের উদাহরণ তৈরি করতে ব্যবহার করতে পারেন। এই শ্রেণিটি বিভিন্ন পদ্ধতি সরবরাহ করে যা আপনাকে একটি সেন্সরের ক্ষমতা নির্ধারণ করতে দেয়।
-
SensorEvent
- সিস্টেমটি এই শ্রেণিটি একটি সেন্সর ইভেন্ট অবজেক্ট তৈরি করতে ব্যবহার করে, যা একটি সেন্সর ইভেন্ট সম্পর্কে তথ্য সরবরাহ করে। একটি সেন্সর ইভেন্ট অবজেক্টের মধ্যে নিম্নলিখিত তথ্যগুলি অন্তর্ভুক্ত রয়েছে: কাঁচা সেন্সর ডেটা, সেন্সর ধরণের যা ইভেন্টটি উত্পন্ন করে, ডেটার যথার্থতা এবং ইভেন্টের টাইমস্ট্যাম্প।
-
SensorEventListener
- সেন্সরের মানগুলি পরিবর্তিত হওয়ার সময় বা সেন্সরের নির্ভুলতা পরিবর্তিত হলে আপনি দুটি কলব্যাক পদ্ধতি তৈরি করতে এই ইন্টারফেসটি ব্যবহার করতে পারেন যা বিজ্ঞপ্তিগুলি (সেন্সর ইভেন্টগুলি) গ্রহণ করে।
একটি সাধারণ অ্যাপ্লিকেশনটিতে আপনি এই সেন্সর সম্পর্কিত এপিআই দুটি প্রাথমিক কাজ সম্পাদন করতে ব্যবহার করেন:
- সেন্সর এবং সেন্সর ক্ষমতা সনাক্তকরণ
রানটাইমে সেন্সর এবং সেন্সর ক্ষমতা সনাক্তকরণ কার্যকর যদি আপনার অ্যাপ্লিকেশনটিতে এমন বৈশিষ্ট্য থাকে যা নির্দিষ্ট সেন্সর প্রকার বা ক্ষমতাগুলির উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি কোনও ডিভাইসে উপস্থিত সমস্ত সেন্সর সনাক্ত করতে এবং উপস্থিত নেই এমন সেন্সরগুলির উপর নির্ভর করে এমন কোনও অ্যাপ্লিকেশন বৈশিষ্ট্যগুলি অক্ষম করতে পারেন। তেমনি, আপনি প্রদত্ত ধরণের সমস্ত সেন্সর সনাক্ত করতে চাইতে পারেন যাতে আপনি সেন্সর বাস্তবায়ন চয়ন করতে পারেন যা আপনার অ্যাপ্লিকেশনটির জন্য সর্বোত্তম পারফরম্যান্স রয়েছে।
- সেন্সর ইভেন্টগুলি নিরীক্ষণ করুন
সেন্সর ইভেন্টগুলি পর্যবেক্ষণ করা হয় আপনি কীভাবে কাঁচা সেন্সর ডেটা অর্জন করেন। একটি সেন্সর ইভেন্টটি প্রতিবার যখন কোনও সেন্সর পরিমাপ করছে এমন প্যারামিটারগুলির পরিবর্তন সনাক্ত করে। একটি সেন্সর ইভেন্ট আপনাকে চারটি টুকরো তথ্য সরবরাহ করে: সেন্সরের নাম যা ইভেন্টটিকে ট্রিগার করেছিল, ইভেন্টের টাইমস্ট্যাম্প, ইভেন্টের যথার্থতা এবং ইভেন্টটি ট্রিগার করে এমন কাঁচা সেন্সর ডেটা।
সেন্সর প্রাপ্যতা
সেন্সর প্রাপ্যতা ডিভাইস থেকে ডিভাইসে পরিবর্তিত হলেও এটি অ্যান্ড্রয়েড সংস্করণগুলির মধ্যেও পৃথক হতে পারে। এটি কারণ অ্যান্ড্রয়েড সেন্সরগুলি বেশ কয়েকটি প্ল্যাটফর্ম রিলিজের সময় চালু করা হয়েছে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড 1.5 (এপিআই স্তর 3) এ অনেকগুলি সেন্সর চালু করা হয়েছিল, তবে কিছু প্রয়োগ করা হয়নি এবং অ্যান্ড্রয়েড 2.3 (এপিআই স্তর 9) না হওয়া পর্যন্ত ব্যবহারের জন্য উপলব্ধ ছিল না। তেমনি, অ্যান্ড্রয়েড ২.৩ (এপিআই স্তর 9) এবং অ্যান্ড্রয়েড 4.0 (এপিআই স্তর 14) এ বেশ কয়েকটি সেন্সর চালু করা হয়েছিল। দুটি সেন্সরকে অবমূল্যায়ন করা হয়েছে এবং নতুন, আরও ভাল সেন্সর দ্বারা প্রতিস্থাপন করা হয়েছে।
সারণী 2 প্ল্যাটফর্ম-বাই-প্ল্যাটফর্ম ভিত্তিতে প্রতিটি সেন্সরের প্রাপ্যতার সংক্ষিপ্তসার করে। কেবল চারটি প্ল্যাটফর্ম তালিকাভুক্ত করা হয়েছে কারণ সেগুলি হ'ল প্ল্যাটফর্মগুলি যা সেন্সর পরিবর্তনের সাথে জড়িত। অবমূল্যায়িত হিসাবে তালিকাভুক্ত সেন্সরগুলি পরবর্তী প্ল্যাটফর্মগুলিতে এখনও পাওয়া যায় (সেন্সরটি কোনও ডিভাইসে উপস্থিত থাকে), যা অ্যান্ড্রয়েডের ফরোয়ার্ড সামঞ্জস্যতা নীতির সাথে সামঞ্জস্যপূর্ণ।
সেন্সর | অ্যান্ড্রয়েড 4.0 (এপিআই স্তর 14) | অ্যান্ড্রয়েড 2.3 (এপিআই স্তর 9) | অ্যান্ড্রয়েড 2.2 (এপিআই স্তর 8) | অ্যান্ড্রয়েড 1.5 (এপিআই স্তর 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_GYROSCOPE
, TYPE_LINEAR_ACCELERATION
বা TYPE_GRAVITY
মতো TYPE_ALL
এর পরিবর্তে আরও একটি ধ্রুবক ব্যবহার করতে পারেন।
আপনি নির্ধারণ করতে পারেন যে কোনও নির্দিষ্ট ধরণের সেন্সর 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. }
দ্রষ্টব্য: অ্যান্ড্রয়েডের জন্য ডিভাইস নির্মাতাদের তাদের অ্যান্ড্রয়েড-চালিত ডিভাইসগুলিতে কোনও নির্দিষ্ট ধরণের সেন্সর তৈরি করতে প্রয়োজন হয় না, যাতে ডিভাইসে বিস্তৃত সেন্সর কনফিগারেশন থাকতে পারে।
কোনও ডিভাইসে থাকা সেন্সরগুলি তালিকাভুক্ত করার পাশাপাশি, আপনি Sensor
শ্রেণীর সর্বজনীন পদ্ধতিগুলি পৃথক সেন্সরগুলির ক্ষমতা এবং বৈশিষ্ট্য নির্ধারণ করতে ব্যবহার করতে পারেন। আপনি যদি আপনার অ্যাপ্লিকেশনটি কোনও ডিভাইসে সেন্সর বা সেন্সর সক্ষমতা উপলব্ধ তার ভিত্তিতে আলাদাভাবে আচরণ করতে চান তবে এটি দরকারী। উদাহরণস্বরূপ, আপনি সেন্সরের রেজোলিউশন এবং সর্বাধিক পরিমাপের পরিসীমা পেতে getResolution()
এবং getMaximumRange()
পদ্ধতিগুলি ব্যবহার করতে পারেন। সেন্সরের পাওয়ার প্রয়োজনীয়তাগুলি পেতে আপনি getPower()
পদ্ধতিটিও ব্যবহার করতে পারেন।
আপনি যদি বিভিন্ন প্রস্তুতকারকের সেন্সর বা কোনও সেন্সরের বিভিন্ন সংস্করণের জন্য আপনার অ্যাপ্লিকেশনটি অনুকূল করতে চান তবে দুটি পাবলিক পদ্ধতি বিশেষভাবে কার্যকর। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটিতে টিল্ট এবং শেকের মতো ব্যবহারকারীর অঙ্গভঙ্গিগুলি পর্যবেক্ষণ করা প্রয়োজন, আপনি একটি নির্দিষ্ট বিক্রেতার মাধ্যাকর্ষণ সেন্সরযুক্ত নতুন ডিভাইসগুলির জন্য ডেটা ফিল্টারিং বিধি এবং অপ্টিমাইজেশনগুলির একটি সেট তৈরি করতে পারেন এবং ডিভাইসগুলির জন্য ডেটা ফিল্টারিং বিধি এবং অপ্টিমাইজেশনের আরও একটি সেট তৈরি করতে পারেন এতে মাধ্যাকর্ষণ সেন্সর নেই এবং কেবল একটি অ্যাক্সিলোমিটার রয়েছে। নিম্নলিখিত কোড নমুনাটি আপনাকে দেখায় যে আপনি কীভাবে এটি করতে getVendor()
এবং getVersion()
পদ্ধতিগুলি ব্যবহার করতে পারেন। এই নমুনায়, আমরা এমন একটি মাধ্যাকর্ষণ সেন্সর খুঁজছি যা গুগল এলএলসিকে বিক্রেতা হিসাবে তালিকাভুক্ত করে এবং এর একটি সংস্করণ সংখ্যা রয়েছে 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()
। অ্যান্ড্রয়েড সিস্টেম যখনই নিম্নলিখিতটি ঘটে তখন এই পদ্ধতিগুলি কল করে:
- একটি সেন্সরের যথার্থতা পরিবর্তন হয়।
এক্ষেত্রে সিস্টেমটি
onAccuracyChanged()
পদ্ধতিটি আহ্বান করে, আপনাকেSensor
অবজেক্টের একটি রেফারেন্স সরবরাহ করে যা পরিবর্তিত হয় এবং সেন্সরের নতুন নির্ভুলতা। যথার্থতা চারটি স্থিতির একটি ধ্রুবক দ্বারা প্রতিনিধিত্ব করা হয়:SENSOR_STATUS_ACCURACY_LOW
,SENSOR_STATUS_ACCURACY_MEDIUM
,SENSOR_STATUS_ACCURACY_HIGH
, বাSENSOR_STATUS_UNRELIABLE
। - একটি সেন্সর একটি নতুন মান রিপোর্ট করে।
এক্ষেত্রে সিস্টেমটি আপনাকে একটি
SensorEvent
অবজেক্ট সরবরাহ করেonSensorChanged()
পদ্ধতিটি আহ্বান করে। একটিSensorEvent
অবজেক্টে নতুন সেন্সর ডেটা সম্পর্কিত তথ্য রয়েছে যার মধ্যে রয়েছে: ডেটাগুলির যথার্থতা, সেন্সর যা ডেটা উত্পন্ন করেছিল, ডেটা তৈরি করা টাইমস্ট্যাম্প এবং সেন্সরটি রেকর্ড করা নতুন ডেটা।
নিম্নলিখিত কোডটি দেখায় যে হালকা সেন্সর থেকে ডেটা নিরীক্ষণের জন্য কীভাবে onSensorChanged()
পদ্ধতিটি ব্যবহার করতে হয়। এই উদাহরণটি একটি TextView
কাঁচা সেন্সর ডেটা প্রদর্শন করে যা মেইন.এক্সএমএল ফাইলে 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) আপনি বিলম্বকে একটি পরম মান (মাইক্রোসেকেন্ডে) হিসাবেও নির্দিষ্ট করতে পারেন।
আপনি যে বিলম্বটি নির্দিষ্ট করেছেন তা কেবলমাত্র একটি প্রস্তাবিত বিলম্ব। অ্যান্ড্রয়েড সিস্টেম এবং অন্যান্য অ্যাপ্লিকেশনগুলি এই বিলম্বকে পরিবর্তন করতে পারে। সর্বোত্তম অনুশীলন হিসাবে, আপনার যে বৃহত্তম বিলম্বটি আপনি করতে পারেন তা নির্দিষ্ট করা উচিত কারণ সিস্টেমটি সাধারণত আপনার নির্দিষ্ট করা তুলনায় একটি ছোট বিলম্ব ব্যবহার করে (এটি হ'ল আপনার অ্যাপ্লিকেশনটির প্রয়োজনীয়তা পূরণ করে এমন ধীরতম নমুনা হারটি বেছে নেওয়া উচিত)। বৃহত্তর বিলম্ব ব্যবহার করে প্রসেসরের উপর একটি কম বোঝা চাপিয়ে দেয় এবং তাই কম শক্তি ব্যবহার করে।
সেন্সর ফ্রেমওয়ার্কটি আপনার আবেদনে সেন্সর ইভেন্টগুলি প্রেরণ করছে এমন হার নির্ধারণের জন্য কোনও পাবলিক পদ্ধতি নেই; তবে আপনি বিভিন্ন ইভেন্টের তুলনায় নমুনা হার গণনা করতে প্রতিটি সেন্সর ইভেন্টের সাথে সম্পর্কিত টাইমস্ট্যাম্পগুলি ব্যবহার করতে পারেন। আপনি একবার সেট করার পরে আপনাকে নমুনা হার (বিলম্ব) পরিবর্তন করতে হবে না। যদি কোনও কারণে আপনাকে বিলম্ব পরিবর্তন করার প্রয়োজন হয় তবে আপনাকে সেন্সর শ্রোতার নিবন্ধন করতে হবে এবং পুনর্নির্মাণ করতে হবে।
এটি লক্ষণীয়ও গুরুত্বপূর্ণ যে এই উদাহরণটি সেন্সর ইভেন্ট শ্রোতার নিবন্ধন এবং নিবন্ধন করতে onResume()
এবং onPause()
কলব্যাক পদ্ধতি ব্যবহার করে। সেরা অনুশীলন হিসাবে আপনার সর্বদা আপনার প্রয়োজন নেই এমন সেন্সরগুলি অক্ষম করা উচিত, বিশেষত যখন আপনার ক্রিয়াকলাপ বিরতি দেওয়া হয়। এটি করতে ব্যর্থ হওয়া মাত্র কয়েক ঘন্টার মধ্যে ব্যাটারিটি নিষ্কাশন করতে পারে কারণ কিছু সেন্সরগুলির যথেষ্ট পরিমাণে পাওয়ার প্রয়োজনীয়তা রয়েছে এবং দ্রুত ব্যাটারি শক্তি ব্যবহার করতে পারে। স্ক্রিনটি বন্ধ হয়ে গেলে সিস্টেমটি স্বয়ংক্রিয়ভাবে সেন্সরগুলি অক্ষম করবে না।
বিভিন্ন সেন্সর কনফিগারেশন পরিচালনা করা
অ্যান্ড্রয়েড ডিভাইসগুলির জন্য একটি স্ট্যান্ডার্ড সেন্সর কনফিগারেশন নির্দিষ্ট করে না, যার অর্থ ডিভাইস নির্মাতারা তাদের অ্যান্ড্রয়েড-চালিত ডিভাইসে যে কোনও সেন্সর কনফিগারেশন চান তা অন্তর্ভুক্ত করতে পারে। ফলস্বরূপ, ডিভাইসগুলি কনফিগারেশনের বিস্তৃত পরিসরে বিভিন্ন সেন্সর অন্তর্ভুক্ত করতে পারে। যদি আপনার অ্যাপ্লিকেশনটি নির্দিষ্ট ধরণের সেন্সরের উপর নির্ভর করে তবে আপনাকে নিশ্চিত করতে হবে যে সেন্সরটি কোনও ডিভাইসে উপস্থিত রয়েছে যাতে আপনার অ্যাপ্লিকেশনটি সফলভাবে চালাতে পারে।
প্রদত্ত সেন্সরটি কোনও ডিভাইসে উপস্থিত রয়েছে তা নিশ্চিত করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে:
- রানটাইমে সেন্সরগুলি সনাক্ত করুন এবং উপযুক্ত হিসাবে অ্যাপ্লিকেশন বৈশিষ্ট্যগুলি সক্ষম বা অক্ষম করুন।
- নির্দিষ্ট সেন্সর কনফিগারেশন সহ ডিভাইসগুলিকে লক্ষ্য করতে গুগল প্লে ফিল্টার ব্যবহার করুন।
প্রতিটি বিকল্প নিম্নলিখিত বিভাগগুলিতে আলোচনা করা হয়।
রানটাইমে সেন্সরগুলি সনাক্ত করা
যদি আপনার অ্যাপ্লিকেশনটি নির্দিষ্ট ধরণের সেন্সর ব্যবহার করে তবে এটির উপর নির্ভর করে না, আপনি রানটাইমে সেন্সর সনাক্ত করতে সেন্সর কাঠামোটি ব্যবহার করতে পারেন এবং তারপরে অ্যাপ্লিকেশন বৈশিষ্ট্যগুলি যথাযথ হিসাবে অক্ষম বা সক্ষম করতে পারেন। উদাহরণস্বরূপ, একটি নেভিগেশন অ্যাপ্লিকেশন তাপমাত্রা, ব্যারোমেট্রিক চাপ, অবস্থান এবং কম্পাস ভারবহন প্রদর্শন করতে তাপমাত্রা সেন্সর, চাপ সেন্সর, জিপিএস সেন্সর এবং জিওম্যাগনেটিক ফিল্ড সেন্সর ব্যবহার করতে পারে। যদি কোনও ডিভাইসে কোনও চাপ সেন্সর না থাকে তবে আপনি রানটাইমে চাপ সেন্সরের অনুপস্থিতি সনাক্ত করতে সেন্সর কাঠামোটি ব্যবহার করতে পারেন এবং তারপরে আপনার অ্যাপ্লিকেশনটির ইউআইয়ের অংশটি অক্ষম করতে পারেন যা চাপ প্রদর্শন করে। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি কোনও ডিভাইসে কোনও চাপ সেন্সর রয়েছে কিনা তা যাচাই করে:
কোটলিন
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"
এটি নিশ্চিত করতে সহায়তা করে যে ডিভাইসগুলি আপনার অ্যাপ্লিকেশনটি ইনস্টল করতে পারে এমনকি তাদের নির্দিষ্ট সেন্সর না থাকলেও। এটি একটি প্রকল্প পরিচালনার সেরা অনুশীলনও যা আপনাকে আপনার অ্যাপ্লিকেশন ব্যবহার করা বৈশিষ্ট্যগুলি ট্র্যাক রাখতে সহায়তা করে। মনে রাখবেন, যদি আপনার অ্যাপ্লিকেশনটি কোনও নির্দিষ্ট সেন্সর ব্যবহার করে তবে সেন্সর ছাড়াই এখনও চালায়, তবে আপনার রানটাইমে সেন্সরটি সনাক্ত করা উচিত এবং অ্যাপ্লিকেশন বৈশিষ্ট্যগুলি যথাযথ হিসাবে অক্ষম বা সক্ষম করা উচিত।
সেন্সর সমন্বয় সিস্টেম
সাধারণভাবে, সেন্সর ফ্রেমওয়ার্ক ডেটা মানগুলি প্রকাশ করতে একটি স্ট্যান্ডার্ড 3-অক্ষ স্থানাঙ্ক সিস্টেম ব্যবহার করে। বেশিরভাগ সেন্সরগুলির জন্য, ডিভাইসটির ডিফল্ট ওরিয়েন্টেশনে রাখা হলে সমন্বিত সিস্টেমটি ডিভাইসের স্ক্রিনের সাথে সম্পর্কিত সংজ্ঞায়িত করা হয় (চিত্র 1 দেখুন)। যখন কোনও ডিভাইস তার ডিফল্ট ওরিয়েন্টেশনে ধরে রাখা হয়, x অক্ষটি অনুভূমিক হয় এবং ডানদিকে নির্দেশ করে, y অক্ষটি উল্লম্ব এবং পয়েন্ট আপ এবং জেড অক্ষটি পর্দার মুখের বাইরের দিকে নির্দেশ করে। এই সিস্টেমে, পর্দার পিছনে স্থানাঙ্কগুলির নেতিবাচক জেড মান রয়েছে। এই সমন্বয় ব্যবস্থা নিম্নলিখিত সেন্সর দ্বারা ব্যবহৃত হয়:
এই সমন্বয় ব্যবস্থা সম্পর্কে বোঝার জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল ডিভাইসের স্ক্রিন ওরিয়েন্টেশন পরিবর্তিত হলে অক্ষগুলি অদলবদল করা হয় না - অর্থাৎ, সেন্সরের সমন্বয় ব্যবস্থা ডিভাইসটি চলার সাথে সাথে কখনও পরিবর্তিত হয় না। এই আচরণটি ওপেনজিএল স্থানাঙ্ক সিস্টেমের আচরণের সমান।
আরেকটি বিষয় বোঝার জন্য হ'ল আপনার অ্যাপ্লিকেশনটি অবশ্যই ধরে নেওয়া উচিত নয় যে কোনও ডিভাইসের প্রাকৃতিক (ডিফল্ট) ওরিয়েন্টেশন প্রতিকৃতি। অনেক ট্যাবলেট ডিভাইসের প্রাকৃতিক দৃষ্টিভঙ্গি হ'ল ল্যান্ডস্কেপ। এবং সেন্সর সমন্বয় ব্যবস্থা সর্বদা একটি ডিভাইসের প্রাকৃতিক ওরিয়েন্টেশনের উপর ভিত্তি করে।
শেষ অবধি, যদি আপনার অ্যাপ্লিকেশনটি অন-স্ক্রিন ডিসপ্লেতে সেন্সর ডেটা মেলে তবে আপনাকে স্ক্রিন রোটেশন নির্ধারণের জন্য getRotation()
পদ্ধতিটি ব্যবহার করতে হবে এবং তারপরে স্ক্রিন স্থানাঙ্কগুলিতে সেন্সর স্থানাঙ্কগুলি ম্যাপ করতে remapCoordinateSystem()
পদ্ধতিটি ব্যবহার করতে হবে। আপনার ম্যানিফেস্ট কেবল প্রতিকৃতি-প্রদর্শন নির্দিষ্ট করে দিলেও আপনার এটি করা দরকার।
দ্রষ্টব্য: কিছু সেন্সর এবং পদ্ধতিগুলি একটি সমন্বিত সিস্টেম ব্যবহার করে যা বিশ্বের রেফারেন্সের ফ্রেমের সাথে সম্পর্কিত (ডিভাইসের রেফারেন্সের ফ্রেমের বিপরীতে)। এই সেন্সর এবং পদ্ধতিগুলি ডেটা ফেরত দেয় যা পৃথিবীর সাথে সম্পর্কিত ডিভাইস গতি বা ডিভাইস অবস্থানের প্রতিনিধিত্ব করে। আরও তথ্যের জন্য, getOrientation()
পদ্ধতি, getRotationMatrix()
পদ্ধতি, ওরিয়েন্টেশন সেন্সর এবং ঘূর্ণন ভেক্টর সেন্সরটি দেখুন।
সেন্সর হার-সীমাবদ্ধ
ব্যবহারকারীদের সম্পর্কে সম্ভাব্য সংবেদনশীল তথ্য সুরক্ষার জন্য, যদি আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড 12 (এপিআই স্তর 31) বা উচ্চতর লক্ষ্য করে, সিস্টেমটি নির্দিষ্ট মোশন সেন্সর এবং অবস্থান সেন্সরগুলির ডেটা রিফ্রেশ হারের উপর একটি সীমা রাখে। এই ডেটাতে ডিভাইসের অ্যাক্সিলোমিটার , জাইরোস্কোপ এবং জিওম্যাগনেটিক ফিল্ড সেন্সর দ্বারা রেকর্ড করা মান অন্তর্ভুক্ত রয়েছে।
রিফ্রেশ রেট সীমাটি আপনি কীভাবে সেন্সর ডেটা অ্যাক্সেস করেন তার উপর নির্ভর করে:
- আপনি যদি সেন্সর ইভেন্টগুলি নিরীক্ষণের জন্য
registerListener()
পদ্ধতিতে কল করেন তবে সেন্সর স্যাম্পলিংয়ের হার 200 হার্জেডের মধ্যে সীমাবদ্ধ। এটিregisterListener()
পদ্ধতির সমস্ত ওভারলোডেড রূপগুলির জন্য সত্য। - আপনি যদি
SensorDirectChannel
শ্রেণি ব্যবহার করেন তবে সেন্সর স্যাম্পলিং হারটিRATE_NORMAL
মধ্যে সীমাবদ্ধ, যা সাধারণত প্রায় 50 হার্জেড।
যদি আপনার অ্যাপ্লিকেশনটিকে উচ্চ হারে মোশন সেন্সর ডেটা সংগ্রহ করার প্রয়োজন হয় তবে আপনাকে অবশ্যই HIGH_SAMPLING_RATE_SENSORS
অনুমতি ঘোষণা করতে হবে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে। অন্যথায়, যদি আপনার অ্যাপ্লিকেশনটি এই অনুমতিটি ঘোষণা না করে উচ্চ হারে মোশন সেন্সর ডেটা সংগ্রহ করার চেষ্টা করে, তবে একটি SecurityException
ঘটে।
<manifest ...> <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> <application ...> ... </application> </manifest>
সেন্সর অ্যাক্সেস এবং ব্যবহারের জন্য সেরা অনুশীলন
আপনি যখন আপনার সেন্সর বাস্তবায়ন ডিজাইন করেন, এই বিভাগে আলোচিত নির্দেশিকাগুলি অনুসরণ করতে ভুলবেন না। এই নির্দেশিকাগুলি সেন্সর অ্যাক্সেস করতে এবং সেন্সর ডেটা অর্জনের জন্য সেন্সর ফ্রেমওয়ার্কটি ব্যবহার করছে এমন যে কোনও ব্যক্তির জন্য সেরা অনুশীলনের প্রস্তাবিত।
কেবল অগ্রভাগে সেন্সর ডেটা সংগ্রহ করুন
অ্যান্ড্রয়েড 9 (এপিআই স্তর 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)
দেখুন।
অ্যান্ড্রয়েড এমুলেটর দিয়ে পরীক্ষা করুন
অ্যান্ড্রয়েড এমুলেটরটিতে ভার্চুয়াল সেন্সর নিয়ন্ত্রণের একটি সেট অন্তর্ভুক্ত রয়েছে যা আপনাকে সেন্সর যেমন অ্যাক্সিলোমিটার, পরিবেষ্টিত তাপমাত্রা, চৌম্বকীয়, নৈকট্য, আলো এবং আরও অনেক কিছু পরীক্ষা করতে দেয়।
এমুলেটরটি একটি অ্যান্ড্রয়েড ডিভাইসের সাথে একটি সংযোগ ব্যবহার করে যা এসডিককন্ট্রোলারসেন্সর অ্যাপ্লিকেশনটি চালাচ্ছে। নোট করুন যে এই অ্যাপ্লিকেশনটি কেবলমাত্র অ্যান্ড্রয়েড 4.0 (এপিআই স্তর 14) বা উচ্চতর চালিত ডিভাইসগুলিতে উপলব্ধ। (যদি ডিভাইসটি অ্যান্ড্রয়েড ৪.০ চালাচ্ছে, তবে এটি অবশ্যই রিভিশন 2 ইনস্টল করা উচিত)) এসডিককন্ট্রোলারসেন্সর অ্যাপ্লিকেশনটি ডিভাইসে সেন্সরগুলিতে পরিবর্তনগুলি পর্যবেক্ষণ করে এবং এমুলেটরে প্রেরণ করে। এরপরে এমুলেটরটি আপনার ডিভাইসের সেন্সরগুলি থেকে প্রাপ্ত নতুন মানগুলির উপর ভিত্তি করে রূপান্তরিত হয়।
আপনি নিম্নলিখিত স্থানে SDKCONTROLERSERSENSOR অ্যাপের জন্য উত্স কোডটি দেখতে পারেন:
$ your-android-sdk-directory/tools/apps/SdkController
আপনার ডিভাইস এবং এমুলেটরের মধ্যে ডেটা স্থানান্তর করতে, এই পদক্ষেপগুলি অনুসরণ করুন:
- আপনার ডিভাইসে ইউএসবি ডিবাগিং সক্ষম করা আছে কিনা তা পরীক্ষা করুন।
- একটি ইউএসবি কেবল ব্যবহার করে আপনার ডিভাইসটি আপনার বিকাশ মেশিনে সংযুক্ত করুন।
- আপনার ডিভাইসে SDKCONTROLERSERSENSOR অ্যাপ্লিকেশন শুরু করুন।
- অ্যাপ্লিকেশনটিতে, আপনি যে সেন্সরগুলি অনুকরণ করতে চান তা নির্বাচন করুন।
নিম্নলিখিত
adb
কমান্ডটি চালান:- এমুলেটর শুরু করুন। আপনার এখন আপনার ডিভাইসটি সরিয়ে এমুলেটারে রূপান্তরগুলি প্রয়োগ করতে সক্ষম হওয়া উচিত।
$ adb forward tcp:1968 tcp:1968
দ্রষ্টব্য: আপনি যদি আপনার শারীরিক ডিভাইসে যে নড়াচড়া করেন তা যদি এমুলেটরটিকে রূপান্তরিত না করে তবে adb
কমান্ডটি আবার 5 ধাপ থেকে চালানোর চেষ্টা করুন।
আরও তথ্যের জন্য, অ্যান্ড্রয়েড এমুলেটর গাইড দেখুন।
অনসেনসরচ্যাঞ্জড () পদ্ধতিটি ব্লক করবেন না
সেন্সর ডেটা একটি উচ্চ হারে পরিবর্তিত হতে পারে, যার অর্থ সিস্টেমটি প্রায়শই onSensorChanged(SensorEvent)
পদ্ধতিটিকে কল করতে পারে। সেরা অনুশীলন হিসাবে, আপনার onSensorChanged(SensorEvent)
পদ্ধতির মধ্যে যতটা সম্ভব সম্ভব করা উচিত যাতে আপনি এটি ব্লক না করেন। যদি আপনার অ্যাপ্লিকেশনটির জন্য আপনাকে কোনও ডেটা ফিল্টারিং বা সেন্সর ডেটা হ্রাস করার প্রয়োজন হয় তবে আপনার সেই কাজটি onSensorChanged(SensorEvent)
পদ্ধতির বাইরে সম্পাদন করা উচিত।
অবনমিত পদ্ধতি বা সেন্সর প্রকারগুলি ব্যবহার করা এড়িয়ে চলুন
বেশ কয়েকটি পদ্ধতি এবং ধ্রুবক অবমূল্যায়ন করা হয়েছে। বিশেষত, TYPE_ORIENTATION
সেন্সর প্রকারটি হ্রাস করা হয়েছে। ওরিয়েন্টেশন ডেটা পেতে আপনার পরিবর্তে getOrientation()
পদ্ধতিটি ব্যবহার করা উচিত। তেমনিভাবে, TYPE_TEMPERATURE
সেন্সর প্রকারটি হ্রাস করা হয়েছে। অ্যান্ড্রয়েড 4.0 চালানো ডিভাইসগুলিতে আপনার পরিবর্তে TYPE_AMBIENT_TEMPERATURE
সেন্সর প্রকারটি ব্যবহার করা উচিত।
সেন্সরগুলি ব্যবহারের আগে যাচাই করুন
সর্বদা যাচাই করুন যে আপনি এটি থেকে ডেটা অর্জনের চেষ্টা করার আগে কোনও ডিভাইসে একটি সেন্সর উপস্থিত রয়েছে। ধরে নিবেন না যে একটি সেন্সর কেবল উপস্থিত রয়েছে কারণ এটি একটি ঘন ঘন ব্যবহৃত সেন্সর। ডিভাইস নির্মাতাদের তাদের ডিভাইসে কোনও নির্দিষ্ট সেন্সর সরবরাহ করার প্রয়োজন নেই।
সাবধানে সেন্সর বিলম্ব চয়ন করুন
আপনি যখন registerListener()
পদ্ধতির সাথে একটি সেন্সর নিবন্ধন করেন, তখন নিশ্চিত হন যে আপনি আপনার অ্যাপ্লিকেশন বা ব্যবহারের ক্ষেত্রে উপযুক্ত এমন একটি বিতরণ হার বেছে নেন। সেন্সরগুলি খুব উচ্চ হারে ডেটা সরবরাহ করতে পারে। সিস্টেমটিকে অতিরিক্ত ডেটা প্রেরণ করার অনুমতি দেয় যা আপনার বর্জ্য সিস্টেমের সংস্থানগুলির প্রয়োজন হয় না এবং ব্যাটারি শক্তি ব্যবহার করে।
বেশিরভাগ অ্যান্ড্রয়েড-চালিত ডিভাইসে অন্তর্নির্মিত সেন্সর রয়েছে যা গতি, ওরিয়েন্টেশন এবং বিভিন্ন পরিবেশগত পরিস্থিতি পরিমাপ করে। এই সেন্সরগুলি উচ্চ নির্ভুলতা এবং নির্ভুলতার সাথে কাঁচা ডেটা সরবরাহ করতে সক্ষম এবং আপনি যদি ত্রি-মাত্রিক ডিভাইস আন্দোলন বা অবস্থান নিরীক্ষণ করতে চান বা আপনি কোনও ডিভাইসের নিকটবর্তী পরিবেষ্টিত পরিবেশের পরিবর্তনগুলি পর্যবেক্ষণ করতে চান তবে তা কার্যকর। উদাহরণস্বরূপ, কোনও গেমটি কোনও ডিভাইসের মাধ্যাকর্ষণ সেন্সর থেকে জটিল ব্যবহারকারীর অঙ্গভঙ্গি এবং গতি যেমন টিল্ট, শেক, ঘূর্ণন বা সুইংয়ের জন্য পড়তে পারে তা ট্র্যাক করতে পারে। তেমনিভাবে, একটি আবহাওয়া অ্যাপ্লিকেশনটি ডিউপয়েন্টটি গণনা এবং প্রতিবেদন করতে কোনও ডিভাইসের তাপমাত্রা সেন্সর এবং আর্দ্রতা সেন্সর ব্যবহার করতে পারে বা কোনও ভ্রমণ অ্যাপ্লিকেশন একটি কম্পাস ভারবহন রিপোর্ট করতে জিওম্যাগনেটিক ফিল্ড সেন্সর এবং অ্যাক্সিলোমিটার ব্যবহার করতে পারে।
নিম্নলিখিত সম্পর্কিত সংস্থানগুলি দেখুন:
অ্যান্ড্রয়েড প্ল্যাটফর্মটি তিনটি বিস্তৃত সেন্সর সমর্থন করে:
- মোশন সেন্সর
এই সেন্সরগুলি তিনটি অক্ষ বরাবর ত্বরণ বাহিনী এবং ঘূর্ণন বাহিনী পরিমাপ করে। এই বিভাগে অ্যাক্সিলোমিটার, মাধ্যাকর্ষণ সেন্সর, জাইরোস্কোপ এবং ঘূর্ণনশীল ভেক্টর সেন্সর অন্তর্ভুক্ত রয়েছে।
- পরিবেশগত সেন্সর
এই সেন্সরগুলি বিভিন্ন পরিবেশগত পরামিতিগুলি পরিমাপ করে যেমন পরিবেষ্টিত বায়ু তাপমাত্রা এবং চাপ, আলোকসজ্জা এবং আর্দ্রতা। এই বিভাগে ব্যারোমিটার, ফটোমিটার এবং থার্মোমিটার রয়েছে।
- অবস্থান সেন্সর
এই সেন্সরগুলি একটি ডিভাইসের শারীরিক অবস্থান পরিমাপ করে। এই বিভাগে ওরিয়েন্টেশন সেন্সর এবং চৌম্বকীয় অন্তর্ভুক্ত রয়েছে।
আপনি ডিভাইসে উপলব্ধ সেন্সরগুলিতে অ্যাক্সেস করতে পারেন এবং অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে কাঁচা সেন্সর ডেটা অর্জন করতে পারেন। সেন্সর ফ্রেমওয়ার্কটি বেশ কয়েকটি ক্লাস এবং ইন্টারফেস সরবরাহ করে যা আপনাকে বিভিন্ন ধরণের সেন্সর সম্পর্কিত কাজ সম্পাদন করতে সহায়তা করে। উদাহরণস্বরূপ, আপনি নিম্নলিখিতগুলি করতে সেন্সর ফ্রেমওয়ার্কটি ব্যবহার করতে পারেন:
- কোন ডিভাইসে কোন সেন্সর উপলব্ধ তা নির্ধারণ করুন।
- একটি পৃথক সেন্সরের ক্ষমতা যেমন এর সর্বাধিক পরিসীমা, প্রস্তুতকারক, পাওয়ার প্রয়োজনীয়তা এবং রেজোলিউশন নির্ধারণ করুন।
- কাঁচা সেন্সর ডেটা অর্জন করুন এবং আপনি সেন্সর ডেটা অর্জন করেন এমন ন্যূনতম হারের সংজ্ঞা দিন।
- সেন্সর পরিবর্তনগুলি পর্যবেক্ষণ করে এমন সেন্সর ইভেন্ট শ্রোতাদের নিবন্ধন করুন এবং নিবন্ধভুক্ত করুন।
এই বিষয়টি অ্যান্ড্রয়েড প্ল্যাটফর্মে উপলভ্য সেন্সরগুলির একটি ওভারভিউ সরবরাহ করে। এটি সেন্সর কাঠামোর একটি ভূমিকাও সরবরাহ করে।
সেন্সর পরিচিতি
অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক আপনাকে বিভিন্ন ধরণের সেন্সর অ্যাক্সেস করতে দেয়। এর মধ্যে কয়েকটি সেন্সর হার্ডওয়্যার-ভিত্তিক এবং কিছু সফ্টওয়্যার ভিত্তিক। হার্ডওয়্যার-ভিত্তিক সেন্সর হ্যান্ডসেট বা ট্যাবলেট ডিভাইসে নির্মিত শারীরিক উপাদান। তারা নির্দিষ্ট পরিবেশগত বৈশিষ্ট্য যেমন ত্বরণ, ভূ -চৌম্বকীয় ক্ষেত্র শক্তি বা কৌণিক পরিবর্তন হিসাবে সরাসরি পরিমাপ করে তাদের ডেটা অর্জন করে। সফ্টওয়্যার-ভিত্তিক সেন্সরগুলি শারীরিক ডিভাইস নয়, যদিও তারা হার্ডওয়্যার-ভিত্তিক সেন্সরগুলি নকল করে। সফ্টওয়্যার-ভিত্তিক সেন্সরগুলি তাদের ডেটা এক বা একাধিক হার্ডওয়্যার-ভিত্তিক সেন্সর থেকে প্রাপ্ত করে এবং কখনও কখনও ভার্চুয়াল সেন্সর বা সিন্থেটিক সেন্সর বলা হয়। লিনিয়ার ত্বরণ সেন্সর এবং মাধ্যাকর্ষণ সেন্সরটি সফ্টওয়্যার-ভিত্তিক সেন্সরগুলির উদাহরণ। সারণী 1 সেন্সরগুলির সংক্ষিপ্তসার করে যা অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা সমর্থিত।
কয়েকটি অ্যান্ড্রয়েড চালিত ডিভাইসে প্রতিটি ধরণের সেন্সর রয়েছে। উদাহরণস্বরূপ, বেশিরভাগ হ্যান্ডসেট ডিভাইস এবং ট্যাবলেটগুলির একটি অ্যাক্সিলোমিটার এবং একটি চৌম্বকীয়তা থাকে তবে কম ডিভাইসে ব্যারোমিটার বা থার্মোমিটার থাকে। এছাড়াও, একটি ডিভাইসে প্রদত্ত ধরণের একাধিক সেন্সর থাকতে পারে। উদাহরণস্বরূপ, একটি ডিভাইসে দুটি মাধ্যাকর্ষণ সেন্সর থাকতে পারে, প্রত্যেকের আলাদা আলাদা পরিসীমা রয়েছে।
সেন্সর | টাইপ | বর্ণনা | সাধারণ ব্যবহার |
---|---|---|---|
TYPE_ACCELEROMETER | হার্ডওয়্যার | মাধ্যাকর্ষণ বল সহ তিনটি শারীরিক অক্ষ (এক্স, ওয়াই, এবং জেড) এর কোনও ডিভাইসে প্রয়োগ করা হয় এমন এম/এস 2 -তে ত্বরণ শক্তি পরিমাপ করে। | গতি সনাক্তকরণ (শেক, টিল্ট ইত্যাদি)। |
TYPE_AMBIENT_TEMPERATURE | হার্ডওয়্যার | ডিগ্রি সেলসিয়াস (ডিগ্রি সেন্টিগ্রেড) এ পরিবেষ্টিত ঘরের তাপমাত্রা পরিমাপ করে। নীচের নোট দেখুন. | বায়ু তাপমাত্রা পর্যবেক্ষণ। |
TYPE_GRAVITY | সফ্টওয়্যার বা হার্ডওয়্যার | তিনটি শারীরিক অক্ষের (এক্স, ওয়াই, জেড) কোনও ডিভাইসে প্রয়োগ করা হয় এমন এম/এস 2 এ মাধ্যাকর্ষণ বলকে পরিমাপ করে। | গতি সনাক্তকরণ (শেক, টিল্ট ইত্যাদি)। |
TYPE_GYROSCOPE | হার্ডওয়্যার | তিনটি শারীরিক অক্ষের (এক্স, ওয়াই, এবং জেড) প্রত্যেকটির চারপাশে রেড/এস -তে একটি ডিভাইসের ঘূর্ণনের হার পরিমাপ করে। | ঘূর্ণন সনাক্তকরণ (স্পিন, টার্ন ইত্যাদি)। |
TYPE_LIGHT | হার্ডওয়্যার | এলএক্সে পরিবেষ্টিত আলো স্তর (আলোকসজ্জা) পরিমাপ করে। | পর্দার উজ্জ্বলতা নিয়ন্ত্রণ করা। |
TYPE_LINEAR_ACCELERATION | সফ্টওয়্যার বা হার্ডওয়্যার | মাধ্যাকর্ষণ শক্তি ব্যতীত তিনটি শারীরিক অক্ষ (এক্স, ওয়াই, এবং জেড) এর কোনও ডিভাইসে প্রয়োগ করা হয় এমন এম/এস 2 এ ত্বরণ শক্তি পরিমাপ করে। | একক অক্ষ বরাবর ত্বরণ ত্বরণ। |
TYPE_MAGNETIC_FIELD | হার্ডওয়্যার | Μt এ তিনটি শারীরিক অক্ষ (x, y, z) এর জন্য পরিবেষ্টিত ভূ -চৌম্বকীয় ক্ষেত্রটি পরিমাপ করে। | একটি কম্পাস তৈরি করা। |
TYPE_ORIENTATION | সফটওয়্যার | ঘূর্ণনের ডিগ্রি পরিমাপ করে যা কোনও ডিভাইস তিনটি শারীরিক অক্ষের চারপাশে তৈরি করে (x, y, z)। এপিআই স্তর 3 হিসাবে আপনি getRotationMatrix() পদ্ধতির সাথে একত্রে মাধ্যাকর্ষণ সেন্সর এবং জিওম্যাগনেটিক ফিল্ড সেন্সর ব্যবহার করে কোনও ডিভাইসের জন্য প্রবণতা ম্যাট্রিক্স এবং রোটেশন ম্যাট্রিক্স পেতে পারেন। | ডিভাইস অবস্থান নির্ধারণ। |
TYPE_PRESSURE | হার্ডওয়্যার | এইচপিএ বা এমবিএআর -তে পরিবেষ্টিত বায়ুচাপ পরিমাপ করে। | বায়ুচাপের পরিবর্তন পর্যবেক্ষণ করা। |
TYPE_PROXIMITY | হার্ডওয়্যার | কোনও ডিভাইসের ভিউ স্ক্রিনের তুলনায় মুখ্যমন্ত্রী কোনও বস্তুর সান্নিধ্য পরিমাপ করে। এই সেন্সরটি সাধারণত কোনও ব্যক্তির কানে রাখা হচ্ছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। | একটি কল চলাকালীন ফোন অবস্থান। |
TYPE_RELATIVE_HUMIDITY | হার্ডওয়্যার | শতাংশ (%) এ আপেক্ষিক পরিবেষ্টিত আর্দ্রতা পরিমাপ করে। | শিশির পয়েন্ট, পরম এবং আপেক্ষিক আর্দ্রতা পর্যবেক্ষণ। |
TYPE_ROTATION_VECTOR | সফ্টওয়্যার বা হার্ডওয়্যার | ডিভাইসের ঘূর্ণন ভেক্টরের তিনটি উপাদান সরবরাহ করে কোনও ডিভাইসের ওরিয়েন্টেশন পরিমাপ করে। | গতি সনাক্তকরণ এবং ঘূর্ণন সনাক্তকরণ। |
TYPE_TEMPERATURE | হার্ডওয়্যার | ডিগ্রি সেলসিয়াস (ডিগ্রি সেন্টিগ্রেড) এ ডিভাইসের তাপমাত্রা পরিমাপ করে। এই সেন্সর বাস্তবায়ন ডিভাইসগুলিতে পরিবর্তিত হয় এবং এই সেন্সরটি এপিআই স্তরের 14 এ TYPE_AMBIENT_TEMPERATURE সেন্সর দিয়ে প্রতিস্থাপন করা হয়েছিল | তাপমাত্রা পর্যবেক্ষণ। |
সেন্সর ফ্রেমওয়ার্ক
আপনি এই সেন্সরগুলিতে অ্যাক্সেস করতে পারেন এবং অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক ব্যবহার করে কাঁচা সেন্সর ডেটা অর্জন করতে পারেন। সেন্সর ফ্রেমওয়ার্কটি android.hardware
প্যাকেজের অংশ এবং নিম্নলিখিত ক্লাস এবং ইন্টারফেসগুলি অন্তর্ভুক্ত করে:
-
SensorManager
- সেন্সর পরিষেবার উদাহরণ তৈরি করতে আপনি এই শ্রেণিটি ব্যবহার করতে পারেন। এই শ্রেণিটি সেন্সরগুলিতে অ্যাক্সেস এবং তালিকাভুক্ত করার জন্য, সেন্সর ইভেন্ট শ্রোতাদের নিবন্ধকরণ এবং নিবন্ধভুক্ত করার জন্য এবং ওরিয়েন্টেশন সম্পর্কিত তথ্য অর্জনের জন্য বিভিন্ন পদ্ধতি সরবরাহ করে। এই শ্রেণিটি বেশ কয়েকটি সেন্সর ধ্রুবকও সরবরাহ করে যা সেন্সর নির্ভুলতা রিপোর্ট করতে, ডেটা অধিগ্রহণের হার নির্ধারণ করতে এবং সেন্সরগুলি ক্যালিব্রেট করতে ব্যবহৃত হয়।
-
Sensor
- আপনি এই ক্লাসটি একটি নির্দিষ্ট সেন্সরের উদাহরণ তৈরি করতে ব্যবহার করতে পারেন। এই শ্রেণিটি বিভিন্ন পদ্ধতি সরবরাহ করে যা আপনাকে একটি সেন্সরের ক্ষমতা নির্ধারণ করতে দেয়।
-
SensorEvent
- সিস্টেমটি এই শ্রেণিটি একটি সেন্সর ইভেন্ট অবজেক্ট তৈরি করতে ব্যবহার করে, যা একটি সেন্সর ইভেন্ট সম্পর্কে তথ্য সরবরাহ করে। একটি সেন্সর ইভেন্ট অবজেক্টের মধ্যে নিম্নলিখিত তথ্যগুলি অন্তর্ভুক্ত রয়েছে: কাঁচা সেন্সর ডেটা, সেন্সর ধরণের যা ইভেন্টটি উত্পন্ন করে, ডেটার যথার্থতা এবং ইভেন্টের টাইমস্ট্যাম্প।
-
SensorEventListener
- সেন্সরের মানগুলি পরিবর্তিত হওয়ার সময় বা সেন্সরের নির্ভুলতা পরিবর্তিত হলে আপনি দুটি কলব্যাক পদ্ধতি তৈরি করতে এই ইন্টারফেসটি ব্যবহার করতে পারেন যা বিজ্ঞপ্তিগুলি (সেন্সর ইভেন্টগুলি) গ্রহণ করে।
একটি সাধারণ অ্যাপ্লিকেশনটিতে আপনি এই সেন্সর সম্পর্কিত এপিআই দুটি প্রাথমিক কাজ সম্পাদন করতে ব্যবহার করেন:
- সেন্সর এবং সেন্সর ক্ষমতা সনাক্তকরণ
রানটাইমে সেন্সর এবং সেন্সর ক্ষমতা সনাক্তকরণ কার্যকর যদি আপনার অ্যাপ্লিকেশনটিতে এমন বৈশিষ্ট্য থাকে যা নির্দিষ্ট সেন্সর প্রকার বা ক্ষমতাগুলির উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি কোনও ডিভাইসে উপস্থিত সমস্ত সেন্সর সনাক্ত করতে চাইতে পারেন এবং উপস্থিত নেই এমন সেন্সরগুলির উপর নির্ভর করে এমন কোনও অ্যাপ্লিকেশন বৈশিষ্ট্যগুলি অক্ষম করতে পারেন। তেমনি, আপনি প্রদত্ত ধরণের সমস্ত সেন্সর সনাক্ত করতে চাইতে পারেন যাতে আপনি সেন্সর বাস্তবায়ন চয়ন করতে পারেন যা আপনার অ্যাপ্লিকেশনটির জন্য সর্বোত্তম পারফরম্যান্স রয়েছে।
- সেন্সর ইভেন্টগুলি নিরীক্ষণ করুন
সেন্সর ইভেন্টগুলি পর্যবেক্ষণ করা হয় আপনি কীভাবে কাঁচা সেন্সর ডেটা অর্জন করেন। একটি সেন্সর ইভেন্টটি প্রতিবার যখন কোনও সেন্সর পরিমাপ করছে এমন প্যারামিটারগুলির পরিবর্তন সনাক্ত করে। একটি সেন্সর ইভেন্ট আপনাকে চারটি টুকরো তথ্য সরবরাহ করে: সেন্সরের নাম যা ইভেন্টটিকে ট্রিগার করেছিল, ইভেন্টের টাইমস্ট্যাম্প, ইভেন্টের যথার্থতা এবং ইভেন্টটি ট্রিগার করে এমন কাঁচা সেন্সর ডেটা।
সেন্সর প্রাপ্যতা
সেন্সর প্রাপ্যতা ডিভাইস থেকে ডিভাইসে পরিবর্তিত হলেও এটি অ্যান্ড্রয়েড সংস্করণগুলির মধ্যেও পৃথক হতে পারে। এটি কারণ অ্যান্ড্রয়েড সেন্সরগুলি বেশ কয়েকটি প্ল্যাটফর্ম রিলিজের সময় চালু করা হয়েছে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড 1.5 (এপিআই স্তর 3) এ অনেকগুলি সেন্সর চালু করা হয়েছিল, তবে কিছু প্রয়োগ করা হয়নি এবং অ্যান্ড্রয়েড 2.3 (এপিআই স্তর 9) না হওয়া পর্যন্ত ব্যবহারের জন্য উপলব্ধ ছিল না। তেমনি, অ্যান্ড্রয়েড ২.৩ (এপিআই স্তর 9) এবং অ্যান্ড্রয়েড 4.0 (এপিআই স্তর 14) এ বেশ কয়েকটি সেন্সর চালু করা হয়েছিল। দুটি সেন্সরকে অবমূল্যায়ন করা হয়েছে এবং নতুন, আরও ভাল সেন্সর দ্বারা প্রতিস্থাপন করা হয়েছে।
সারণী 2 প্ল্যাটফর্ম-বাই-প্ল্যাটফর্ম ভিত্তিতে প্রতিটি সেন্সরের প্রাপ্যতার সংক্ষিপ্তসার করে। কেবল চারটি প্ল্যাটফর্ম তালিকাভুক্ত করা হয়েছে কারণ সেগুলি হ'ল প্ল্যাটফর্মগুলি যা সেন্সর পরিবর্তনের সাথে জড়িত। অবমূল্যায়িত হিসাবে তালিকাভুক্ত সেন্সরগুলি পরবর্তী প্ল্যাটফর্মগুলিতে এখনও পাওয়া যায় (সেন্সরটি কোনও ডিভাইসে উপস্থিত থাকে), যা অ্যান্ড্রয়েডের ফরোয়ার্ড সামঞ্জস্যতা নীতির সাথে সামঞ্জস্যপূর্ণ।
সেন্সর | অ্যান্ড্রয়েড 4.0 (এপিআই স্তর 14) | অ্যান্ড্রয়েড 2.3 (এপিআই স্তর 9) | অ্যান্ড্রয়েড 2.2 (এপিআই স্তর 8) | অ্যান্ড্রয়েড 1.5 (এপিআই স্তর 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 This sensor is available, but it has been deprecated.
Identifying Sensors and Sensor Capabilities
The Android sensor framework provides several methods that make it easy for you to determine at runtime which sensors are on a device. The API also provides methods that let you determine the capabilities of each sensor, such as its maximum range, its resolution, and its power requirements.
To identify the sensors that are on a device you first need to get a reference to the sensor service. To do this, you create an instance of the SensorManager
class by calling the getSystemService()
method and passing in the SENSOR_SERVICE
argument. যেমন:
কোটলিন
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
জাভা
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Next, you can get a listing of every sensor on a device by calling the getSensorList()
method and using the TYPE_ALL
constant. যেমন:
কোটলিন
val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
জাভা
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
If you want to list all of the sensors of a given type, you could use another constant instead of TYPE_ALL
such as TYPE_GYROSCOPE
, TYPE_LINEAR_ACCELERATION
, or TYPE_GRAVITY
.
You can also determine whether a specific type of sensor exists on a device by using the getDefaultSensor()
method and passing in the type constant for a specific sensor. If a device has more than one sensor of a given type, one of the sensors must be designated as the default sensor. If a default sensor does not exist for a given type of sensor, the method call returns null, which means the device does not have that type of sensor. For example, the following code checks whether there's a magnetometer on a device:
কোটলিন
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. }
Note: Android does not require device manufacturers to build any particular types of sensors into their Android-powered devices, so devices can have a wide range of sensor configurations.
In addition to listing the sensors that are on a device, you can use the public methods of the Sensor
class to determine the capabilities and attributes of individual sensors. This is useful if you want your application to behave differently based on which sensors or sensor capabilities are available on a device. For example, you can use the getResolution()
and getMaximumRange()
methods to obtain a sensor's resolution and maximum range of measurement. You can also use the getPower()
method to obtain a sensor's power requirements.
Two of the public methods are particularly useful if you want to optimize your application for different manufacturer's sensors or different versions of a sensor. For example, if your application needs to monitor user gestures such as tilt and shake, you could create one set of data filtering rules and optimizations for newer devices that have a specific vendor's gravity sensor, and another set of data filtering rules and optimizations for devices that do not have a gravity sensor and have only an accelerometer. The following code sample shows you how you can use the getVendor()
and getVersion()
methods to do this. In this sample, we're looking for a gravity sensor that lists Google LLC as the vendor and has a version number of 3. If that particular sensor is not present on the device, we try to use the accelerometer.
কোটলিন
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. } }
Another useful method is the getMinDelay()
method, which returns the minimum time interval (in microseconds) a sensor can use to sense data. Any sensor that returns a non-zero value for the getMinDelay()
method is a streaming sensor. Streaming sensors sense data at regular intervals and were introduced in Android 2.3 (API Level 9). If a sensor returns zero when you call the getMinDelay()
method, it means the sensor is not a streaming sensor because it reports data only when there is a change in the parameters it is sensing.
The getMinDelay()
method is useful because it lets you determine the maximum rate at which a sensor can acquire data. If certain features in your application require high data acquisition rates or a streaming sensor, you can use this method to determine whether a sensor meets those requirements and then enable or disable the relevant features in your application accordingly.
Caution: A sensor's maximum data acquisition rate is not necessarily the rate at which the sensor framework delivers sensor data to your application. The sensor framework reports data through sensor events, and several factors influence the rate at which your application receives sensor events. For more information, see Monitoring Sensor Events .
Monitoring Sensor Events
To monitor raw sensor data you need to implement two callback methods that are exposed through the SensorEventListener
interface: onAccuracyChanged()
and onSensorChanged()
. The Android system calls these methods whenever the following occurs:
- A sensor's accuracy changes.
In this case the system invokes the
onAccuracyChanged()
method, providing you with a reference to theSensor
object that changed and the new accuracy of the sensor. Accuracy is represented by one of four status constants:SENSOR_STATUS_ACCURACY_LOW
,SENSOR_STATUS_ACCURACY_MEDIUM
,SENSOR_STATUS_ACCURACY_HIGH
, orSENSOR_STATUS_UNRELIABLE
. - A sensor reports a new value.
In this case the system invokes the
onSensorChanged()
method, providing you with aSensorEvent
object. ASensorEvent
object contains information about the new sensor data, including: the accuracy of the data, the sensor that generated the data, the timestamp at which the data was generated, and the new data that the sensor recorded.
The following code shows how to use the onSensorChanged()
method to monitor data from the light sensor. This example displays the raw sensor data in a TextView
that is defined in the main.xml file as 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); } }
In this example, the default data delay ( SENSOR_DELAY_NORMAL
) is specified when the registerListener()
method is invoked. The data delay (or sampling rate) controls the interval at which sensor events are sent to your application via the onSensorChanged()
callback method. The default data delay is suitable for monitoring typical screen orientation changes and uses a delay of 200,000 microseconds. You can specify other data delays, such as SENSOR_DELAY_GAME
(20,000 microsecond delay), SENSOR_DELAY_UI
(60,000 microsecond delay), or SENSOR_DELAY_FASTEST
(0 microsecond delay). As of Android 3.0 (API Level 11) you can also specify the delay as an absolute value (in microseconds).
The delay that you specify is only a suggested delay. The Android system and other applications can alter this delay. As a best practice, you should specify the largest delay that you can because the system typically uses a smaller delay than the one you specify (that is, you should choose the slowest sampling rate that still meets the needs of your application). Using a larger delay imposes a lower load on the processor and therefore uses less power.
There is no public method for determining the rate at which the sensor framework is sending sensor events to your application; however, you can use the timestamps that are associated with each sensor event to calculate the sampling rate over several events. You should not have to change the sampling rate (delay) once you set it. If for some reason you do need to change the delay, you will have to unregister and reregister the sensor listener.
It's also important to note that this example uses the onResume()
and onPause()
callback methods to register and unregister the sensor event listener. As a best practice you should always disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours because some sensors have substantial power requirements and can use up battery power quickly. The system will not disable sensors automatically when the screen turns off.
Handling Different Sensor Configurations
Android does not specify a standard sensor configuration for devices, which means device manufacturers can incorporate any sensor configuration that they want into their Android-powered devices. As a result, devices can include a variety of sensors in a wide range of configurations. If your application relies on a specific type of sensor, you have to ensure that the sensor is present on a device so your app can run successfully.
You have two options for ensuring that a given sensor is present on a device:
- Detect sensors at runtime and enable or disable application features as appropriate.
- Use Google Play filters to target devices with specific sensor configurations.
Each option is discussed in the following sections.
Detecting sensors at runtime
If your application uses a specific type of sensor, but doesn't rely on it, you can use the sensor framework to detect the sensor at runtime and then disable or enable application features as appropriate. For example, a navigation application might use the temperature sensor, pressure sensor, GPS sensor, and geomagnetic field sensor to display the temperature, barometric pressure, location, and compass bearing. If a device doesn't have a pressure sensor, you can use the sensor framework to detect the absence of the pressure sensor at runtime and then disable the portion of your application's UI that displays pressure. For example, the following code checks whether there's a pressure sensor on a device:
কোটলিন
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. }
Using Google Play filters to target specific sensor configurations
If you are publishing your application on Google Play you can use the <uses-feature>
element in your manifest file to filter your application from devices that do not have the appropriate sensor configuration for your application. The <uses-feature>
element has several hardware descriptors that let you filter applications based on the presence of specific sensors. The sensors you can list include: accelerometer, barometer, compass (geomagnetic field), gyroscope, light, and proximity. The following is an example manifest entry that filters apps that do not have an accelerometer:
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
If you add this element and descriptor to your application's manifest, users will see your application on Google Play only if their device has an accelerometer.
You should set the descriptor to android:required="true"
only if your application relies entirely on a specific sensor. If your application uses a sensor for some functionality, but still runs without the sensor, you should list the sensor in the <uses-feature>
element, but set the descriptor to android:required="false"
. This helps ensure that devices can install your app even if they do not have that particular sensor. This is also a project management best practice that helps you keep track of the features your application uses. Keep in mind, if your application uses a particular sensor, but still runs without the sensor, then you should detect the sensor at runtime and disable or enable application features as appropriate.
সেন্সর সমন্বয় সিস্টেম
In general, the sensor framework uses a standard 3-axis coordinate system to express data values. For most sensors, the coordinate system is defined relative to the device's screen when the device is held in its default orientation (see figure 1). When a device is held in its default orientation, the X axis is horizontal and points to the right, the Y axis is vertical and points up, and the Z axis points toward the outside of the screen face. In this system, coordinates behind the screen have negative Z values. This coordinate system is used by the following sensors:
The most important point to understand about this coordinate system is that the axes are not swapped when the device's screen orientation changes—that is, the sensor's coordinate system never changes as the device moves. This behavior is the same as the behavior of the OpenGL coordinate system.
Another point to understand is that your application must not assume that a device's natural (default) orientation is portrait. The natural orientation for many tablet devices is landscape. And the sensor coordinate system is always based on the natural orientation of a device.
Finally, if your application matches sensor data to the on-screen display, you need to use the getRotation()
method to determine screen rotation, and then use the remapCoordinateSystem()
method to map sensor coordinates to screen coordinates. You need to do this even if your manifest specifies portrait-only display.
Note: Some sensors and methods use a coordinate system that is relative to the world's frame of reference (as opposed to the device's frame of reference). These sensors and methods return data that represent device motion or device position relative to the earth. For more information, see the getOrientation()
method, the getRotationMatrix()
method, Orientation Sensor , and Rotation Vector Sensor .
Sensor Rate-Limiting
To protect potentially sensitive information about users, if your app targets Android 12 (API level 31) or higher, the system places a limit on the refresh rate of data from certain motion sensors and position sensors. This data includes values recorded by the device's accelerometer , gyroscope , and geomagnetic field sensor .
The refresh rate limit depends on how you access sensor data:
- If you call the
registerListener()
method to monitor sensor events , the sensor sampling rate is limited to 200 Hz. This is true for all overloaded variants of theregisterListener()
method. - If you use the
SensorDirectChannel
class, the sensor sampling rate is limited toRATE_NORMAL
, which is usually about 50 Hz.
If your app needs to gather motion sensor data at a higher rate, you must declare the HIGH_SAMPLING_RATE_SENSORS
permission, as shown in the following code snippet. Otherwise, if your app tries to gather motion sensor data at a higher rate without declaring this permission, a SecurityException
occurs.
<manifest ...> <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> <application ...> ... </application> </manifest>
Best Practices for Accessing and Using Sensors
As you design your sensor implementation, be sure to follow the guidelines that are discussed in this section. These guidelines are recommended best practices for anyone who is using the sensor framework to access sensors and acquire sensor data.
Only gather sensor data in the foreground
On devices running Android 9 (API level 28) or higher, apps running in the background have the following restrictions:
- Sensors that use the continuous reporting mode, such as accelerometers and gyroscopes, don't receive events.
- Sensors that use the on-change or one-shot reporting modes don't receive events.
Given these restrictions, it's best to detect sensor events either when your app is in the foreground or as part of a foreground service .
Unregister sensor listeners
Be sure to unregister a sensor's listener when you are done using the sensor or when the sensor activity pauses. If a sensor listener is registered and its activity is paused, the sensor will continue to acquire data and use battery resources unless you unregister the sensor. The following code shows how to use the onPause()
method to unregister a listener:
কোটলিন
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); }
For more information, see unregisterListener(SensorEventListener)
.
Test with the Android Emulator
The Android Emulator includes a set of virtual sensor controls that allow you to test sensors such as accelerometer, ambient temperature, magnetometer, proximity, light, and more.
The emulator uses a connection with an Android device that is running the SdkControllerSensor app. Note that this app is available only on devices running Android 4.0 (API level 14) or higher. (If the device is running Android 4.0, it must have Revision 2 installed.) The SdkControllerSensor app monitors changes in the sensors on the device and transmits them to the emulator. The emulator is then transformed based on the new values that it receives from the sensors on your device.
You can view the source code for the SdkControllerSensor app in the following location:
$ your-android-sdk-directory/tools/apps/SdkController
To transfer data between your device and the emulator, follow these steps:
- Check that USB debugging is enabled on your device.
- Connect your device to your development machine using a USB cable.
- Start the SdkControllerSensor app on your device.
- In the app, select the sensors that you want to emulate.
Run the following
adb
command:- Start the emulator. You should now be able to apply transformations to the emulator by moving your device.
$ adb forward tcp:1968 tcp:1968
Note: If the movements that you make to your physical device aren't transforming the emulator, try running the adb
command from step 5 again.
For more information, see the Android Emulator guide .
Don't block the onSensorChanged() method
Sensor data can change at a high rate, which means the system may call the onSensorChanged(SensorEvent)
method quite often. As a best practice, you should do as little as possible within the onSensorChanged(SensorEvent)
method so you don't block it. If your application requires you to do any data filtering or reduction of sensor data, you should perform that work outside of the onSensorChanged(SensorEvent)
method.
Avoid using deprecated methods or sensor types
Several methods and constants have been deprecated. In particular, the TYPE_ORIENTATION
sensor type has been deprecated. To get orientation data you should use the getOrientation()
method instead. Likewise, the TYPE_TEMPERATURE
sensor type has been deprecated. You should use the TYPE_AMBIENT_TEMPERATURE
sensor type instead on devices that are running Android 4.0.
Verify sensors before you use them
Always verify that a sensor exists on a device before you attempt to acquire data from it. Don't assume that a sensor exists simply because it's a frequently-used sensor. Device manufacturers are not required to provide any particular sensors in their devices.
Choose sensor delays carefully
When you register a sensor with the registerListener()
method, be sure you choose a delivery rate that is suitable for your application or use-case. Sensors can provide data at very high rates. Allowing the system to send extra data that you don't need wastes system resources and uses battery power.
Most Android-powered devices have built-in sensors that measure motion, orientation, and various environmental conditions. These sensors are capable of providing raw data with high precision and accuracy, and are useful if you want to monitor three-dimensional device movement or positioning, or you want to monitor changes in the ambient environment near a device. For example, a game might track readings from a device's gravity sensor to infer complex user gestures and motions, such as tilt, shake, rotation, or swing. Likewise, a weather application might use a device's temperature sensor and humidity sensor to calculate and report the dewpoint, or a travel application might use the geomagnetic field sensor and accelerometer to report a compass bearing.
Refer to the following related resources:
The Android platform supports three broad categories of sensors:
- মোশন সেন্সর
These sensors measure acceleration forces and rotational forces along three axes. এই বিভাগে অ্যাক্সিলোমিটার, মাধ্যাকর্ষণ সেন্সর, জাইরোস্কোপ এবং ঘূর্ণনশীল ভেক্টর সেন্সর অন্তর্ভুক্ত রয়েছে।
- পরিবেশগত সেন্সর
These sensors measure various environmental parameters, such as ambient air temperature and pressure, illumination, and humidity. এই বিভাগে ব্যারোমিটার, ফটোমিটার এবং থার্মোমিটার রয়েছে।
- অবস্থান সেন্সর
এই সেন্সরগুলি একটি ডিভাইসের শারীরিক অবস্থান পরিমাপ করে। This category includes orientation sensors and magnetometers.
You can access sensors available on the device and acquire raw sensor data by using the Android sensor framework. The sensor framework provides several classes and interfaces that help you perform a wide variety of sensor-related tasks. For example, you can use the sensor framework to do the following:
- Determine which sensors are available on a device.
- Determine an individual sensor's capabilities, such as its maximum range, manufacturer, power requirements, and resolution.
- Acquire raw sensor data and define the minimum rate at which you acquire sensor data.
- Register and unregister sensor event listeners that monitor sensor changes.
This topic provides an overview of the sensors that are available on the Android platform. It also provides an introduction to the sensor framework.
সেন্সর পরিচিতি
The Android sensor framework lets you access many types of sensors. Some of these sensors are hardware-based and some are software-based. Hardware-based sensors are physical components built into a handset or tablet device. They derive their data by directly measuring specific environmental properties, such as acceleration, geomagnetic field strength, or angular change. Software-based sensors are not physical devices, although they mimic hardware-based sensors. Software-based sensors derive their data from one or more of the hardware-based sensors and are sometimes called virtual sensors or synthetic sensors. The linear acceleration sensor and the gravity sensor are examples of software-based sensors. Table 1 summarizes the sensors that are supported by the Android platform.
Few Android-powered devices have every type of sensor. For example, most handset devices and tablets have an accelerometer and a magnetometer, but fewer devices have barometers or thermometers. Also, a device can have more than one sensor of a given type. For example, a device can have two gravity sensors, each one having a different range.
সেন্সর | টাইপ | বর্ণনা | সাধারণ ব্যবহার |
---|---|---|---|
TYPE_ACCELEROMETER | হার্ডওয়্যার | Measures the acceleration force in m/s 2 that is applied to a device on all three physical axes (x, y, and z), including the force of gravity. | Motion detection (shake, tilt, etc.). |
TYPE_AMBIENT_TEMPERATURE | হার্ডওয়্যার | Measures the ambient room temperature in degrees Celsius (°C). নীচের নোট দেখুন. | Monitoring air temperatures. |
TYPE_GRAVITY | Software or Hardware | Measures the force of gravity in m/s 2 that is applied to a device on all three physical axes (x, y, z). | Motion detection (shake, tilt, etc.). |
TYPE_GYROSCOPE | হার্ডওয়্যার | Measures a device's rate of rotation in rad/s around each of the three physical axes (x, y, and z). | Rotation detection (spin, turn, etc.). |
TYPE_LIGHT | হার্ডওয়্যার | Measures the ambient light level (illumination) in lx. | Controlling screen brightness. |
TYPE_LINEAR_ACCELERATION | Software or Hardware | Measures the acceleration force in m/s 2 that is applied to a device on all three physical axes (x, y, and z), excluding the force of gravity. | Monitoring acceleration along a single axis. |
TYPE_MAGNETIC_FIELD | হার্ডওয়্যার | Measures the ambient geomagnetic field for all three physical axes (x, y, z) in μT. | Creating a compass. |
TYPE_ORIENTATION | সফটওয়্যার | Measures degrees of rotation that a device makes around all three physical axes (x, y, z). As of API level 3 you can obtain the inclination matrix and rotation matrix for a device by using the gravity sensor and the geomagnetic field sensor in conjunction with the getRotationMatrix() method. | Determining device position. |
TYPE_PRESSURE | হার্ডওয়্যার | Measures the ambient air pressure in hPa or mbar. | বায়ুচাপের পরিবর্তন পর্যবেক্ষণ করা। |
TYPE_PROXIMITY | হার্ডওয়্যার | Measures the proximity of an object in cm relative to the view screen of a device. This sensor is typically used to determine whether a handset is being held up to a person's ear. | Phone position during a call. |
TYPE_RELATIVE_HUMIDITY | হার্ডওয়্যার | Measures the relative ambient humidity in percent (%). | Monitoring dewpoint, absolute, and relative humidity. |
TYPE_ROTATION_VECTOR | Software or Hardware | Measures the orientation of a device by providing the three elements of the device's rotation vector. | Motion detection and rotation detection. |
TYPE_TEMPERATURE | হার্ডওয়্যার | Measures the temperature of the device in degrees Celsius (°C). This sensor implementation varies across devices and this sensor was replaced with the TYPE_AMBIENT_TEMPERATURE sensor in API Level 14 | Monitoring temperatures. |
সেন্সর ফ্রেমওয়ার্ক
You can access these sensors and acquire raw sensor data by using the Android sensor framework. The sensor framework is part of the android.hardware
package and includes the following classes and interfaces:
-
SensorManager
- You can use this class to create an instance of the sensor service. This class provides various methods for accessing and listing sensors, registering and unregistering sensor event listeners, and acquiring orientation information. This class also provides several sensor constants that are used to report sensor accuracy, set data acquisition rates, and calibrate sensors.
-
Sensor
- You can use this class to create an instance of a specific sensor. This class provides various methods that let you determine a sensor's capabilities.
-
SensorEvent
- The system uses this class to create a sensor event object, which provides information about a sensor event. A sensor event object includes the following information: the raw sensor data, the type of sensor that generated the event, the accuracy of the data, and the timestamp for the event.
-
SensorEventListener
- You can use this interface to create two callback methods that receive notifications (sensor events) when sensor values change or when sensor accuracy changes.
In a typical application you use these sensor-related APIs to perform two basic tasks:
- Identifying sensors and sensor capabilities
Identifying sensors and sensor capabilities at runtime is useful if your application has features that rely on specific sensor types or capabilities. For example, you may want to identify all of the sensors that are present on a device and disable any application features that rely on sensors that are not present. Likewise, you may want to identify all of the sensors of a given type so you can choose the sensor implementation that has the optimum performance for your application.
- Monitor sensor events
Monitoring sensor events is how you acquire raw sensor data. A sensor event occurs every time a sensor detects a change in the parameters it is measuring. A sensor event provides you with four pieces of information: the name of the sensor that triggered the event, the timestamp for the event, the accuracy of the event, and the raw sensor data that triggered the event.
Sensor Availability
While sensor availability varies from device to device, it can also vary between Android versions. This is because the Android sensors have been introduced over the course of several platform releases. For example, many sensors were introduced in Android 1.5 (API Level 3), but some were not implemented and were not available for use until Android 2.3 (API Level 9). Likewise, several sensors were introduced in Android 2.3 (API Level 9) and Android 4.0 (API Level 14). Two sensors have been deprecated and replaced by newer, better sensors.
Table 2 summarizes the availability of each sensor on a platform-by-platform basis. Only four platforms are listed because those are the platforms that involved sensor changes. Sensors that are listed as deprecated are still available on subsequent platforms (provided the sensor is present on a device), which is in line with Android's forward compatibility policy.
সেন্সর | অ্যান্ড্রয়েড 4.0 (API Level 14) | অ্যান্ড্রয়েড 2.3 (API Level 9) | অ্যান্ড্রয়েড 2.2 (API Level 8) | Android 1.5 (API Level 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 This sensor type was added in Android 1.5 (API Level 3), but it was not available for use until Android 2.3 (API Level 9).
2 This sensor is available, but it has been deprecated.
Identifying Sensors and Sensor Capabilities
The Android sensor framework provides several methods that make it easy for you to determine at runtime which sensors are on a device. The API also provides methods that let you determine the capabilities of each sensor, such as its maximum range, its resolution, and its power requirements.
To identify the sensors that are on a device you first need to get a reference to the sensor service. To do this, you create an instance of the SensorManager
class by calling the getSystemService()
method and passing in the SENSOR_SERVICE
argument. যেমন:
কোটলিন
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
জাভা
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Next, you can get a listing of every sensor on a device by calling the getSensorList()
method and using the TYPE_ALL
constant. যেমন:
কোটলিন
val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
জাভা
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
If you want to list all of the sensors of a given type, you could use another constant instead of TYPE_ALL
such as TYPE_GYROSCOPE
, TYPE_LINEAR_ACCELERATION
, or TYPE_GRAVITY
.
You can also determine whether a specific type of sensor exists on a device by using the getDefaultSensor()
method and passing in the type constant for a specific sensor. If a device has more than one sensor of a given type, one of the sensors must be designated as the default sensor. If a default sensor does not exist for a given type of sensor, the method call returns null, which means the device does not have that type of sensor. For example, the following code checks whether there's a magnetometer on a device:
কোটলিন
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. }
Note: Android does not require device manufacturers to build any particular types of sensors into their Android-powered devices, so devices can have a wide range of sensor configurations.
In addition to listing the sensors that are on a device, you can use the public methods of the Sensor
class to determine the capabilities and attributes of individual sensors. This is useful if you want your application to behave differently based on which sensors or sensor capabilities are available on a device. For example, you can use the getResolution()
and getMaximumRange()
methods to obtain a sensor's resolution and maximum range of measurement. You can also use the getPower()
method to obtain a sensor's power requirements.
Two of the public methods are particularly useful if you want to optimize your application for different manufacturer's sensors or different versions of a sensor. For example, if your application needs to monitor user gestures such as tilt and shake, you could create one set of data filtering rules and optimizations for newer devices that have a specific vendor's gravity sensor, and another set of data filtering rules and optimizations for devices that do not have a gravity sensor and have only an accelerometer. The following code sample shows you how you can use the getVendor()
and getVersion()
methods to do this. In this sample, we're looking for a gravity sensor that lists Google LLC as the vendor and has a version number of 3. If that particular sensor is not present on the device, we try to use the accelerometer.
কোটলিন
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. } }
Another useful method is the getMinDelay()
method, which returns the minimum time interval (in microseconds) a sensor can use to sense data. Any sensor that returns a non-zero value for the getMinDelay()
method is a streaming sensor. Streaming sensors sense data at regular intervals and were introduced in Android 2.3 (API Level 9). If a sensor returns zero when you call the getMinDelay()
method, it means the sensor is not a streaming sensor because it reports data only when there is a change in the parameters it is sensing.
The getMinDelay()
method is useful because it lets you determine the maximum rate at which a sensor can acquire data. If certain features in your application require high data acquisition rates or a streaming sensor, you can use this method to determine whether a sensor meets those requirements and then enable or disable the relevant features in your application accordingly.
Caution: A sensor's maximum data acquisition rate is not necessarily the rate at which the sensor framework delivers sensor data to your application. The sensor framework reports data through sensor events, and several factors influence the rate at which your application receives sensor events. For more information, see Monitoring Sensor Events .
Monitoring Sensor Events
To monitor raw sensor data you need to implement two callback methods that are exposed through the SensorEventListener
interface: onAccuracyChanged()
and onSensorChanged()
. The Android system calls these methods whenever the following occurs:
- A sensor's accuracy changes.
In this case the system invokes the
onAccuracyChanged()
method, providing you with a reference to theSensor
object that changed and the new accuracy of the sensor. Accuracy is represented by one of four status constants:SENSOR_STATUS_ACCURACY_LOW
,SENSOR_STATUS_ACCURACY_MEDIUM
,SENSOR_STATUS_ACCURACY_HIGH
, orSENSOR_STATUS_UNRELIABLE
. - A sensor reports a new value.
In this case the system invokes the
onSensorChanged()
method, providing you with aSensorEvent
object. ASensorEvent
object contains information about the new sensor data, including: the accuracy of the data, the sensor that generated the data, the timestamp at which the data was generated, and the new data that the sensor recorded.
The following code shows how to use the onSensorChanged()
method to monitor data from the light sensor. This example displays the raw sensor data in a TextView
that is defined in the main.xml file as 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); } }
In this example, the default data delay ( SENSOR_DELAY_NORMAL
) is specified when the registerListener()
method is invoked. The data delay (or sampling rate) controls the interval at which sensor events are sent to your application via the onSensorChanged()
callback method. The default data delay is suitable for monitoring typical screen orientation changes and uses a delay of 200,000 microseconds. You can specify other data delays, such as SENSOR_DELAY_GAME
(20,000 microsecond delay), SENSOR_DELAY_UI
(60,000 microsecond delay), or SENSOR_DELAY_FASTEST
(0 microsecond delay). As of Android 3.0 (API Level 11) you can also specify the delay as an absolute value (in microseconds).
The delay that you specify is only a suggested delay. The Android system and other applications can alter this delay. As a best practice, you should specify the largest delay that you can because the system typically uses a smaller delay than the one you specify (that is, you should choose the slowest sampling rate that still meets the needs of your application). Using a larger delay imposes a lower load on the processor and therefore uses less power.
There is no public method for determining the rate at which the sensor framework is sending sensor events to your application; however, you can use the timestamps that are associated with each sensor event to calculate the sampling rate over several events. You should not have to change the sampling rate (delay) once you set it. If for some reason you do need to change the delay, you will have to unregister and reregister the sensor listener.
It's also important to note that this example uses the onResume()
and onPause()
callback methods to register and unregister the sensor event listener. As a best practice you should always disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours because some sensors have substantial power requirements and can use up battery power quickly. The system will not disable sensors automatically when the screen turns off.
Handling Different Sensor Configurations
Android does not specify a standard sensor configuration for devices, which means device manufacturers can incorporate any sensor configuration that they want into their Android-powered devices. As a result, devices can include a variety of sensors in a wide range of configurations. If your application relies on a specific type of sensor, you have to ensure that the sensor is present on a device so your app can run successfully.
You have two options for ensuring that a given sensor is present on a device:
- Detect sensors at runtime and enable or disable application features as appropriate.
- Use Google Play filters to target devices with specific sensor configurations.
Each option is discussed in the following sections.
Detecting sensors at runtime
If your application uses a specific type of sensor, but doesn't rely on it, you can use the sensor framework to detect the sensor at runtime and then disable or enable application features as appropriate. For example, a navigation application might use the temperature sensor, pressure sensor, GPS sensor, and geomagnetic field sensor to display the temperature, barometric pressure, location, and compass bearing. If a device doesn't have a pressure sensor, you can use the sensor framework to detect the absence of the pressure sensor at runtime and then disable the portion of your application's UI that displays pressure. For example, the following code checks whether there's a pressure sensor on a device:
কোটলিন
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. }
Using Google Play filters to target specific sensor configurations
If you are publishing your application on Google Play you can use the <uses-feature>
element in your manifest file to filter your application from devices that do not have the appropriate sensor configuration for your application. The <uses-feature>
element has several hardware descriptors that let you filter applications based on the presence of specific sensors. The sensors you can list include: accelerometer, barometer, compass (geomagnetic field), gyroscope, light, and proximity. The following is an example manifest entry that filters apps that do not have an accelerometer:
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
If you add this element and descriptor to your application's manifest, users will see your application on Google Play only if their device has an accelerometer.
You should set the descriptor to android:required="true"
only if your application relies entirely on a specific sensor. If your application uses a sensor for some functionality, but still runs without the sensor, you should list the sensor in the <uses-feature>
element, but set the descriptor to android:required="false"
. This helps ensure that devices can install your app even if they do not have that particular sensor. This is also a project management best practice that helps you keep track of the features your application uses. Keep in mind, if your application uses a particular sensor, but still runs without the sensor, then you should detect the sensor at runtime and disable or enable application features as appropriate.
সেন্সর সমন্বয় সিস্টেম
In general, the sensor framework uses a standard 3-axis coordinate system to express data values. For most sensors, the coordinate system is defined relative to the device's screen when the device is held in its default orientation (see figure 1). When a device is held in its default orientation, the X axis is horizontal and points to the right, the Y axis is vertical and points up, and the Z axis points toward the outside of the screen face. In this system, coordinates behind the screen have negative Z values. This coordinate system is used by the following sensors:
The most important point to understand about this coordinate system is that the axes are not swapped when the device's screen orientation changes—that is, the sensor's coordinate system never changes as the device moves. This behavior is the same as the behavior of the OpenGL coordinate system.
Another point to understand is that your application must not assume that a device's natural (default) orientation is portrait. The natural orientation for many tablet devices is landscape. And the sensor coordinate system is always based on the natural orientation of a device.
Finally, if your application matches sensor data to the on-screen display, you need to use the getRotation()
method to determine screen rotation, and then use the remapCoordinateSystem()
method to map sensor coordinates to screen coordinates. You need to do this even if your manifest specifies portrait-only display.
Note: Some sensors and methods use a coordinate system that is relative to the world's frame of reference (as opposed to the device's frame of reference). These sensors and methods return data that represent device motion or device position relative to the earth. For more information, see the getOrientation()
method, the getRotationMatrix()
method, Orientation Sensor , and Rotation Vector Sensor .
Sensor Rate-Limiting
To protect potentially sensitive information about users, if your app targets Android 12 (API level 31) or higher, the system places a limit on the refresh rate of data from certain motion sensors and position sensors. This data includes values recorded by the device's accelerometer , gyroscope , and geomagnetic field sensor .
The refresh rate limit depends on how you access sensor data:
- If you call the
registerListener()
method to monitor sensor events , the sensor sampling rate is limited to 200 Hz. This is true for all overloaded variants of theregisterListener()
method. - If you use the
SensorDirectChannel
class, the sensor sampling rate is limited toRATE_NORMAL
, which is usually about 50 Hz.
If your app needs to gather motion sensor data at a higher rate, you must declare the HIGH_SAMPLING_RATE_SENSORS
permission, as shown in the following code snippet. Otherwise, if your app tries to gather motion sensor data at a higher rate without declaring this permission, a SecurityException
occurs.
<manifest ...> <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> <application ...> ... </application> </manifest>
Best Practices for Accessing and Using Sensors
As you design your sensor implementation, be sure to follow the guidelines that are discussed in this section. These guidelines are recommended best practices for anyone who is using the sensor framework to access sensors and acquire sensor data.
Only gather sensor data in the foreground
On devices running Android 9 (API level 28) or higher, apps running in the background have the following restrictions:
- Sensors that use the continuous reporting mode, such as accelerometers and gyroscopes, don't receive events.
- Sensors that use the on-change or one-shot reporting modes don't receive events.
Given these restrictions, it's best to detect sensor events either when your app is in the foreground or as part of a foreground service .
Unregister sensor listeners
Be sure to unregister a sensor's listener when you are done using the sensor or when the sensor activity pauses. If a sensor listener is registered and its activity is paused, the sensor will continue to acquire data and use battery resources unless you unregister the sensor. The following code shows how to use the onPause()
method to unregister a listener:
কোটলিন
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); }
For more information, see unregisterListener(SensorEventListener)
.
Test with the Android Emulator
The Android Emulator includes a set of virtual sensor controls that allow you to test sensors such as accelerometer, ambient temperature, magnetometer, proximity, light, and more.
The emulator uses a connection with an Android device that is running the SdkControllerSensor app. Note that this app is available only on devices running Android 4.0 (API level 14) or higher. (If the device is running Android 4.0, it must have Revision 2 installed.) The SdkControllerSensor app monitors changes in the sensors on the device and transmits them to the emulator. The emulator is then transformed based on the new values that it receives from the sensors on your device.
You can view the source code for the SdkControllerSensor app in the following location:
$ your-android-sdk-directory/tools/apps/SdkController
To transfer data between your device and the emulator, follow these steps:
- Check that USB debugging is enabled on your device.
- Connect your device to your development machine using a USB cable.
- Start the SdkControllerSensor app on your device.
- In the app, select the sensors that you want to emulate.
Run the following
adb
command:- Start the emulator. You should now be able to apply transformations to the emulator by moving your device.
$ adb forward tcp:1968 tcp:1968
Note: If the movements that you make to your physical device aren't transforming the emulator, try running the adb
command from step 5 again.
For more information, see the Android Emulator guide .
Don't block the onSensorChanged() method
Sensor data can change at a high rate, which means the system may call the onSensorChanged(SensorEvent)
method quite often. As a best practice, you should do as little as possible within the onSensorChanged(SensorEvent)
method so you don't block it. If your application requires you to do any data filtering or reduction of sensor data, you should perform that work outside of the onSensorChanged(SensorEvent)
method.
Avoid using deprecated methods or sensor types
Several methods and constants have been deprecated. In particular, the TYPE_ORIENTATION
sensor type has been deprecated. To get orientation data you should use the getOrientation()
method instead. Likewise, the TYPE_TEMPERATURE
sensor type has been deprecated. You should use the TYPE_AMBIENT_TEMPERATURE
sensor type instead on devices that are running Android 4.0.
Verify sensors before you use them
Always verify that a sensor exists on a device before you attempt to acquire data from it. Don't assume that a sensor exists simply because it's a frequently-used sensor. Device manufacturers are not required to provide any particular sensors in their devices.
Choose sensor delays carefully
When you register a sensor with the registerListener()
method, be sure you choose a delivery rate that is suitable for your application or use-case. Sensors can provide data at very high rates. Allowing the system to send extra data that you don't need wastes system resources and uses battery power.