কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে শেক (Shake) ফিচার যোগ করে অ্যাপ রিফ্রেশ করা

এক্সিলারোমিটার সেন্সর ব্যবহার করে শেক জেসচার ডিটেকশন

এই টিউটোরিয়ালটি দেখাবে কীভাবে ডিভাইস শেক (হাতের থেকে ছুটানো) ডিটেক্ট করে অ্যাপ রিফ্রেশ বা অন্য কোনো অ্যাকশন ট্রিগার করা যায়।

পদক্ষেপ ১: প্রজেক্ট তৈরি করুন

Android Studio-তে নতুন প্রজেক্ট শুরু করুন।

পদক্ষেপ ২: লেআউট XML (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Shake your phone to refresh!"
        android:textSize="24sp"
        android:textStyle="bold" />

</LinearLayout>

পদক্ষেপ ৩: MainActivity.java - শেক ডিটেকশন লজিক

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor accelerometer;
    
    // শেক ডিটেকশন ভেরিয়েবলস
    private float lastX, lastY, lastZ;
    private long lastUpdateTime = 0;
    private static final int SHAKE_THRESHOLD = 800; // m/s^2 * 1000 (এমপি সি-তে)
    private static final int MIN_TIME_BETWEEN_SHAKES = 1000; // ms

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        
        if (accelerometer == null) {
            Toast.makeText(this, "Accelerometer not available", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (accelerometer != null) {
            sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
        }
    }

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

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return;

        long currentTime = System.currentTimeMillis();
        if (currentTime - lastUpdateTime < 100) return; // 10Hz লিমিট
        lastUpdateTime = currentTime;

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        float deltaX = x - lastX;
        float deltaY = y - lastY;
        float deltaZ = z - lastZ;
        
        lastX = x; lastY = y; lastZ = z;

        // ত্বরণের ম্যাগনিটিউড (গুরুত্বাকর্ষণ বাদ দিয়ে)
        double acceleration = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / SensorManager.GRAVITY_EARTH;
        
        if (acceleration > 2.0) { // 2g থ্রেশহোল্ড
            long now = System.currentTimeMillis();
            if (now - lastShakeTime > MIN_TIME_BETWEEN_SHAKES) {
                lastShakeTime = now;
                onShakeDetected();
            }
        }
    }

    private long lastShakeTime = 0;

    private void onShakeDetected() {
        runOnUiThread(() -> {
            Toast.makeText(this, "Shake detected! Refreshing...", Toast.LENGTH_SHORT).show();
            // এখানে আপনার রিফ্রেশ লজিক যোগ করুন
            // refreshData();
        });
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Not used
    }
}

মূল উদাহরণের সমস্যা ও উন্নতি

মূল উদাহরণে `mAccel` ক্যালকুলেশন কিছুটা জটিল এবং কম নির্ভরযোগ্য। উপরের সংশোধিত সংস্করণে:

  • স্পষ্ট থ্রেশহোল্ড (2g)
  • ডিবাউন্সিং (১ সেকেন্ড কুলডাউন)
  • SensorManager.SENSOR_DELAY_UI (ব্যাটারি বাঁচায়)
  • implements SensorEventListener (ক্লিনার কোড)

সেরা অনুশীলন

  • SENSOR_DELAY_UI ব্যবহার করুন (ব্যাটারি সাশ্রয়)
  • onPause-এ unregisterListener অবশ্যই কল করুন
  • শেক সেনসিটিভিটি ইউজারকে সেটিং-এ কনফিগার করার দিন
  • ফলস পজিটিভ এড়ান: গাড়ি চালান, দৌড়ানো সময় শেক ডিটেক্ট হতে পারে

লাইব্রেরি বিকল্প

  • ShakeDetector 라이브러리: গিটহাবে উপলব্ধ مرتب রেডি-মেড ক্লাস
  • Google Fit API: অ্যাক্টিভিটি রিকগনিশনের সাথে কম্বাইন করুন
  1. অ্যান্ড্রয়েড অ্যাপে ইউটিউব ভিডিও চালানোর পদ্ধতি

  2. Android PreferenceScreen-এ বাটন যোগ করার পদ্ধতি

  3. Android-এ প্রোগ্রামেটিক্যালি অ্যাপ্লিকেশন বন্ধ করা

  4. অ্যান্ড্রয়েডে Chrome-এর Pull-to-Refresh বন্ধ করুন: ধাপে ধাপে গাইড