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

Android-এ নেটওয়ার্ক প্রোভাইডার থেকে রাস্তা/ফিচার নাম (Street/Feature Name) পাওয়ার উপায়

Geocoder ব্যবহার করে রাস্তার নাম / ফিচার নাম বের করা

এই উদাহরণে Geocoder.getFromLocation() দিয়ে লোকেশন থেকে Address অবজেক্ট পাওয়া এবং getFeatureName() মেথড দিয়ে রাস্তা, বিল্ডিং, ল্যান্ডমার্ক বা পয়েন্ট অফ ইন্টারেস্টের নাম বের করা দেখানো হলো।

লেআউট (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) {
            fetchFeatureName();
        }
    }

    @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) {
            fetchFeatureName();
        }
    }

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

        try {
            addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 5); // টপ ৫ রেজাল্ট
            if (addresses != null && !addresses.isEmpty()) {
                StringBuilder sb = new StringBuilder("Feature Names:\n\n");
                for (int i = 0; i < addresses.size(); i++) {
                    Address addr = addresses.get(i);
                    String feature = addr.getFeatureName(); // রাস্তা/বিল্ডিং/ল্যান্ডমার্ক
                    String addressLine = addr.getAddressLine(0); // পূর্ণ ঠিকানা
                    sb.append(i + 1).append(". Feature: ").append(feature != null ? feature : "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.getFeatureName() vs অন্যান্য মেথড

মেথডরিটার্নউদাহরণ
getFeatureName()ল্যান্ডমার্ক/বিল্ডিং/রাস্তা নাম"Shahbag Intersection", "Dhaka University", "Gulshan Avenue"
getThoroughfare()রাস্তার নাম"Mirpur Road", "Kazi Nazrul Islam Avenue"
getSubThoroughfare()বিল্ডিং নম্বর/হাউজ নম্বর"12A", "House 45"
getPremises()বিল্ডিং/প্রেমিসেস নাম"Bashundhara City Mall"
getSubLocality()নেইব্রাহুড/এরিয়া"Dhanmondi", "Gulshan-1"

নেটওয়ার্ক প্রোভাইডারের সীমাবদ্ধতা

  • সেল টাওয়ার ট্রায়্যাঙ্গুলেশন ব্যবহার করে (accuracy ~500m-2km)
  • গ্রামীণ এলাকায় ফিচার নাম নাও দিতে পারে
  • GPS_PROVIDER বা FUSED_PROVIDER দিয়ে ভালো রেজাল্ট পাওয়া যায়
  • Geocoder ব্যাকএন্ড সার্ভিসে নির্ভর করে (Google Play Services / ওপেন স্ট্রিট ম্যাপ)

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-এ নেটওয়ার্ক প্রোভাইডার থেকে রাস্তা/ফিচার নাম (Street/Feature Name) পাওয়ার উপায়

  1. অ্যান্ড্রয়েডে ডিভাইস লোকেশন (সেল লোকেশন) পাওয়া

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

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

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