注意新建项目之前需要安装
google play services
然后导入
通过上图方法导入sdk包下面的一个包:
adt-bundle-windows-x86sdkextrasgooglegoogle_play_serviceslibprojectgoogle-play-services_lib
1 AndroidManifest.xml 2 3 <?xml version="1.0" encoding="utf-8"?> 4 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 5 package="com.example.v2_test" 6 android:versionCode="1" 7 android:versionName="1.0" > 8 9 <uses-sdk 10 android:minSdkVersion="8" 11 android:targetSdkVersion="17" /> 12 13 <permission 14 android:name="com.example.v2_test.permission.MAPS_RECEIVE" 15 android:protectionLevel="signature" /> 16 17 <uses-permission android:name="android.permission.INTERNET" /> 18 <uses-permission android:name="com.example.v2_test.permission.MAPS_RECEIVE" /> 19 20 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 21 <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 22 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 23 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 24 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> 25 26 27 28 29 <uses-feature 30 android:glEsVersion="0x00020000" 31 android:required="true" /> 32 33 <application 34 android:allowBackup="true" 35 android:icon="@drawable/ic_launcher" 36 android:label="@string/app_name" 37 android:theme="@style/AppTheme" > 38 <activity 39 android:name="com.example.v2_test.MainActivity" 40 android:label="@string/app_name" > 41 <intent-filter> 42 <action android:name="android.intent.action.MAIN" /> 43 44 <category android:name="android.intent.category.LAUNCHER" /> 45 </intent-filter> 46 </activity> 47 48 <meta-data 49 android:name="com.google.android.maps.v2.API_KEY" 50 android:value="AIzaSyDmrnUUl_zWzgimKKeR5t3ZiinvouSWO8E" /> 51 </application> 52 53 </manifest>
1 布局文件 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:map="http://schemas.android.com/apk/res-auto" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 > 7 8 <fragment 9 android:id="@+id/map" 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 class="com.google.android.gms.maps.SupportMapFragment" /> 13 <ImageButton 14 android:id="@+id/local" 15 android:background="@null" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:layout_marginTop="10dp" 19 android:layout_alignParentRight="true" 20 android:layout_marginRight="10dp" 21 /> 22 23 </RelativeLayout>
菜单弹出框布局文件 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="起始位置:" android:textColor="@android:color/white" android:textSize="18dp"> </TextView> <EditText android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:text="我的位置" > </EditText> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:textSize="18dp" android:text="目的地:" > </TextView> <EditText android:id="@+id/end" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:text="" > </EditText> </TableLayout>
以上是核心配置文件与布局文件,下面是Activity中的实现代码,具体的请参考google 的官方demo
package com.example.v2_test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.Polyline; import com.google.android.gms.maps.model.PolylineOptions; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.graphics.Color; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; public class MainActivity extends FragmentActivity { List<LatLng> list; Polyline polyline; private Location location; private CameraPosition cameraPosition; private GoogleMap map; String start = ""; String end = ""; double lat = 0.0; double lng = 0.0; double endlat = 0.0; double endlng = 0.0; LocationManager locationManager; ImageButton local; LocationListener llistener; Marker marker; private ProgressDialog progressdialog; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: progressdialog.dismiss(); if(polyline!=null){ polyline.remove(); map.clear(); markMysition(); } map.addMarker(new MarkerOptions().position( new LatLng(endlat, endlng)).title( MainActivity.this.getLocation(endlat, endlng))); LatLng last = null; for (int i = 0; i < list.size() - 1; i++) { LatLng src = list.get(i); LatLng dest = list.get(i + 1); last = dest; polyline = map.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(4).color(Color.GREEN)); } break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); local = (ImageButton) findViewById(R.id.local); local.setImageResource(R.drawable.ww); // 点击按钮视图回到我的位置 local.setOnClickListener(new android.view.View.OnClickListener() { @Override public void onClick(View v) { MainActivity.this.setCameraPosition(); } }); map = ((SupportMapFragment) (this.getSupportFragmentManager() .findFragmentById(R.id.map))).getMap(); this.getPointLocation(); MainActivity.this.setCameraPosition(); } // 标记我的位置 void markMysition() { marker=map.addMarker(new MarkerOptions().position(new LatLng(lat, lng)).title( this.getLocation(lat, lng)).snippet("我的位置")); } // 获取我的位置 private void getPointLocation() { Criteria criteria = new Criteria(); // ACCURACY_FINE 较高精确度 criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); String provider = locationManager.getBestProvider(criteria, true); Log.d("provider", provider); llistener = new LocationListener() { @Override public void onLocationChanged(Location location) { /*if(marker!=null){ marker.remove(); } */ lat = location.getLatitude(); lng = location.getLongitude(); // MainActivity.this.markMysition(); } @Override public void onProviderDisabled(String provider) { Log.i("onProviderDisabled", "come in"); } @Override public void onProviderEnabled(String provider) { Log.i("onProviderEnabled", "come in"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } }; location = locationManager .getLastKnownLocation(locationManager.GPS_PROVIDER); locationManager.requestLocationUpdates(provider, 3000, (float) 10.0, llistener); updateLocation(); MainActivity.this.markMysition(); MainActivity.this.setCameraPosition(); } // 位置更新 private void updateLocation() { if (location != null) { lat = location.getLatitude(); lng = location.getLongitude(); } } // 将视图镜头定位在我的位置 public void setCameraPosition() { // 获取视图镜头 cameraPosition = new CameraPosition.Builder() .target(new LatLng(lat, lng)) // Sets the center of the map to .zoom(17) // 缩放比例 .bearing(0) // Sets the orientation of the camera to east .tilt(20) // Sets the tilt of the camera to 30 degrees .build(); // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); } // 菜单 public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, Menu.FIRST + 1, 1, "获取路线"); menu.add(0, Menu.FIRST + 2, 2, "退出"); return true; } // 菜单响应 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: // 定义输入框界面 editpoint(); break; case Menu.FIRST + 2: locationManager.removeUpdates(llistener); this.finish(); } return true; } // 获取物理位置 private String getLocation(double lat, double lng) { String address = ""; String resultString = ""; String urlString = String .format("http://maps.google.com/maps/api/geocode/json?latlng=" + lat + "," + lng + "&sensor=true&language=zh-CN"); Log.i("URL", urlString); HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(urlString); try { HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); BufferedReader buffReader = new BufferedReader( new InputStreamReader(entity.getContent())); StringBuffer strBuff = new StringBuffer(); String result = null; while ((result = buffReader.readLine()) != null) { strBuff.append(result); } resultString = strBuff.toString(); // 解析josn数据,获得物理地址 if (resultString != null && resultString.length() > 0) { JSONObject jsonobject = new JSONObject(resultString); JSONArray jsonArray = new JSONArray(jsonobject.get("results") .toString()); resultString = ""; for (int i = 0; i < jsonArray.length(); i++) { resultString = jsonArray.getJSONObject(i).getString( "formatted_address"); address += resultString; } } } catch (Exception e) { } finally { get.abort(); client = null; } return address; } // 通过输入信息解析json获取路线 private void getDirection(String start, String endposition) { String DresultString = ""; String Durl = "http://maps.google.com/maps/api/directions/json?origin=" + lat + "," + lng + "&destination=" + endlat + "," + endlng + "&sensor=true&mode=driving"; HttpClient Dclient = new DefaultHttpClient(); HttpGet Dget = new HttpGet(Durl); HttpResponse response; try { response = Dclient.execute(Dget); HttpEntity Dentity = response.getEntity(); BufferedReader DbuffReader = new BufferedReader( new InputStreamReader(Dentity.getContent())); StringBuffer DstrBuff = new StringBuffer(); String Dresult = null; while ((Dresult = DbuffReader.readLine()) != null) { DstrBuff.append(Dresult); } DresultString = DstrBuff.toString(); } catch (Exception e) { } try { final JSONObject jsonObject = new JSONObject(DresultString); JSONArray routeArray = jsonObject.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject overviewPolylines = routes .getJSONObject("overview_polyline"); String encodedString = overviewPolylines.getString("points"); Log.d("test: ", encodedString); list = decodePoly(encodedString); } catch (JSONException e) { e.printStackTrace(); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } } // 填写起始地点以得到路线导航 private void editpoint() { LayoutInflater factory = LayoutInflater.from(MainActivity.this); // 获得自定义对话框 final View view = factory.inflate(R.layout.getdirections, null); AlertDialog navigate = new AlertDialog.Builder(MainActivity.this) .setIcon(android.R.drawable.ic_menu_edit).setTitle("获取路线") .setView(view).setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); EditText st = (EditText) view.findViewById(R.id.start); EditText en = (EditText) view.findViewById(R.id.end); start = st.getText().toString(); end = en.getText().toString(); progressdialog = ProgressDialog.show(MainActivity.this, "正在获取路线", "请稍等……", true); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub getlatlng(end); getDirection("我的位置", end); mHandler.sendEmptyMessage(0); mHandler.sendEmptyMessage(1); } }).start(); } }).setNegativeButton("取消", null).create(); navigate.show(); } // 根据地理名称获得起始点和终点的经纬度 private void getlatlng(String end) { StringBuilder stringBuilder = new StringBuilder(); try { HttpPost httppost = new HttpPost( "http://maps.google.com/maps/api/geocode/json?address=" + end + "&sensor=false"); HttpClient client = new DefaultHttpClient(); HttpResponse response; stringBuilder = new StringBuilder(); response = client.execute(httppost); HttpEntity entity = response.getEntity(); InputStream stream = entity.getContent(); int b; while ((b = stream.read()) != -1) { stringBuilder.append((char) b); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } JSONObject jsonObject = new JSONObject(); try { jsonObject = new JSONObject(stringBuilder.toString()); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { endlng = ((JSONArray) jsonObject.get("results")).getJSONObject(0) .getJSONObject("geometry").getJSONObject("location") .getDouble("lng"); endlat = ((JSONArray) jsonObject.get("results")).getJSONObject(0) .getJSONObject("geometry").getJSONObject("location") .getDouble("lat"); } catch (Exception e) { e.printStackTrace(); } } // 解析json文件里面的polyline下的poly得出导航上面路径的点 private List<LatLng> decodePoly(String encoded) { List<LatLng> poly = new ArrayList<LatLng>(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; LatLng p = new LatLng((lat / 1E5), lng / 1E5); poly.add(p); } return poly; } }
欢迎访问:http://www.cnblogs.com/wangmars/ 这里有您而精彩
此文来自百度文库.....