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

Android-এ নেটওয়ার্ক প্রোভাইডার থেকে নিকটবর্তী সিটি/সাব-অ্যাডমিন এরিয়া পাওয়ার উপায়

Geocoder.getSubAdminArea() ব্যবহার করে আপ-জেলা/উপজেলা/নিকটবর্তী সিটি বের করা

এই উদাহরণে নেটওয়ার্ক প্রোভাইডার থেকে লোকেশন নিয়ে Address.getSubAdminArea() মেথড দিয়ে প্রশাসনিক অঞ্চল (সাব-অ্যাডমিন এরিয়া - জেলা, উপজেলা, থানা বা নিকটবর্তী শহর) বের করা দেখানো হলো।

লেআউট (activity_main.xml)

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp"
        android:gravity="center" />

</LinearLayout>

MainActivity.java

package com.example.myapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    Location location;
    List<Address> addresses;
    Geocoder geocoder;

    @RequiresApi(api = Build.VERSION_CODES.P)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.text);

        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
            return;
        }

        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        geocoder = new Geocoder(this, Locale.getDefault());
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 101 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            fetchSubAdminArea();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onResume() {
        super.onResume();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            fetchSubAdminArea();
        }
    }

    private void fetchSubAdminArea() {
        if (location == null) {
            textView.setText("লোকেশন পাওয়া যায়নি");
            return;
        }

        try {
            addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 5);
            if (addresses != null && !addresses.isEmpty()) {
                StringBuilder sb = new StringBuilder("Sub-Admin Areas (Nearby Cities/Districts):\n\n");
                for (int i = 0; i < addresses.size(); i++) {
                    Address addr = addresses.get(i);
                    String subAdmin = addr.getSubAdminArea(); // জেলা/উপজেলা/থানা
                    String admin = addr.getAdminArea(); // রাজ্য/প্রদেশ
                    String locality = addr.getLocality(); // শহর
                    String addressLine = addr.getAddressLine(0);

                    sb.append(i + 1).append(". SubAdmin: ").append(subAdmin != null ? subAdmin : "N/A")
                      .append("\n   Admin: ").append(admin != null ? admin : "N/A")
                      .append("\n   Locality: ").append(locality != null ? locality : "N/A")
                      .append("\n   Full: ").append(addressLine).append("\n\n");
                }
                textView.setText(sb.toString());
            } else {
                textView.setText("এড্রেস পাওয়া যায়নি");
            }
        } catch (IOException e) {
            e.printStackTrace();
            textView.setText("ত্রুটি: " + e.getMessage());
        }
    }
}

প্রশাসনিক লেভেল হায়ারার্কি (Address অবজেক্টে)

Country (getCountryName)          // Bangladesh
  └─ Admin Area (getAdminArea)     // Dhaka Division
      └─ Sub-Admin Area (getSubAdminArea) // Dhaka District / Upazila
          └─ Locality (getLocality)       // Dhaka City / Savar
              └─ Sub-Locality (getSubLocality) // Dhanmondi, Gulshan
                  └─ Thoroughfare (getThoroughfare) // Road name
                      └─ Sub-Thoroughfare (getSubThoroughfare) // House number
                          └─ Feature Name (getFeatureName) // Landmark

বাংলাদেশ প্রসঙ্গে SubAdminArea

  • জেলা (District): Dhaka, Chittagong, Sylhet ইত্যাদি
  • উপজেলা/থানা (Upazila/Thana): Dhanmondi, Gulshan, Kotwali
  • সিটি কর্পোরেশন/পৌরসভা: Dhaka North, Dhaka South, Chattogram City Corporation
  • Geocoder ডেটা কোয়ালিটি ভিন্ন হতে পারে (Google vs OpenStreetMap)

সর্বোত্তম অভ্যাস

  • মাল্টিপল রেজাল্ট (getFromLocation(..., 5)) নিয়ে সবচেয়ে রিলেভেন্টটি বেছে নিন
  • null চেক অবশ্যই করুন - সব ফিল্ড সব সময় পাওয়া যায় না
  • বাংলা ভাষার জন্য new Geocoder(this, new Locale("bn", "BD")) ব্যবহার করুন
  • ক্যাশ করুন - একই লোকেশনের জন্য বারবার নেটওয়ার্ক কল এড়ান

Manifest

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

Android-এ নেটওয়ার্ক প্রোভাইডার থেকে নিকটবর্তী সিটি/সাব-অ্যাডমিন এরিয়া পাওয়ার উপায়

  1. অ্যান্ড্রয়েডে মোবাইল SMS সাপোর্ট করে কিনা জানা

  2. অ্যান্ড্রয়েডে ডিভাইস আইডি কীভাবে পেতে হয়?

  3. অ্যান্ড্রয়েডে সিম সার্ভিস ইনফরমেশন (Service State) কীভাবে পেতে হয়?

  4. অ্যান্ড্রয়েডে কন্টেন্ট প্রোভাইডার থেকে ফোন নম্বর পাওয়ার পদ্ধতি