Sensors API হ'ল ডিভাইসের হার্ডওয়্যার সেন্সর অ্যাক্সেসের জন্য Android প্ল্যাটফর্ম ইন্টারফেস। API অ্যাক্সিলরোমিটার, জাইরোস্কোপ, ম্যাগনেটোমিটার, লাইট সেন্সর এবং অন্যান্য সেন্সর থেকে ডেটা পাওয়ার একটি ইউনিফাইড উপায় প্রদান করে। Google, 2026 অনুসারে, 95% এরও বেশি আধুনিক Android ডিভাইস কমপক্ষে তিন ধরনের সেন্সর দিয়ে সজ্জিত, যা কনটেক্সট-সচেতন অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য বিস্তৃত সুযোগ উন্মুক্ত করে।
মূল পয়েন্ট
Sensors API হ'ল Android Framework এর একটি সফ্টওয়্যার ইন্টারফেস যা ডেভেলপারদের মোবাইল ডিভাইসের হার্ডওয়্যার সেন্সর অ্যাক্সেস প্রদান করে। API সংস্করণ 1.0 থেকে Android SDK এর অংশ এবং android.hardware প্যাকেজের মাধ্যমে উপলব্ধ। ইন্টারফেসটি বিভিন্ন নির্মাতা — Qualcomm, MediaTek, Samsung Exynos — এর সেন্সর বাস্তবায়নের মধ্যে পার্থক্যকে অ্যাবস্ট্রাক্ট করে এবং সেন্সরের সাথে কাজ করার একটি ইউনিফাইড মডেল প্রদান করে।
API তিনটি মূল অপারেশন অনুমতি দেয়: উপলব্ধ সেন্সরের তালিকা পাওয়া, ডেটা পাওয়ার জন্য শ্রোতা নিবন্ধন করা এবং আপডেট রেট পরিচালনা করা। SensorManager সমস্ত অপারেশনের জন্য কেন্দ্রীয় অ্যাক্সেস পয়েন্ট হিসাবে কাজ করে। সিস্টেম onSensorChanged কলব্যাকের মাধ্যমে অ্যাপ্লিকেশনকে জানায়, float মানের একটি অ্যারে সহ SensorEvent অবজেক্ট পাস করে।
Android এর অস্তিত্বের সময়, API বিকাশের বিভিন্ন ধাপ অতিক্রম করেছে। সংস্করণ 2.3 (Gingerbread) ব্যাচ প্রসেসিং — পাওয়ার খরচ কমানোর জন্য সেন্সর ইভেন্ট গ্রুপিংয়ের জন্য সমর্থন চালু করেছে। Android 4.0 (Ice Cream Sandwich) ভার্চুয়াল সেন্সর Gravity এবং Linear Acceleration যোগ করেছে। Android 8.0 থেকে শুরু করে, সিস্টেম গোপনীয়তা বাড়ানোর জন্য সেন্সরে ব্যাকগ্রাউন্ড অ্যাক্সেস সীমাবদ্ধ করেছে।
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensorList: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
sensorList.forEach { sensor ->
Log.d("সেন্সর", "${sensor.name} — ${sensor.type}")
}
সব ডিভাইসে সেন্সরের একই সেট থাকে না। একজন শ্রোতা নিবন্ধন করার আগে একটি অ্যাপ্লিকেশনকে একটি নির্দিষ্ট সেন্সরের উপলব্ধতা পরীক্ষা করতে হবে। Android Emulator শুধুমাত্র সীমিত সেন্সর সেট — অ্যাক্সিলরোমিটার এবং ম্যাগনেটোমিটার সমর্থন করে। অন্যান্য সেন্সর পরীক্ষার জন্য একটি ফিজিক্যাল ডিভাইস প্রয়োজন। Android 12 থেকে শুরু করে, অ্যাপ্লিকেশনগুলিকে ম্যানিফেস্টে সেন্সর ব্যবহার ঘোষণা করতে হবে।
Android সমস্ত সেন্সরকে তিনটি ক্যাটাগরিতে শ্রেণীবদ্ধ করে: Motion, Position এবং Environment। Motion সেন্সর অ্যাক্সিলরোমিটার, জাইরোস্কোপ এবং স্টেপ কাউন্টার অন্তর্ভুক্ত। Position সেন্সর ম্যাগনেটোমিটার এবং ওরিয়েন্টেশন অন্তর্ভুক্ত। Environment সেন্সর আলো, চাপ, তাপমাত্রা এবং আর্দ্রতা অন্তর্ভুক্ত।
| ক্যাটাগরি | সেন্সর | প্রকার (ধ্রুবক) | ফিজিক্যাল/ভার্চুয়াল |
|---|---|---|---|
| Motion | অ্যাক্সিলরোমিটার | TYPE_ACCELEROMETER | ফিজিক্যাল |
| Motion | জাইরোস্কোপ | TYPE_GYROSCOPE | ফিজিক্যাল |
| Motion | স্টেপ কাউন্টার | TYPE_STEP_COUNTER | ফিজিক্যাল |
| Motion | Gravity | TYPE_GRAVITY | ভার্চুয়াল |
| Position | ম্যাগনেটোমিটার | TYPE_MAGNETIC_FIELD | ফিজিক্যাল |
| Position | Rotation Vector | TYPE_ROTATION_VECTOR | ভার্চুয়াল |
| Environment | আলো | TYPE_LIGHT | ফিজিক্যাল |
| Environment | চাপ | TYPE_PRESSURE | ফিজিক্যাল |
অ্যাক্সিলরোমিটার তিনটি অক্ষ — X, Y এবং Z বরাবর m/s² এ ত্বরণ পরিমাপ করে। মানগুলিতে মাধ্যাকর্ষণ অন্তর্ভুক্ত রয়েছে (স্থির অবস্থায় Z অক্ষ বরাবর 9.8 m/s²)। জাইরোস্কোপ rad/s — এ কৌণিক বেগ পরিমাপ করে, প্রতিটি অক্ষের চারপাশে ডিভাইসের ঘূর্ণন গতি। এই দুটি সেন্সরের সংমিশ্রণ নেভিগেশন, গেম এবং AR অ্যাপ্লিকেশনে ব্যবহৃত হয়।
class SensorActivity : Activity(), SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
textView.text = "X: $x, Y: $y, Z: $z"
}
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}
ম্যাগনেটোমিটার (TYPE_MAGNETIC_FIELD) তিনটি অক্ষ বরাবর মাইক্রোটেসলা (µT) এ চৌম্বক ক্ষেত্র পরিমাপ করে। এটি একটি ডিজিটাল কম্পাস হিসাবে ব্যবহৃত হয় — অ্যাক্সিলরোমিটারের সাথে মিলিত হয়ে, এটি ডিভাইসের আজিমুথ নির্ধারণ করে। Rotation Vector একটি ভার্চুয়াল সেন্সর যা সঠিক ওরিয়েন্টেশন নির্ধারণের জন্য জাইরোস্কোপ, অ্যাক্সিলরোমিটার এবং ম্যাগনেটোমিটার থেকে ডেটা ফিউজ করে।
আলো সেন্সর (TYPE_LIGHT) lux (lx) এ পরিবেষ্টিত আলোর মাত্রা পরিমাপ করে। এটি স্বয়ংক্রিয় স্ক্রিন উজ্জ্বলতা সমন্বয়ের জন্য ব্যবহৃত হয়। চাপ সেন্সর (TYPE_PRESSURE) হেক্টোপাস্কাল (hPa) এ বায়ুমণ্ডলীয় চাপ পরিমাপ করে — সমুদ্রপৃষ্ঠ থেকে উচ্চতা নির্ধারণের জন্য নেভিগেশন অ্যাপ্লিকেশনে ব্যবহৃত হয়।
Sensors API ক্লায়েন্ট-সার্ভার আর্কিটেকচারের উপর নির্মিত। অ্যাপ্লিকেশন ক্লায়েন্ট হিসাবে কাজ করে, এবং SensorManager Android সিস্টেম সার্ভিস হিসাবে কাজ করে। যখন অ্যাপ্লিকেশন registerListener এর মাধ্যমে একটি শ্রোতা নিবন্ধন করে, SensorManager HAL (Hardware Abstraction Layer) — Linux কার্নেল স্তরে চলমান নিম্ন-স্তরের সেন্সর ড্রাইভারের সাথে যোগাযোগ করে।
HAL ড্রাইভার হার্ডওয়্যার চিপ থেকে কাঁচা ডেটা গ্রহণ করে, শব্দ ফিল্টার করে এবং এটিকে স্ট্যাকের উপরে — SensorService (সিস্টেম প্রক্রিয়া) এর মাধ্যমে অ্যাপ্লিকেশনে পাঠায়। ডেটা একটি SensorEvent অবজেক্ট হিসাবে পাস করা হয় যাতে float মানের একটি অ্যারে values এবং ন্যানোসেকেন্ডে একটি টাইমস্ট্যাম্প থাকে। ইভেন্ট রেট নির্বাচিত ডেলিভারি মোডের উপর নির্ভর করে।
শ্রোতা নিবন্ধন করার সময়, ডেভেলপার কনস্ট্যান্ট SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms) এবং SENSOR_DELAY_FASTEST (0 ms — সর্বোচ্চ রেট) ব্যবহার করে ইভেন্টের মধ্যে পছন্দসই বিলম্ব নির্দিষ্ট করে। প্রকৃত রেট ভিন্ন হতে পারে — সিস্টেম পাওয়ার খরচ অপ্টিমাইজ করে।
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(
this,
sensor,
SensorManager.SENSOR_DELAY_GAME
)
Android 2.3 থেকে শুরু করে, সেন্সর ব্যাচ মোড সমর্থন করে — ইভেন্টগুলি FIFO বাফারে জমা হয় এবং একটি ব্যাচে বিতরণ করা হয়। এটি প্রসেসরকে আরও বেশি সময় স্লিপ মোডে থাকতে দেয়, পাওয়ার খরচ 60% পর্যন্ত কমিয়ে দেয়। বাফারের আকার সেন্সর চিপের উপর নির্ভর করে এবং Sensor.fifoMaxEventCount ফিল্ডে নির্দিষ্ট করা হয়।
SensorManager একটি সিস্টেম সার্ভিস যা getSystemService(Context.SENSOR_SERVICE) এর মাধ্যমে উপলব্ধ। এটি সেন্সরের তালিকা পাওয়ার, একটি নির্দিষ্ট ডিফল্ট সেন্সর পাওয়ার এবং শ্রোতা নিবন্ধন/নিবন্ধন বাতিল করার পদ্ধতি প্রদান করে। SensorManager একটি সিঙ্গেলটন — পুরো অ্যাপ্লিকেশনের জন্য একটি ইনস্ট্যান্স।
সেন্সর ব্যবহার করার আগে, আপনাকে এর উপলব্ধতা পরীক্ষা করতে হবে। getDefaultSensor(type) পদ্ধতি null ফেরত দেয় যদি সেন্সর ডিভাইসে উপস্থিত না থাকে। পরীক্ষা ছাড়া null পাওয়া শ্রোতা নিবন্ধন করার সময় NullPointerException ঘটাবে। getSensorList(type) পদ্ধতি সমস্ত সেন্সরের একটি তালিকা ফেরত দেয়।
fun checkSensorAvailability(type: Int): Boolean {
val sensorManager =
getSystemService(Context.SENSOR_SERVICE) as SensorManager
return sensorManager.getDefaultSensor(type) != null
}
// ব্যবহার:
if (checkSensorAvailability(Sensor.TYPE_GYROSCOPE)) {
Log.d("সেন্সর", "জাইরোস্কোপ উপলব্ধ")
}
registerListener(listener, sensor, delay) এর মাধ্যমে একটি শ্রোতা নিবন্ধিত হয়। গুরুত্বপূর্ণ: onPause() পদ্ধতিতে unregisterListener(listener) এর মাধ্যমে আপনাকে শ্রোতার নিবন্ধন বাতিল করতে হবে। যদি তা না করা হয়, অ্যাপ্লিকেশন সেন্সর ইভেন্ট গ্রহণ করতে থাকবে, ব্যাকগ্রাউন্ডেও ব্যাটারি শেষ করবে। Android 8+ নিবন্ধনবিহীন শ্রোতা সম্পর্কে logcat এ একটি সতর্কতা দেখায়।
onAccuracyChanged(sensor, accuracy) পদ্ধতি কল করা হয় যখন সেন্সরের নির্ভুলতা পরিবর্তিত হয়। মান: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW এবং UNRELIABLE। UNRELIABLE পাওয়ার পর, নির্ভুলতা পুনরুদ্ধার না হওয়া পর্যন্ত সেন্সর ডেটা উপেক্ষা করা উচিত। উদাহরণস্বরূপ, ম্যাগনেটোমিটারের ক্যালিব্রেশন প্রয়োজন — ডিভাইসটিকে আটের আকারে নাড়ানো।
আসুন Kotlin এর সাথে Android অ্যাপ্লিকেশনে Sensors API ব্যবহারের ব্যবহারিক উদাহরণ দেখি। প্রথম উদাহরণ — অ্যাক্সিলরোমিটার ব্যবহার করে স্ক্রিন ওরিয়েন্টেশন নির্ধারণ করা। দ্বিতীয় — ক্যালিব্রেশন সহ ম্যাগনেটোমিটার ডেটা পড়া। তৃতীয় — স্টেপ কাউন্টার ব্যবহার করে স্টেপ ডিটেক্টর।
ওরিয়েন্টেশন নির্ধারণের জন্য অ্যাক্সিলরোমিটার এবং ম্যাগনেটোমিটারের সংমিশ্রণ ব্যবহার করা হয়। SensorManager.getRotationMatrix() পদ্ধতি রোটেশন ম্যাট্রিক্স গণনা করে, এবং getOrientation() pitch, roll এবং azimuth কোণ বের করে। Azimuth (আজিমুথ) — রেডিয়ানে চৌম্বক উত্তরের সাপেক্ষে কোণ।
val gravity = FloatArray(3)
val geomagnetic = FloatArray(3)
val rotationMatrix = FloatArray(9)
val orientation = FloatArray(3)
SensorManager.getRotationMatrix(
rotationMatrix, null, gravity, geomagnetic
)
SensorManager.getOrientation(rotationMatrix, orientation)
// orientation[0] — azimuth, [1] — pitch, [2] — roll
val azimuthDeg = Math.toDegrees(orientation[0].toDouble())
স্টেপ কাউন্টার (TYPE_STEP_COUNTER) শেষ ডিভাইস রিবুটের পর থেকে ব্যবহারকারীর করা মোট পদক্ষেপের সংখ্যা ফেরত দেয়। সেন্সর হার্ডওয়্যার স্তরে কাজ করে — এটি সক্রিয় থাকে এমনকি যখন অ্যাপ্লিকেশন চলছে না। প্রতি সেশনে পদক্ষেপ পেতে, আপনাকে প্রাথমিক মান সংরক্ষণ করতে এবং পার্থক্য গণনা করতে হবে।
var initialSteps = 0
var isInitialized = false
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_STEP_COUNTER) {
if (!isInitialized) {
initialSteps = event.values[0].toInt()
isInitialized = true
}
val currentSteps = event.values[0].toInt()
val sessionSteps = currentSteps - initialSteps
Log.d("পদক্ষেপ", "প্রতি সেশনে পদক্ষেপ: $sessionSteps")
}
}
আলো সেন্সর পরিবেশগত অবস্থার সাথে ইন্টারফেস মানিয়ে নেওয়ার অনুমতি দেয়। কম আলোতে (10 lx এর কম), আপনি ডার্ক মোডে সুইচ করতে পারেন। উজ্জ্বল সূর্যালোকে (10000 lx এর বেশি), আপনি কনট্রাস্ট বাড়াতে পারেন। শব্দ ফিল্টারিংয়ের জন্য শেষ 5 মানের মুভিং এভারেজ ব্যবহার করা হয়।
Android বেশ কয়েকটি ভার্চুয়াল সেন্সর প্রদান করে যার সরাসরি হার্ডওয়্যার সমতুল্য নেই। একটি ভার্চুয়াল সেন্সর ফিজিক্যাল সেন্সরের সংমিশ্রণের উপর ভিত্তি করে তার রিডিং গণনা করে। এটি ডেভেলপারের বোঝা কমায় — সিস্টেম নিজেই ডেটা ফিউশন অ্যালগরিদম প্রয়োগ করে।
Gravity (TYPE_GRAVITY) সেন্সর লো-পাস ফিল্টার ব্যবহার করে অ্যাক্সিলরোমিটার রিডিং থেকে মাধ্যাকর্ষণ উপাদান বের করে। Linear Acceleration (TYPE_LINEAR_ACCELERATION), বিপরীতে, মাধ্যাকর্ষণ সরিয়ে দেয় এবং শুধুমাত্র ডিভাইসের রৈখিক ত্বরণ রাখে। Gravity এবং Linear Acceleration এর যোগফল কাঁচা অ্যাক্সিলরোমিটার রিডিং দেয়।
Rotation Vector — সবচেয়ে জটিল ভার্চুয়াল সেন্সর। এটি জাইরোস্কোপ (উচ্চ-ফ্রিকোয়েন্সি পরিবর্তন), অ্যাক্সিলরোমিটার (মাধ্যাকর্ষণ ভেক্টর) এবং ম্যাগনেটোমিটার (উত্তরের সাপেক্ষে ওরিয়েন্টেশন) থেকে ডেটা একত্রিত করে। ফলাফল হল একটি কোয়াটারনিয়ন যা মহাকাশে ডিভাইসের সম্পূর্ণ ওরিয়েন্টেশন বর্ণনা করে। এটি AR অ্যাপ্লিকেশন এবং VR হেডসেটে ব্যবহৃত হয়।
Game Rotation Vector — ম্যাগনেটোমিটার ব্যবহার না করে Rotation Vector এর একটি সরলীকৃত সংস্করণ। এটি কম আজিমুথ নির্ভুলতা দেয় তবে উচ্চ আপডেট রেট এবং স্থিতিশীলতা দেয়। এটি গেমের জন্য সুপারিশ করা হয় যেখানে উত্তরের সাপেক্ষে সম্পূর্ণ ওরিয়েন্টেশনের চেয়ে কম লেটেন্সি গুরুত্বপূর্ণ।
সেন্সর ডিভাইসের সবচেয়ে শক্তি-সাশ্রয়ী উপাদানগুলির মধ্যে একটি। সর্বোচ্চ পোলিং রেটে অ্যাক্সিলরোমিটার এবং জাইরোস্কোপ 3–4 ঘন্টা একটানা অপারেশনে ব্যাটারি শেষ করতে পারে। সেন্সর ব্যবহার অপ্টিমাইজ করা Sensors API ব্যবহার করে যেকোনো অ্যাপ্লিকেশনের জন্য একটি গুরুত্বপূর্ণ কাজ।
প্রয়োজন ছাড়া SENSOR_DELAY_FASTEST ব্যবহার করবেন না। UI অ্যানিমেশনের জন্য, SENSOR_DELAY_UI (60 ms) যথেষ্ট। স্ক্রিন ওরিয়েন্টেশন ডিটেকশনের জন্য — SENSOR_DELAY_NORMAL (200 ms)। রেট যত বেশি হবে, প্রসেসর তত বেশি সময় সক্রিয় অবস্থায় কাটায়। NORMAL এবং FASTEST এর মধ্যে পাওয়ার খরচে 10x পর্যন্ত পার্থক্য রয়েছে।
Android 8.0 (API 26) থেকে শুরু করে, ব্যাকগ্রাউন্ড অ্যাপ্লিকেশন কম হারে সেন্সর ইভেন্ট পায়। Android 12+ এ, Motion এবং Position সেন্সরে ব্যাকগ্রাউন্ড অ্যাক্সেসের জন্য BODY_SENSORS_BACKGROUND অনুমতি প্রয়োজন। অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে গেলে শ্রোতার নিবন্ধন বাতিল করুন — এটি ডিভাইসের ব্যাটারি লাইফ বাড়ায়।
registerListener(listener, sensor, delay, maxReportLatencyUs) পদ্ধতির মাধ্যমে ব্যাচ প্রসেসিং ব্যবহার করুন। maxReportLatencyUs প্যারামিটার মাইক্রোসেকেন্ডে সর্বোচ্চ ইভেন্ট ডেলিভারি লেটেন্সি সেট করে। 1000000 (1 সেকেন্ড) মান সহ, ইভেন্টগুলি সেন্সরের FIFO বাফারে জমা হয় এবং প্রতি সেকেন্ডে একবার বিতরণ করা হয় — প্রসেসর কম ঘন ঘন জাগে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
ন্যূনতম সেট হল একটি অ্যাক্সিলরোমিটার এবং ম্যাগনেটোমিটার। এই দুটি সেন্সর 95% এরও বেশি ডিভাইসে উপস্থিত রয়েছে। জাইরোস্কোপ, আলো সেন্সর এবং প্রক্সিমিটি সেন্সর — 70–80% আধুনিক মডেলে। অন্যান্য সেন্সর (চাপ, তাপমাত্রা, আর্দ্রতা, স্টেপ কাউন্টার) কম সাধারণ এবং ডিভাইসের মূল্য বিভাগের উপর নির্ভর করে।
TYPE_ACCELEROMETER মাধ্যাকর্ষণ সহ সম্পূর্ণ ত্বরণ ফেরত দেয় (9.8 m/s²)। TYPE_LINEAR_ACCELERATION মাধ্যাকর্ষণ বাদ দিয়ে ত্বরণ ফেরত দেয় — শুধুমাত্র ডিভাইসের গতির ত্বরণ। যদি ডিভাইসটি স্থির থাকে, অ্যাক্সিলরোমিটার Z অক্ষ বরাবর 9.8 m/s² দেখাবে, যখন Linear Acceleration সব অক্ষে 0 দেখাবে।
উপযুক্ত কনস্ট্যান্ট সহ getPackageManager().hasSystemFeature() ব্যবহার করুন: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY এবং অন্যান্য। একটি বিকল্প উপায় হল getDefaultSensor(type) কল করা এবং null এর জন্য ফলাফল পরীক্ষা করা। প্রথম পদ্ধতিটি ইনিশিয়ালাইজেশনের সময় পরীক্ষার জন্য ভাল।
সেন্সর থেকে কাঁচা ডেটাতে শব্দ থাকে। মসৃণ করার জন্য, একটি লো-পাস ফিল্টার ব্যবহার করুন: newValue = alpha * rawValue + (1 — alpha) * previousValue। 0.1–0.3 এর alpha সহগ প্রতিক্রিয়া এবং মসৃণতার মধ্যে একটি ভাল ভারসাম্য প্রদান করে। জাইরোস্কোপের জন্য, শূন্য ড্রিফট অপসারণের জন্য একটি হাই-পাস ফিল্টারও প্রয়োগ করা হয়।
হ্যাঁ, কিন্তু সীমাবদ্ধতা সহ। Android 8.0 থেকে শুরু করে, ব্যাকগ্রাউন্ড অ্যাপ্লিকেশনের জন্য সেন্সর ইভেন্ট রেট হ্রাস পায়। Android 12 থেকে শুরু করে, ব্যাকগ্রাউন্ড সেন্সর অ্যাক্সেসের জন্য BODY_SENSORS_BACKGROUND অনুমতি প্রয়োজন। ব্যাকগ্রাউন্ড কাজের জন্য, একটি নোটিফিকেশন সহ Foreground Service ব্যবহার করার পরামর্শ দেওয়া হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন