The Geocoder query methods will return an empty list if there no backend service in the platform. Use the isPresent() method to determine whether a Geocoder implementation exists.
The method getFromLocationName() returns an array of Addresses that are known to describe the named location.
example:
(Please note that the retrieving of Address Line is in-correct in this code; refer to the next post for how to Get full address from result of getFromLocationName().)
package com.AndroidgetFromLocationName;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class AndroidgetFromLocationNameActivity extends Activity {
EditText searchText;
Button searchButton;
TextView listResult;
Geocoder myGeocoder;
final static int MAX_RESULT = 5;
//final static String DEFAULT_SEARCH = "1600 Amphitheatre Parkway Mountain View";
//final static String DEFAULT_SEARCH = "Times Square";
final static String DEFAULT_SEARCH = "蘋果";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
searchText = (EditText)findViewById(R.id.searchtext);
searchText.setText(DEFAULT_SEARCH);
searchButton = (Button)findViewById(R.id.searchbutton);
listResult = (TextView)findViewById(R.id.result);
searchButton.setOnClickListener(searchButtonOnClickListener);
myGeocoder = new Geocoder(this);
//for API Level 9 or higher
if (!Geocoder.isPresent()){
Toast.makeText(AndroidgetFromLocationNameActivity.this,
"Sorry! Geocoder service not Present.",
Toast.LENGTH_LONG).show();
}
}
Button.OnClickListener searchButtonOnClickListener
= new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String searchString = searchText.getText().toString();
searchFromLocationName(searchString);
}};
private void searchFromLocationName(String name){
try {
List<Address> result
= myGeocoder.getFromLocationName(name, MAX_RESULT);
if ((result == null)||(result.isEmpty())){
Toast.makeText(AndroidgetFromLocationNameActivity.this,
"No matches were found or there is no backend service!",
Toast.LENGTH_LONG).show();
}else{
String stringResult = "";
for (int i =0; i < result.size(); i++){
stringResult += "i: " + i + "\n"
+ result.get(i).getAddressLine(i) + "\n"
+ "lat: " + result.get(i).getLatitude() + "\n"
+ "lon: " + result.get(i).getLongitude() + "\n";
}
listResult.setText(stringResult);
Toast.makeText(AndroidgetFromLocationNameActivity.this,
"Finished!",
Toast.LENGTH_LONG).show();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(AndroidgetFromLocationNameActivity.this,
"The network is unavailable or any other I/O problem occurs!",
Toast.LENGTH_LONG).show();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<EditText
android:id="@+id/searchtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/searchbutton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Search"
/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</ScrollView>
</LinearLayout>
Loved it. I've been searching for this from last 2 days. Thanks to you & your post....
ReplyDelete.net obfuscator
Please note that the retrieving of Address Line is in-correct in this code; refer to the next post for how to Get full address from result of getFromLocationName().
ReplyDeletevery nice... Thanks for your effort....
ReplyDeleteThis is working on Emulator ?
ReplyDeleteI test it on real device. I think it can work on emulator too.
Delete