একটি প্রদত্ত অক্ষাংশ এবং দ্রাঘিমাংশের জন্য একটি ঠিকানা পেতে, Geocoder.getFromLocation()কল করুন , যা ঠিকানার একটি তালিকা ফেরত দেয়। পদ্ধতিটি সিঙ্খ্রোনাস, এবং এর কাজ করতে দীর্ঘ সময় নিতে পারে, সুতরাং আপনাকে একটি AsyncTask এর doInBackground()পদ্ধতি থেকে পদ্ধতি কল করা উচিত।
যখন আপনার অ্যাপ ঠিকানাটি পাচ্ছে, একটি অনির্দিষ্ট একটিভিটি ইন্ডিকেটর প্রদর্শন করুন এটা দেখাতে যে আপনার অ্যাপ ব্যাকগ্রাউন্ডে কাজ করছে। অদৃশ্য রাখতে বা লেআউট হায়ারারকি থেকে অপসারণ করতে ইন্ডিকেটরের প্রাথমিক অবস্থা (স্টেট) android:visibility="gone"এ সেট করুন। যখন আপনি ঠিকানা অনুসন্ধান শুরু করবেন, আপনি এর দৃশ্যমানতাকে এ "visible"সেট করুন।
নিচের কোড চিত্রটি দেখায় কীভাবে একটি অনির্দিষ্ট ProgressBar আপনার লেআউট ফাইলে যোগ করতে হয়:
<ProgressBar
android:id="@+id/address_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:indeterminate="true"
android:visibility="gone" />
একটি ব্যাকগ্রাউন্ড কাজ (টাস্ক) তৈরী করার জন্য, AsyncTask এর একটি সাবক্লাস নির্ধারণ করুন যা getFromLocation()কল করে এবং একটি ঠিকানা পেরত আনে। ফিরতি ঠিকানা ধারন করতে একটি TextView অবজেক্ট mLocation নির্ধারণ করুন, এবং একটি ProgressBar অবজেক্ট যা অনির্দিষ্ট একটিভিটি ইন্ডিকেটর নিয়ন্ত্রণ করে। উদাহরণস্বরূপ:
public class MainActivity extends FragmentActivity {
...
private TextView mAddress;
private ProgressBar mActivityIndicator;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mAddress = (TextView) findViewById(R.id.address);
mActivityIndicator =
(ProgressBar) findViewById(R.id.address_progress);
}
...
/**
* A subclass of AsyncTask that calls getFromLocation() in the
* background. The class definition has these generic types:
* Location - A Location object containing
* the current location.
* Void - indicates that progress units are not used
* String - An address passed to onPostExecute()
*/
private class GetAddressTask extends
AsyncTask<Location, Void, String> {
Context mContext;
public GetAddressTask(Context context) {
super();
mContext = context;
}
...
/**
* Get a Geocoder instance, get the latitude and longitude
* look up the address, and return it
*
* @params params One or more Location objects
* @return A string containing the address of the current
* location, or an empty string if no address can be found,
* or an error message
*/
@Override
protected String doInBackground(Location... params) {
Geocoder geocoder =
new Geocoder(mContext, Locale.getDefault());
// Get the current location from the input parameter list
Location loc = params[0];
// Create a list to contain the result address
List<Address> addresses = null;
try {
/*
* Return 1 address.
*/
addresses = geocoder.getFromLocation(loc.getLatitude(),
loc.getLongitude(), 1);
} catch (IOException e1) {
Log.e("LocationSampleActivity",
"IO Exception in getFromLocation()");
e1.printStackTrace();
return ("IO Exception trying to get address");
} catch (IllegalArgumentException e2) {
// Error message to post in the log
String errorString = "Illegal arguments " +
Double.toString(loc.getLatitude()) +
" , " +
Double.toString(loc.getLongitude()) +
" passed to address service";
Log.e("LocationSampleActivity", errorString);
e2.printStackTrace();
return errorString;
}
// If the reverse geocode returned an address
if (addresses != null && addresses.size() > 0) {
// Get the first address
Address address = addresses.get(0);
/*
* Format the first line of address (if available),
* city, and country name.
*/
String addressText = String.format(
"%s, %s, %s",
// If there's a street address, add it
address.getMaxAddressLineIndex() > 0 ?
address.getAddressLine(0) : "",
// Locality is usually a city
address.getLocality(),
// The country of the address
address.getCountryName());
// Return the text
return addressText;
} else {
return "No address found";
}
}
...
}
...
}
পরবর্তী অধ্যায় দেখায় কীভাবে ইউজার ইন্টারফেসে ঠিকানাটি প্রদর্শন করতে হয়।