안드로이드 맵에 검색창 띄워서 검색하기
Android Geocoding – Showing User Input Location on Google Map Android API V2
In this article, we will create an Android application which facilitates users to input street address in an EditText and on clicking the find button, application draws corresponding location marker on the Google Map Android API v2 using Google’s Geocoder API.
This application is an upgraded version of the application discussed in the article titled “Android Geocoding – Showing User Input Location on Google Map” where the location is shown in Google Map Android API v1.
This application is developed in Eclipse 4.2.1 with ADT plugin ( 21.0.0 ) and Android SDK ( 21.0.0 ) and is tested in a real Android Phone with Android 2.3.6 ( GingerBread ).
1. Download and configure Google Play Services Library in Eclipse
Please follow the given below link to setup Google Play Service library in Eclipse.
http://developer.android.com/google/play-services/setup.html
2. Create a new Android Application Project namely “LocationGeocodingV2″
3. Configure Android Application Project
4. Design Application Launcher Icon
5. Create a blank activity
6. Enter Main Activity Details
7. Link to Google Play Service Library
8. Get the API key for Google Maps Android API v2
We need to get an API key from Google to use Google Maps in Android application. Please follow the given below link to get the API key for Google Maps Android API v2.
https://developers.google.com/maps/documentation/android/start
9. Add Android Support library to this project
By default, Android support library (android-support-v4.jar ) is added to this project by Eclipse IDE to the directory libs. If it is not added, we can do it manually by doing the following steps :
- Open Project Explorer by Clicking “Window -> Show View -> Project Explorer”
- Right click this project
- Then from popup window, Click “Android Tools -> Add Support Library “
10. Update the file AndroidManfiest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <? xml version = "1.0" encoding = "utf-8" ?> package = "in.wptrafficanalyzer.locationgeocodingv2" android:versionCode = "1" android:versionName = "1.0" > < uses-sdk android:minSdkVersion = "8" android:targetSdkVersion = "16" /> < permission android:name = "in.wptrafficanalyzer.locationgeocodingv2.permission.MAPS_RECEIVE" android:protectionLevel = "signature" /> < uses-permission android:name = "in.wptrafficanalyzer.locationgeocodingv2.permission.MAPS_RECEIVE" /> < uses-permission android:name = "android.permission.INTERNET" /> < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" /> < uses-permission android:name = "com.google.android.providers.gsf.permission.READ_GSERVICES" /> < uses-permission android:name = "android.permission.ACCESS_COARSE_LOCATION" /> < uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" /> < uses-feature android:glEsVersion = "0x00020000" android:required = "true" /> < application android:allowBackup = "true" android:icon = "@drawable/ic_launcher" android:label = "@string/app_name" android:theme = "@style/AppTheme" > < activity android:name = "in.wptrafficanalyzer.locationgeocodingv2.MainActivity" android:label = "@string/app_name" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > < meta-data android:name = "com.google.android.maps.v2.API_KEY" android:value = "YOUR_API_KEY" /> </ application > </ manifest > |
11. Update the layout file res/layout/activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" tools:context = ".MainActivity" > < RelativeLayout android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:orientation = "horizontal" > < Button android:id = "@+id/btn_find" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/str_btn_find" android:layout_alignParentRight = "true" /> < EditText android:id = "@+id/et_location" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:inputType = "text" android:hint = "@string/hnt_et_location" android:layout_toLeftOf = "@id/btn_find" /> </ RelativeLayout > android:id = "@+id/map" android:layout_width = "match_parent" android:layout_height = "match_parent" class = "com.google.android.gms.maps.SupportMapFragment" /> </ LinearLayout > |
12. Update the file res/values/strings.xml
1 2 3 4 5 6 7 8 | <? xml version = "1.0" encoding = "utf-8" ?> < resources > < string name = "app_name" >LocationGeocodingV2</ string > < string name = "hello_world" >Hello world!</ string > < string name = "menu_settings" >Settings</ string > < string name = "str_btn_find" >Find</ string > < string name = "hnt_et_location" >Enter location</ string > </ resources > |
13. Update the file src/in/wptrafficanalyzer/locationgeocodingv2/MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | package in.wptrafficanalyzer.locationgeocodingv2; import java.io.IOException; import java.util.List; import android.location.Address; import android.location.Geocoder; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends FragmentActivity { GoogleMap googleMap; MarkerOptions markerOptions; LatLng latLng; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); // Getting a reference to the map googleMap = supportMapFragment.getMap(); // Getting reference to btn_find of the layout activity_main Button btn_find = (Button) findViewById(R.id.btn_find); // Defining button click event listener for the find button OnClickListener findClickListener = new OnClickListener() { @Override public void onClick(View v) { // Getting reference to EditText to get the user input location EditText etLocation = (EditText) findViewById(R.id.et_location); // Getting user input location String location = etLocation.getText().toString(); if (location!= null && !location.equals( "" )){ new GeocoderTask().execute(location); } } }; // Setting button click event listener for the find button btn_find.setOnClickListener(findClickListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true ; } // An AsyncTask class for accessing the GeoCoding Web Service private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{ @Override protected List<Address> doInBackground(String... locationName) { // Creating an instance of Geocoder class Geocoder geocoder = new Geocoder(getBaseContext()); List<Address> addresses = null ; try { // Getting a maximum of 3 Address that matches the input text addresses = geocoder.getFromLocationName(locationName[ 0 ], 3 ); } catch (IOException e) { e.printStackTrace(); } return addresses; } @Override protected void onPostExecute(List<Address> addresses) { if (addresses== null || addresses.size()== 0 ){ Toast.makeText(getBaseContext(), "No Location found" , Toast.LENGTH_SHORT).show(); } // Clears all the existing markers on the map googleMap.clear(); // Adding Markers on Google Map for each matching address for ( int i= 0 ;i<addresses.size();i++){ Address address = (Address) addresses.get(i); // Creating an instance of GeoPoint, to display in Google Map latLng = new LatLng(address.getLatitude(), address.getLongitude()); String addressText = String.format( "%s, %s" , address.getMaxAddressLineIndex() > 0 ? address.getAddressLine( 0 ) : "" , address.getCountryName()); markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title(addressText); googleMap.addMarker(markerOptions); // Locate the first location if (i== 0 ) googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); } } } } |
14. Screenshot of the application in execution
15. Download Source Code
'Programming > Android' 카테고리의 다른 글
Android 2014-03-01 GoogleMap V2 띄우기 (0) | 2014.03.01 |
---|---|
Android 반짝이는 화면 (0) | 2014.02.22 |
viewpagertest (0) | 2014.01.14 |
Android FrameLayout 예제 (0) | 2014.01.12 |
안드로이드 위치 기록, 위치 추적 (0) | 2014.01.12 |