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" />
