Android基于Google 地图 V2map开发基础


Android基于Google map V2地图开发基础

  

参考资料

  google map v2 api网址:

  google map v2 官方用例网址:

  基础开发环境配置网址:

  其他的参考资料网址:

知识整理

1.安装google setting 和 google store

  请确保你的手机上安装这2个软件

2.下载 Google play services

  打开Eclipse  Windows  Android SDK Manager,选择Extra选项下的Google play services,下载该选项。

  下载完成后该lib位置在

  android-sdk-windows\extras\google\google_play_services\libproject\google-play-services_lib

  为项目引用该lib,Eclipse  Android  Library ,选择add

3.SHA获取

  SHA网络上获取有几种方式,这边列出2种。

  (1)Keytool

  Keytool这个文件一般位于%JAVA_HOME%/bin目录下,如果是Linux系统,则位于

  $JAVA_HOME/bin下的,比如windows下在C:\programs\Java\jdk1.6.0_18\bin下。

  输入命令:

  Window系统:

  Keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore"

  -alias androiddebugkey -storepass android -keypass android

  linux or Mac OS系统:

  keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey

  -storepass android -keypass android

  (2)较为快捷的方式

  Eclipse  Android Build,SHA1 fingerprint的值

4.注册Google mail账号

  需要google mail的账号,当然如果你有,就可以直接跳过这步骤了。

5.Google map v2 key值获取

  终于快结束了环境配置了,Key值获取的网址如下:

  打开google map android api v2服务,接着选择API access,点击选择Create new Android key.....,在弹出框内,输入获取SHA,输入格式为SHA;你的项目包名(如果你换掉IDE(eclipse)或者换掉包名都需要重新申请——我没试过换掉eclipse是否要重新申请的情况)

代码片段:

1.AndroidMainfest.xml配置文件配置

  <manifest xmlns:android="" package="com.googlemap" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="9" /> <!--begin--> <permission android:name="com.googlemap.permission.MAPS_RECEIVE" android:protectionLevel="signature" />   <uses-permission android:name="com.map.permission.MAPS_RECEIVE" /> <!--end api可下载地图,注意com.googlemap替换为项目包名-----------------------> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--允许API可存取Google web-based 服务-->   <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <!--允许网络定位-->   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--允许GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!--Google Maps Android API 2会使用到OpenGL ES version 2,所以添加此特性,以免Google Play Store 认为APP不支持OpenGL ES version 2--> <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" > <!--注意com.googlemap替换为项目包名,android:value值更改为申请的KEY--> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your key" /> <activity android:name="com.googlemap.MainActivity2" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

2.Xml布局文件

  < xml version="1.0" encoding="utf-8" > <RelativeLayout xmlns:android="" xmlns:map="" android:layout_width="match_parent" android:layout_height="match_parent" > <!--sdk 3.1即(API12)之前的版本为com.google.android.gms.maps.SupportMapFragment,其他版本则为com.google.android.gms.maps.MapFragment--> <fragment android:id="@+id/googlemap" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> </RelativeLayout>

3.地图初始显示

  /**sdk 3.1即(API12)之前的版本需要继承FragmentActivity,其他版本则无需*/ public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.main); } }

4.定位

  定位自己当前的位置,使用到LocationManager类,代码如下:

  /**初始化GoogleMap*/ if (null == mGoogleMap) {//此处初始化方法为sdk3.1(API12)之前的版本 mGoogleMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.nav_testmap)).getMap(); } /**if (null == mGoogleMap) { mGoogleMap = ((MapFragment) this.findFragmentById(R.id.nav_testmap)).getMap(); }*/ /**定位自己当前位置*/ 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 = (LocationManager)getSystemService(LOCATION_SERVICE); //provider的Criteria.ACCURACY_FINE精确度不是最精确的 //若正式环境改为精确度最高的 //LocationManager.GPS_PROVIDER provider = locationManager.getBestProvider(criteria, true); locationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { //获取当前位置 lat = location.getLatitude(); lng = location.getLongitude(); } }; //返回缓存中的位置信息(上次获取的位置信息) location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER); location = locationManager.getLastKnownLocation(locationManager.NETWORK_PROVIDER); //注册周期性位置更新,第二个参数为最短更新时间,第三个参数为最短更新距离 locationManager.requestLocationUpdates(provider, 0, 0,locationListener); } //移除位置监听 locationManager.removeUpdates(locationListener);

5.标识

  标识位置,使用到的类Marker,代码如下:

  marker = mGoogleMap.addMarker(new MarkerOptions().position(new LatLng(lat, lng)).title("lat:" + lat + " lng:" + lng).snippet("我的位置"));

  你可以设置marker的icon图标

  // GREEN color icon marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); // Changing your own marker icon marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker_icon)));

6.镜头定位移动

  cameraPosition = new CameraPosition.Builder() .target(new LatLng(lat, lng)).zoom(17).bearing(0).tilt(20).build(); mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

7.路线绘制

  start = new LatLng(22.43040815, 114.20932812);    end = new LatLng(22.410410, 114.247622); //移除地图上的覆盖物   mGoogleMap.clear();   wayLine(start, end); /**路线绘制*/ private void wayLine(LatLng start, LatLng end) {    String url = navUtil.getDirectionsUrl(start, end);    NavUtil.googleMapRouteTask gRouteTask = navUtil.new googleMapRouteTask(    url);    gRouteTask.execute(url);   }    /**组合成googlemap direction所需要的url*/ public String getDirectionsUrl(LatLng origin, LatLng dest) { // Origin of route String str_origin = "origin=" + origin.latitude + "," + origin.longitude; // Destination of route String str_dest = "destination=" + dest.latitude + "," + dest.longitude; // Sensor enabled String sensor = "sensor=false"; // Travelling Mode String mode = "mode=driving"; // String waypointLatLng = "waypoints="+"40.036675"+","+"116.32885"; // 如果使用途径点,需要添加此字段 // String waypoints = "waypoints="; String parameters = null; // Building the parameters to the web service parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + mode; // parameters = str_origin + "&" + str_dest + "&" + sensor + "&" // + mode+"&"+waypoints; // Output format // String output = "json"; String output = "xml"; // Building the url to the web service String url = "" + output + " " + parameters; System.out.println("getDerectionsURL--->: " + url); return url; }    /**异步请求获取导航数据*/ public class googleMapRouteTask extends AsyncTask<String, Void, List<LatLng$amp;>amp;$gt; { HttpClient client; String url; List<LatLng> routes = null; public googleMapRouteTask(String url) { this.url = url; } @Override protected List<LatLng> doInBackground(String... params) { HttpGet get = new HttpGet(url); try { HttpResponse response = client.execute(get); int statusecode = response.getStatusLine().getStatusCode(); System.out.println("response:" + response + " statuscode:" + statusecode); if (statusecode == 200) { String responseString = EntityUtils.toString(response .getEntity()); int status = responseString.indexOf("<status>OK</status$amp;>quot;$); System.out.println("status:" + status); if (-1 != status) { int pos = responseString.indexOf("<overview_polyline$amp;>quot;$); pos = responseString.indexOf("<points$amp;>quot;$, pos + 1); int pos2 = responseString.indexOf("</points$amp;>quot;$, pos); responseString = responseString .substring(pos + 8, pos2); routes = decodePoly(responseString); } else { // 错误代码, return null; } } else { // 请求失败 return null; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("doInBackground:"+routes); return routes; } @Override protected void onPreExecute() { client = new DefaultHttpClient(); client.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 15000); client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 15000); super.onPreExecute(); } @Override protected void onPostExecute(List<LatLng> routes) { super.onPostExecute(routes); if (routes == null) { // 导航失败 Toast.makeText(context, "没有搜索到线路", Toast.LENGTH_LONG).show(); } else{ //地图描点 PolylineOptions lineOptions = new PolylineOptions(); lineOptions.addAll(routes); lineOptions.width(3); lineOptions.color(Color.BLUE); mGoogleMap.addPolyline(lineOptions); //定位到第0点经纬度 mGoogleMap.animateCamera(CameraUpdateFactory.newLatLng(routes.get(0))); } } } /**解析返回xml中overview_polyline的路线编码*/ 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) $amp; <amp> amp;$gt; 1) : (result $amp;>amp;$gt; 1)); lat += dlat; shift = 0; result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) $amp; </amp> <amp> amp;$gt; 1) : (result $amp;>amp;$gt; 1)); lng += dlng; LatLng p = new LatLng((((double) lat / 1E5)), (((double) lng / 1E5))); poly.add(p); } return poly; } </amp>

移动开发 Android 程序开发

幽灵体飞射导弹 12 years, 10 months ago

Your Answer