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

Android-এ Location API ব্যবহার করে বর্তমান লোকেশন ট্র্যাক করা

Android-এ Location API ব্যবহার করে বর্তমান লোকেশন ট্র্যাক করার পদ্ধতি

এই উদাহরণটি দেখায় কিভাবে Google Maps SDK এবং FusedLocationProviderClient ব্যবহার করে ব্যবহারকারীর বর্তমান অবস্থান (ল্যাটিটিউড/লองিটিউড) পেতে হয় এবং মানচিত্রে দেখাতে হয়।

⚠️ গুরুত্বপূর্ণ পরিবর্তন (2024+): Google Play Services Location API-এর পুরানো FusedLocationApi ডিপ্রিকেট করা হয়েছে। আধুনিক অ্যাপের জন্য FusedLocationProviderClient (play-services-location) এবং Google Maps SDK (play-services-maps) আলাদা লাইব্রেরি। এই টিউটোরিয়ালে Maps SDK-র সাথে বেসিক লোকেশন দেখানো হয়েছে। রিয়েল-টাইম লোকেশন আপডেটের জন্য FusedLocationProviderClient ব্যবহার করুন।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন এবং ডিপেন্ডেন্সি যোগ করুন

build.gradle (Module: app) ফাইলে:

dependencies {
    // Google Maps SDK
    implementation 'com.google.android.gms:play-services-maps:18.2.0'

    // Location Services (রিয়েল-টাইম লোকেশন আপডেটের জন্য)
    implementation 'com.google.android.gms:play-services-location:21.0.1'
}

ধাপ ২: Google Maps API Key পান

  1. Google Cloud Console-এ যান
  2. নতুন প্রজেক্ট তৈরি করুন বা বিদ্যমান প্রজেক্ট সিলেক্ট করুন
  3. APIs & Services → Library-এ যান
  4. Maps SDK for Android এবং Places API (ঐচ্ছিক) Enable করুন
  5. Credentials → Create Credentials → API Key
  6. API Key-র সীমাবদ্ধতা সেট করুন (Android apps, SHA-1 fingerprint, package name)

ধাপ ৩: লেআউট ফাইল (res/layout/activity_maps.xml)

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity" />

ধাপ ৪: MapsActivity.java বাস্তবায়ন করুন

import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnSuccessListener;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private FusedLocationProviderClient fusedLocationClient;
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1001;

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

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        mMap = googleMap;

        // মানচিত্র সেটিংস
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);

        // লোকেশন পারমিশন চেক করুন
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            enableMyLocation();
        } else {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
        }
    }

    private void enableMyLocation() {
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        mMap.setMyLocationEnabled(true);

        // বর্তমান লোকেশন পান (One-shot)
        fusedLocationClient.getLastLocation()
                .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        if (location != null) {
                            LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
                            addMarkerAndMoveCamera(currentLatLng, "আপনার বর্তমান অবস্থান");
                        } else {
                            // লোকেশন নাল হলে (GPS বন্ধ থাকলে) ডিফল্ট লোকেশন দেখান
                            LatLng defaultLocation = new LatLng(23.8103, 90.4125); // ঢাকা, বাংলাদেশ
                            addMarkerAndMoveCamera(defaultLocation, "ডিফল্ট অবস্থান (ঢাকা)");
                            Toast.makeText(MapsActivity.this, "GPS অনলাইন করুন যাতে সঠিক লোকেশন পাওয়া যায়", Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }

    private void addMarkerAndMoveCamera(LatLng latLng, String title) {
        mMap.addMarker(new MarkerOptions().position(latLng).title(title));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f));
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                enableMyLocation();
            } else {
                Toast.makeText(this, "লোকেশন পারমিশন দরকার", Toast.LENGTH_LONG).show();
            }
        }
    }
}

ধাপ ৫: Strings.xml-এ API Key যোগ করুন (res/values/strings.xml)

<resources>
    <string name="app_name">Location Demo</string>
    <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_API_KEY_HERE</string>
</resources>
⚠️ নিরাপত্তা: রিয়েল API Key কখনো GitHub বা পাবলিক রিপোতে কমিট করবেন না। local.properties-এ MAPS_API_KEY=your_key রাখুন এবং Gradle-এ buildConfigField বা manifestPlaceholders ব্যবহার করুন।

ধাপ ৬: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <!-- লোকেশন পারমিশন -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- Android 10+ ব্যাকগ্রাউন্ড লোকেশনের জন্য -->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- Google Maps API Key -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".MapsActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

রিয়েল-টাইম লোকেশন আপডেট (Location Callback)

শুধু একবার না, নিয়মিত লোকেশন আপডেট পেতে:

private LocationCallback locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(@NonNull LocationResult locationResult) {
        for (Location location : locationResult.getLocations()) {
            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            // মার্কার আপডেট করুন
            if (currentMarker != null) currentMarker.remove();
            currentMarker = mMap.addMarker(new MarkerOptions().position(latLng).title("বর্তমান অবস্থান"));
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f));
        }
    }
};

// লোকেশন রিকোয়েস্ট কনফিগারেশন
LocationRequest locationRequest = LocationRequest.create()
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
        .setInterval(5000) // ৫ সেকেন্ড ইন্টারভাল
        .setFastestInterval(2000) // ২ সেকেন্ড ফাস্টেস্ট
        .setSmallestDisplacement(10); // ১০ মিটার সরলে আপডেট

// শুরু করুন
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());

// বন্ধ করুন (onDestroy-এ)
fusedLocationClient.removeLocationUpdates(locationCallback);

Location Permission Best Practices

  • ACCESS_FINE_LOCATION: GPS-স্তরের নির্ভুলতা (~10 মিটার)। নেভিগেশন, ফিটনেস অ্যাপের জন্য।
  • ACCESS_COARSE_LOCATION: ওয়ার্কফাই/সেল টাওয়ার-ভিত্তিক (~100-1000 মিটার)। হাওয়ার προβেশন, এলাকা-ভিত্তিক সার্ভিসের জন্য।
  • ACCESS_BACKGROUND_LOCATION: Android 10+ এ ব্যাকগ্রাউন্ডে লোকেশন পেতে আলাদা পারমিশন এবং Play Store-अনুমোদন দরকার।
  • পারমিশন রেশনেল দেখান (shouldShowRequestPermissionRationale) কারণ ব্যবহারকারী কেন দেবে তা বুঝতে পারেন।

অ্যাপ্লিকেশন চালানোর পদ্ধতি

  1. আপনার ডিভাইসে GPS অনলাইন করুন
  2. Android Studio-তে Run আইকনে ক্লিক করুন
  3. পারমিশন ডায়ালগে "Allow" চাপুন
  4. মানচিত্রে আপনার বর্তমান অবস্থান মার্কার সহ দেখাবে

Android-এ Location API ব্যবহার করে বর্তমান লোকেশন ট্র্যাক করা

  1. আপনার অ্যান্ড্রয়েড লোকেশন সেটিংস পরিচালনার পূর্ণাঙ্গ গাইড

  2. অ্যান্ড্রয়েড ফোনকে ওয়েবক্যাম হিসেবে ব্যবহার করার পদ্ধতি

  3. "Find My" ব্যবহার করে iPhone রক্ষা ও ট্র্যাক করার পদ্ধতি

  4. 如何伪造您的Android位置