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