পজিশন সেন্সর

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

মনে রাখবেন: Android 2.2 (API লেভেল ৮)-এ ওরিয়েন্টেশন সেন্সর এবং Android 4.4W (API লেভেল ২০)-এ ওরিয়েন্টেশন সেন্সরের ধরন বন্ধ করে দেওয়া হয়েছে।

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

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

টেবিল ১. Android প্ল্যাটফর্মে কাজ করে এমন পজিশন সেন্সর।

সেন্সর সেন্সর ইভেন্ট ডেটা বর্ণনা পরিমাপের ইউনিট
TYPE_GAME_ROTATION_VECTOR SensorEvent.values[0] x অক্ষ বরাবর রোটেশন ভেক্টর কম্পোনেন্ট (x * sin(θ/2))। ইউনিট ছাড়া
SensorEvent.values[1] y অক্ষ বরাবর রোটেশন ভেক্টর কম্পোনেন্ট (y * sin(θ/2))।
SensorEvent.values[2] z অক্ষ বরাবর রোটেশন ভেক্টর কম্পোনেন্ট (z * sin(θ/2))।
TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values[0] x অক্ষ বরাবর রোটেশন ভেক্টর কম্পোনেন্ট (x * sin(θ/2))। ইউনিট ছাড়া
SensorEvent.values[1] y অক্ষ বরাবর রোটেশন ভেক্টর কম্পোনেন্ট (y * sin(θ/2))।
SensorEvent.values[2] z অক্ষ বরাবর রোটেশন ভেক্টর কম্পোনেন্ট (z * sin(θ/2))।
TYPE_MAGNETIC_FIELD SensorEvent.values[0] x অক্ষ বরাবর ভূচৌম্বকীয় ক্ষেত্রের শক্তি। μT
SensorEvent.values[1] Y অক্ষ বরাবর ভূচুম্বকীয় ক্ষেত্রের শক্তি।
SensorEvent.values[2] z অক্ষ বরাবর ভূচৌম্বকীয় ক্ষেত্রের তীব্রতা।
TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values[0] x অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি (হার্ড আয়রন ক্যালিব্রেশন ছাড়া)। μT
SensorEvent.values[1] y অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি (হার্ড আয়রন ক্যালিব্রেশন ছাড়া)।
SensorEvent.values[2] z অক্ষ বরাবর ভূচৌম্বকীয় ক্ষেত্রের শক্তি (হার্ড আয়রন ক্যালিব্রেশন ছাড়া)।
SensorEvent.values[3] x অক্ষ বরাবর আয়রন বায়াস অনুমান।
SensorEvent.values[4] y অক্ষ বরাবর আয়রন বায়াস অনুমান।
SensorEvent.values[5] z অক্ষ বরাবর আয়রন বায়াস অনুমান।
TYPE_ORIENTATION১ SensorEvent.values[0] অ্যাজিমুথ (z-অ্যাক্সিসের চারপাশে কোণ)। ডিগ্রি
SensorEvent.values[1] পিচ (x-অ্যাক্সিসের চারপাশে কোণ)।
SensorEvent.values[2] রোল (y-অক্ষের চারপাশে কোণ)।
TYPE_PROXIMITY SensorEvent.values[0] অবজেক্ট থেকে দূরত্ব।২ সেমি

১এই সেন্সর Android 2.2 (API লেভেল ৮) থেকে বন্ধ করে দেওয়া হয়েছে এবং এই সেন্সরের ধরন Android 4.4W (API লেভেল ২০) থেকে বন্ধ করে দেওয়া হয়েছে। সেন্সর ফ্রেমওয়ার্ক ডিভাইসের ওরিয়েন্টেশন পাওয়ার জন্য বিকল্প পদ্ধতি প্রদান করে, যা ডিভাইসের ওরিয়েন্টেশন গণনা করুন-এ আলোচনা করা হয়েছে।

২ কিছু প্রক্সিমিটি সেন্সর শুধু বাইনারি ভ্যালু প্রদান করে যা কাছে ও দূরে বোঝায়।

গেম রোটেশন ভেক্টর সেন্সর ব্যবহার করুন

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

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

নিচের কোড থেকে আপনি জানতে পারবেন যে ডিফল্ট গেম রোটেশন ভেক্টর সেন্সরের ইনস্ট্যান্স কীভাবে পাবেন:

Kotlin

private lateinit var sensorManager: SensorManager
private var sensor: Sensor? = null
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR)

জাভা

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);

জিওম্যাগনেটিক রোটেশন ভেক্টর সেন্সর ব্যবহার করুন

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

নিচের কোড থেকে আপনি জানতে পারবেন যে কীভাবে ডিফল্ট জিওম্যাগনেটিক রোটেশন ভেক্টর সেন্সরের ইনস্ট্যান্স পাওয়া যায়:

Kotlin

private lateinit var sensorManager: SensorManager
private var sensor: Sensor? = null
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)

জাভা

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);

ডিভাইসের ওরিয়েন্টেশন গণনা করুন

ডিভাইসের ওরিয়েন্টেশন গণনা করে, আপনি পৃথিবীর ফ্রেম অফ রেফারেন্সের (বিশেষ করে, চৌম্বকীয় উত্তর মেরু) সাপেক্ষে ডিভাইসের অবস্থান মনিটর করতে পারবেন। নিম্নলিখিত কোড থেকে আপনি জানতে পারবেন যে কীভাবে ডিভাইসের ওরিয়েন্টেশন গণনা করতে হয়:

Kotlin

private lateinit var sensorManager: SensorManager
...
// Rotation matrix based on current readings from accelerometer and magnetometer.
val rotationMatrix = FloatArray(9)
SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading)

// Express the updated rotation matrix as three orientation angles.
val orientationAngles = FloatArray(3)
SensorManager.getOrientation(rotationMatrix, orientationAngles)

জাভা

private SensorManager sensorManager;
...
// Rotation matrix based on current readings from accelerometer and magnetometer.
final float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null,
    accelerometerReading, magnetometerReading);

// Express the updated rotation matrix as three orientation angles.
final float[] orientationAngles = new float[3];
SensorManager.getOrientation(rotationMatrix, orientationAngles);

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

  • অ্যাজিমুথ (-z অক্ষের সাপেক্ষে ঘূর্ণনের ডিগ্রি)। এটি হল ডিভাইসের বর্তমান কম্পাসের দিক এবং চৌম্বকীয় উত্তরের মধ্যবর্তী কোণ। ডিভাইসের উপরের প্রান্তটি চৌম্বকীয় উত্তর দিকে মুখ করে থাকলে, অ্যাজিমুথ হল ০ ডিগ্রি; উপরের প্রান্তটি দক্ষিণ দিকে মুখ করে থাকলে, অ্যাজিমুথ হল ১৮০ ডিগ্রি। একইভাবে, উপরের প্রান্ত পূর্ব দিকে মুখ করে থাকলে, অ্যাজিমুথ ৯০ ডিগ্রি এবং উপরের প্রান্ত পশ্চিম দিকে মুখ করে থাকলে, অ্যাজিমুথ ২৭০ ডিগ্রি হয়।
  • পিচ (x অক্ষের সাপেক্ষে ঘূর্ণনের ডিগ্রি)। এটি হল ডিভাইসের স্ক্রিনের সমান্তরাল একটি তল এবং মাটির সমান্তরাল একটি তলের মধ্যবর্তী কোণ। আপনি যদি ডিভাইসটি মাটির সমান্তরালে ধরে রাখেন এবং নিচের প্রান্তটি আপনার সবচেয়ে কাছাকাছি থাকে এবং ডিভাইসের উপরের প্রান্তটি মাটির দিকে কাত করেন, তাহলে পিচ অ্যাঙ্গেল পজিটিভ হয়ে যায়। বিপরীত দিকে টিল্ট করলে— ডিভাইসের উপরের প্রান্ত মাটি থেকে দূরে সরিয়ে নিয়ে গেলে— পিচ অ্যাঙ্গেল নেগেটিভ হয়ে যায়। ভ্যালুর রেঞ্জ হল -৯০ ডিগ্রি থেকে ৯০ ডিগ্রি।
  • রোল (y অক্ষের সাপেক্ষে ঘূর্ণনের ডিগ্রি)। এটি হল ডিভাইসের স্ক্রিনের সাথে লম্বভাবে থাকা একটি প্লেন এবং মাটির সাথে লম্বভাবে থাকা একটি প্লেনের মধ্যেকার কোণ। আপনি যদি ডিভাইসটি মাটির সমান্তরালে ধরে রাখেন এবং নিচের প্রান্তটি আপনার সবচেয়ে কাছাকাছি থাকে এবং ডিভাইসের বাম প্রান্তটি মাটির দিকে ঝুঁকে থাকে, তাহলে রোল অ্যাঙ্গেল পজিটিভ হয়। বিপরীত দিকে কাত করলে— ডিভাইসের ডানদিকের প্রান্ত মাটির দিকে সরালে— রোল অ্যাঙ্গেল নেগেটিভ হয়ে যায়। ভ্যালুর রেঞ্জ হল -১৮০ ডিগ্রি থেকে ১৮০ ডিগ্রি।

মনে রাখবেন:জিওসেন্সর ইকোসিস্টেমে বেশিরভাগ ইমপ্লিমেন্টেশন দেখানোর জন্য সেন্সরের রোলের সংজ্ঞা পরিবর্তন করা হয়েছে।

মনে রাখবেন যে এই কোণগুলি বিমান চালনায় ব্যবহৃত (ইয়া, পিচ ও রোলের জন্য) কোঅর্ডিনেট সিস্টেমের থেকে আলাদা কোঅর্ডিনেট সিস্টেমে কাজ করে। বিমান চালনা সিস্টেমে, x অক্ষটি বিমানের দীর্ঘ দিক বরাবর, লেজ থেকে নাক পর্যন্ত।

অ্যাকসেলেরোমিটার ও জিওম্যাগনেটিক ফিল্ড সেন্সর থেকে পাওয়া র' সেন্সর ডেটা প্রসেস করে ওরিয়েন্টেশন সেন্সর তার ডেটা পায়। প্রচুর প্রসেসিংয়ের প্রয়োজন হয় বলে, ওরিয়েন্টেশন সেন্সরের অ্যাকুরেসি ও প্রিসিশন কমে যায়। বিশেষ করে, এই সেন্সরটি তখনই নির্ভরযোগ্য যখন রোল অ্যাঙ্গেল ০ হয়। এর ফলে, Android 2.2 (API লেভেল ৮)-এ ওরিয়েন্টেশন সেন্সর এবং Android 4.4W (API লেভেল ২০)-এ ওরিয়েন্টেশন সেন্সরের ধরন বন্ধ করে দেওয়া হয়েছে। ওরিয়েন্টেশন সেন্সর থেকে পাওয়া র ডেটা ব্যবহার করার পরিবর্তে, আমরা সাজেস্ট করি যে আপনি getRotationMatrix() পদ্ধতিটি getOrientation() পদ্ধতির সাথে ব্যবহার করে ওরিয়েন্টেশন ভ্যালু গণনা করুন, যেমনটি নিম্নলিখিত কোড স্যাম্পেলে দেখানো হয়েছে। এই প্রসেসের অংশ হিসেবে, আপনি remapCoordinateSystem() পদ্ধতি ব্যবহার করে আপনার অ্যাপ্লিকেশনের ফ্রেম অফ রেফারেন্সে ওরিয়েন্টেশন ভ্যালু অনুবাদ করতে পারবেন।

Kotlin

class SensorActivity : Activity(), SensorEventListener {

    private lateinit var sensorManager: SensorManager
    private val accelerometerReading = FloatArray(3)
    private val magnetometerReading = FloatArray(3)

    private val rotationMatrix = FloatArray(9)
    private val orientationAngles = FloatArray(3)

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
    }

    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
        // Do something here if sensor accuracy changes.
        // You must implement this callback in your code.
    }

    override fun onResume() {
        super.onResume()

        // Get updates from the accelerometer and magnetometer at a constant rate.
        // To make batch operations more efficient and reduce power consumption,
        // provide support for delaying updates to the application.
        //
        // In this example, the sensor reporting delay is small enough such that
        // the application receives an update before the system checks the sensor
        // readings again.
        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer ->
            sensorManager.registerListener(
                    this,
                    accelerometer,
                    SensorManager.SENSOR_DELAY_NORMAL,
                    SensorManager.SENSOR_DELAY_UI
            )
        }
        sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField ->
            sensorManager.registerListener(
                    this,
                    magneticField,
                    SensorManager.SENSOR_DELAY_NORMAL,
                    SensorManager.SENSOR_DELAY_UI
            )
        }
    }

    override fun onPause() {
        super.onPause()

        // Don't receive any more updates from either sensor.
        sensorManager.unregisterListener(this)
    }

    // Get readings from accelerometer and magnetometer. To simplify calculations,
    // consider storing these readings as unit vectors.
    override fun onSensorChanged(event: SensorEvent) {
        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
            System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size)
        } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
            System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size)
        }
    }

    // Compute the three orientation angles based on the most recent readings from
    // the device's accelerometer and magnetometer.
    fun updateOrientationAngles() {
        // Update rotation matrix, which is needed to update orientation angles.
        SensorManager.getRotationMatrix(
                rotationMatrix,
                null,
                accelerometerReading,
                magnetometerReading
        )

        // "rotationMatrix" now has up-to-date information.

        SensorManager.getOrientation(rotationMatrix, orientationAngles)

        // "orientationAngles" now has up-to-date information.
    }
}

জাভা

public class SensorActivity extends Activity implements SensorEventListener {

    private SensorManager sensorManager;
    private final float[] accelerometerReading = new float[3];
    private final float[] magnetometerReading = new float[3];

    private final float[] rotationMatrix = new float[9];
    private final float[] orientationAngles = new float[3];

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
        // You must implement this callback in your code.
    }

    @Override
    protected void onResume() {
        super.onResume();

        // Get updates from the accelerometer and magnetometer at a constant rate.
        // To make batch operations more efficient and reduce power consumption,
        // provide support for delaying updates to the application.
        //
        // In this example, the sensor reporting delay is small enough such that
        // the application receives an update before the system checks the sensor
        // readings again.
        Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        if (accelerometer != null) {
            sensorManager.registerListener(this, accelerometer,
                SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI);
        }
        Sensor magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        if (magneticField != null) {
            sensorManager.registerListener(this, magneticField,
                SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        // Don't receive any more updates from either sensor.
        sensorManager.unregisterListener(this);
    }

    // Get readings from accelerometer and magnetometer. To simplify calculations,
    // consider storing these readings as unit vectors.
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
          System.arraycopy(event.values, 0, accelerometerReading,
              0, accelerometerReading.length);
        } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            System.arraycopy(event.values, 0, magnetometerReading,
                0, magnetometerReading.length);
        }
    }

    // Compute the three orientation angles based on the most recent readings from
    // the device's accelerometer and magnetometer.
    public void updateOrientationAngles() {
        // Update rotation matrix, which is needed to update orientation angles.
        SensorManager.getRotationMatrix(rotationMatrix, null,
            accelerometerReading, magnetometerReading);

        // "rotationMatrix" now has up-to-date information.

        SensorManager.getOrientation(rotationMatrix, orientationAngles);

        // "orientationAngles" now has up-to-date information.
    }
}

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

জিওম্যাগনেটিক ফিল্ড সেন্সর ব্যবহার করুন

জিওম্যাগনেটিক ফিল্ড সেন্সর আপনাকে পৃথিবীর চৌম্বকীয় ক্ষেত্রের পরিবর্তনগুলি পর্যবেক্ষণ করতে দেয়। নিম্নলিখিত কোড থেকে আপনি জানতে পারবেন যে কীভাবে ডিফল্ট জিওম্যাগনেটিক ফিল্ড সেন্সরের ইনস্ট্যান্স পাবেন:

Kotlin

private lateinit var sensorManager: SensorManager
private var sensor: Sensor? = null
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)

জাভা

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

মনে রাখবেন: আপনার অ্যাপ Android 12 (API লেভেল 31) বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে, এই সেন্সর রেট-সীমিত হয়।

এই সেন্সর তিনটি কোঅর্ডিনেট অক্ষের প্রতিটির জন্য র ফিল্ড স্ট্রেন্থ ডেটা (μT-তে) প্রদান করে। সাধারণত, আপনাকে সরাসরি এই সেন্সর ব্যবহার করতে হয় না। পরিবর্তে, আপনি রোটেশন ভেক্টর সেন্সর ব্যবহার করে রোটেশনাল মুভমেন্ট নির্ধারণ করতে পারেন অথবা অ্যাকসিলরোমিটার ও জিওম্যাগনেটিক ফিল্ড সেন্সর getRotationMatrix() পদ্ধতির সাথে ব্যবহার করে রোটেশন ম্যাট্রিক্স ও ইনক্লিনেশন ম্যাট্রিক্স পেতে পারেন। তারপর আপনি অ্যাজিমুথ এবং ভূচৌম্বকীয় ইনক্লিনেশন ডেটা পেতে getOrientation() এবং getInclination() পদ্ধতির সাথে এই ম্যাট্রিক্সগুলি ব্যবহার করতে পারেন।

মনে রাখবেন: আপনার অ্যাপ পরীক্ষা করার সময়, আপনি ডিভাইসটিকে ৮-এর আকারে ঘুরিয়ে সেন্সরের নির্ভুলতা উন্নত করতে পারেন।

ক্যালিব্রেট না করা ম্যাগনেটোমিটার ব্যবহার করুন

আনক্যালিব্রেটেড ম্যাগনেটোমিটার জিওম্যাগনেটিক ফিল্ড সেন্সর-এর মতোই, তবে ম্যাগনেটিক ফিল্ডে কোনও হার্ড আয়রন ক্যালিব্রেশন প্রয়োগ করা হয় না। ফ্যাক্টরি ক্যালিব্রেশন এবং তাপমাত্রা ক্ষতিপূরণ এখনও চৌম্বকীয় ফিল্ডে প্রয়োগ করা হয়। খারাপ হার্ড আয়রন অনুমান ম্যানেজ করার জন্য ক্যালিব্রেট না করা ম্যাগনেটোমিটার উপযোগী। সাধারণত, geomagneticsensor_event.values[0] uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_event.values[3]-এর কাছাকাছি হবে। অর্থাৎ,

calibrated_x ~= uncalibrated_x - bias_estimate_x

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

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

Kotlin

private lateinit var sensorManager: SensorManager
private var sensor: Sensor? = null
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED)

জাভা

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);

প্রক্সিমিটি সেন্সর ব্যবহার করুন

প্রক্সিমিটি সেন্সর আপনাকে কোনও অবজেক্ট ডিভাইস থেকে কত দূরে আছে তা নির্ধারণ করতে দেয়। নিম্নলিখিত কোড থেকে আপনি জানতে পারবেন যে কীভাবে ডিফল্ট প্রক্সিমিটি সেন্সরের ইনস্ট্যান্স পাবেন:

Kotlin

private lateinit var sensorManager: SensorManager
private var sensor: Sensor? = null
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)

জাভা

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

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

মনে রাখবেন: কিছু ডিভাইস মডেলে, প্রক্সিমিটি সেন্সর স্ক্রিনের নিচে থাকে, যার ফলে স্ক্রিন চালু থাকা অবস্থায় এটি চালু করলে স্ক্রিনে একটি ব্লিংক করা ডট দেখা যেতে পারে।

প্রক্সিমিটি সেন্সর কীভাবে ব্যবহার করতে হয় তা নিম্নলিখিত কোড থেকে জানতে পারবেন:

Kotlin

class SensorActivity : Activity(), SensorEventListener {

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

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

        // Get an instance of the sensor service, and use that to get an instance of
        // a particular sensor.
        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
    }

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

    override fun onSensorChanged(event: SensorEvent) {
        val distance = event.values[0]
        // Do something with this sensor data.
    }

    override fun onResume() {
        // Register a listener for the sensor.
        super.onResume()

        proximity?.also { proximity ->
            sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL)
        }
    }

    override fun onPause() {
        // Be sure to unregister the sensor when the activity pauses.
        super.onPause()
        sensorManager.unregisterListener(this)
    }
}

জাভা

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

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

        // Get an instance of the sensor service, and use that to get an instance of
        // a particular sensor.
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    }

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

    @Override
    public final void onSensorChanged(SensorEvent event) {
        float distance = event.values[0];
        // Do something with this sensor data.
    }

    @Override
    protected void onResume() {
        // Register a listener for the sensor.
        super.onResume();
        sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL);
      }

    @Override
    protected void onPause() {
        // Be sure to unregister the sensor when the activity pauses.
        super.onPause();
        sensorManager.unregisterListener(this);
    }
}

মনে রাখবেন: কিছু প্রক্সিমিটি সেন্সর বাইনারি ভ্যালু দেখায় যা "কাছে" বা "দূরে" বোঝায়। এই ক্ষেত্রে, সেন্সর সাধারণত দূরে থাকার সময় সর্বাধিক রেঞ্জ ভ্যালু এবং কাছে থাকার সময় কম ভ্যালু রিপোর্ট করে। সাধারণত, দূরের ভ্যালু হল > ৫ সেমি, তবে এটি সেন্সর থেকে সেন্সরে পরিবর্তিত হতে পারে। getMaximumRange() পদ্ধতি ব্যবহার করে আপনি কোনও সেন্সরের সর্বাধিক রেঞ্জ নির্ধারণ করতে পারবেন।

এছাড়াও আপনার পড়া উচিত